summaryrefslogtreecommitdiff
path: root/src/include/utils
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>1999-11-17 21:21:51 +0000
committerJan Wieck <JanWieck@Yahoo.com>1999-11-17 21:21:51 +0000
commit79c3b71c1be3a79ec2d1f4d64bdef13f0e0a086a (patch)
treed0bdc22ff0f14c29631a3614b933e761feebf3c2 /src/include/utils
parentddc335290cb0bd09b3529cb032cfabf85029201b (diff)
The new LZ compression and an lztext data type based on it.
Jan
Diffstat (limited to 'src/include/utils')
-rw-r--r--src/include/utils/builtins.h11
-rw-r--r--src/include/utils/lztext.h22
-rw-r--r--src/include/utils/pg_lzcompress.h125
3 files changed, 157 insertions, 1 deletions
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index fe6fd117187..1bf3273ca13 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: builtins.h,v 1.89 1999/10/11 06:28:28 inoue Exp $
+ * $Id: builtins.h,v 1.90 1999/11/17 21:21:51 wieck Exp $
*
* NOTES
* This should normally only be included by fmgr.h.
@@ -30,6 +30,7 @@
#include "utils/int8.h"
#include "utils/nabstime.h"
#include "utils/numeric.h"
+#include "utils/lztext.h"
#include "access/heapam.h" /* for HeapTuple */
/*
@@ -627,4 +628,12 @@ HeapTuple RI_FKey_setnull_upd(FmgrInfo *proinfo);
HeapTuple RI_FKey_setdefault_del(FmgrInfo *proinfo);
HeapTuple RI_FKey_setdefault_upd(FmgrInfo *proinfo);
+/* lztext.c */
+lztext *lztextin(char *str);
+char *lztextout(lztext *lz);
+text *lztext_text(lztext *lz);
+lztext *text_lztext(text *txt);
+int32 lztextlen(lztext *lz);
+int32 lztextoctetlen(lztext *lz);
+
#endif /* BUILTINS_H */
diff --git a/src/include/utils/lztext.h b/src/include/utils/lztext.h
new file mode 100644
index 00000000000..c83280661c7
--- /dev/null
+++ b/src/include/utils/lztext.h
@@ -0,0 +1,22 @@
+/* ----------
+ * lztext.h
+ *
+ * $Header: /cvsroot/pgsql/src/include/utils/Attic/lztext.h,v 1.1 1999/11/17 21:21:51 wieck Exp $
+ *
+ * Definitions for the lztext compressed data type
+ * ----------
+ */
+
+#ifndef _LZTEXT_H_
+#define _LZTEXT_H_
+
+#include "utils/pg_lzcompress.h"
+
+
+/* ----------
+ * The internal storage format of an LZ compressed text field
+ * ----------
+ */
+typedef PGLZ_Header lztext;
+
+#endif /* _LZTEXT_H_ */
diff --git a/src/include/utils/pg_lzcompress.h b/src/include/utils/pg_lzcompress.h
new file mode 100644
index 00000000000..dba52fa5888
--- /dev/null
+++ b/src/include/utils/pg_lzcompress.h
@@ -0,0 +1,125 @@
+/* ----------
+ * pg_lzcompress.h -
+ *
+ * $Header: /cvsroot/pgsql/src/include/utils/pg_lzcompress.h,v 1.1 1999/11/17 21:21:51 wieck Exp $
+ *
+ * Definitions for the builtin LZ compressor
+ * ----------
+ */
+
+#ifndef _PG_LZCOMPRESS_H_
+#define _PG_LZCOMPRESS_H_
+
+
+/* ----------
+ * PGLZ_Header -
+ *
+ * The information at the top of the compressed data.
+ * The varsize must be kept the same data type as the value
+ * in front of all variable size data types in PostgreSQL.
+ * ----------
+ */
+typedef struct PGLZ_Header {
+ int32 varsize;
+ int32 rawsize;
+} PGLZ_Header;
+
+
+/* ----------
+ * PGLZ_MAX_OUTPUT -
+ *
+ * Macro to compute the maximum buffer required for the
+ * compression output. It is larger than the input, because
+ * in the worst case, we cannot write out one single tag but
+ * need one control byte per 8 literal data bytes plus the
+ * EOF mark at the end.
+ * ----------
+ */
+#define PGLZ_MAX_OUTPUT(_dlen) ((_dlen) + (((_dlen) | 0x07) >> 3) \
+ + sizeof(PGLZ_Header))
+#define PGLZ_RAW_SIZE(_lzdata) (_lzdata->rawsize)
+#define PGLZ_IS_COMPRESSED(_lzdata) (_lzdata->varsize != \
+ _lzdata->rawsize + sizeof(PGLZ_Header))
+
+/* ----------
+ * PGLZ_Strategy -
+ *
+ * Some values that control the compression algorithm.
+ *
+ * min_input_size Minimum input data size to start compression.
+ *
+ * force_input_size Input data size at which compressed storage is
+ * forced even if the compression rate drops below
+ * min_comp_rate (but not below 0).
+ *
+ * min_comp_rate Minimum compression rate (0-99%), the output
+ * must be smaller than the input. If that isn't
+ * the case, the compressor will throw away it's
+ * output and copy the original, uncompressed data
+ * to the output buffer.
+ *
+ * match_size_good The initial GOOD match size when starting history
+ * lookup. When looking up the history to find a
+ * match that could be expressed as a tag, the
+ * algorithm does not allways walk back entirely.
+ * A good match fast is usually better than the
+ * best possible one very late. For each iteration
+ * in the lookup, this value is lowered so the
+ * longer the lookup takes, the smaller matches
+ * are considered good.
+ *
+ * match_size_drop The percentage, match_size_good is lowered
+ * at each history check. Allowed values are
+ * 0 (no change until end) to 100 (only check
+ * latest history entry at all).
+ * ----------
+ */
+typedef struct PGLZ_Strategy {
+ int32 min_input_size;
+ int32 force_input_size;
+ int32 min_comp_rate;
+ int32 match_size_good;
+ int32 match_size_drop;
+} PGLZ_Strategy;
+
+
+/* ----------
+ * The standard strategies
+ *
+ * PGLZ_strategy_default Starts compression only if input is
+ * at least 256 bytes large. Stores output
+ * uncompressed if compression does not
+ * gain at least 20% size reducture but
+ * input does not exceed 6K. Stops history
+ * lookup if at least a 128 byte long
+ * match has been found.
+ *
+ * This is the default strategy if none
+ * is given to pglz_compress().
+ *
+ * PGLZ_strategy_allways Starts compression on any infinitely
+ * small input and does fallback to
+ * uncompressed storage only if output
+ * would be larger than input.
+ *
+ * PGLZ_strategy_never Force pglz_compress to act as a custom
+ * interface for memcpy(). Only useful
+ * for generic interfacing.
+ * ----------
+ */
+extern PGLZ_Strategy *PGLZ_strategy_default;
+extern PGLZ_Strategy *PGLZ_strategy_allways;
+extern PGLZ_Strategy *PGLZ_strategy_never;
+
+
+/* ----------
+ * Global function declarations
+ * ----------
+ */
+int pglz_compress (char *source, int32 slen, PGLZ_Header *dest,
+ PGLZ_Strategy *strategy);
+int pglz_decompress (PGLZ_Header *source, char *dest);
+
+
+#endif /* _PG_LZCOMPRESS_H_ */
+