diff options
| author | Jan Wieck <JanWieck@Yahoo.com> | 1999-11-17 21:21:51 +0000 |
|---|---|---|
| committer | Jan Wieck <JanWieck@Yahoo.com> | 1999-11-17 21:21:51 +0000 |
| commit | 79c3b71c1be3a79ec2d1f4d64bdef13f0e0a086a (patch) | |
| tree | d0bdc22ff0f14c29631a3614b933e761feebf3c2 /src/include/utils | |
| parent | ddc335290cb0bd09b3529cb032cfabf85029201b (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.h | 11 | ||||
| -rw-r--r-- | src/include/utils/lztext.h | 22 | ||||
| -rw-r--r-- | src/include/utils/pg_lzcompress.h | 125 |
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_ */ + |
