diff options
| author | Fujii Masao | 2014-12-25 11:46:14 +0000 |
|---|---|---|
| committer | Fujii Masao | 2014-12-25 11:46:14 +0000 |
| commit | 60838df922345b26a616e49ac9fab808a35d1f85 (patch) | |
| tree | 9f924e2b9558b80cd523305aa76d697b35da6fb7 /src/include/common | |
| parent | 5b89473d870dc2a9fec0926c5afccf53042dbb0a (diff) | |
Move pg_lzcompress.c to src/common.
Exposing compression and decompression APIs of pglz makes possible its
use by extensions and contrib modules. pglz_decompress contained a call
to elog to emit an error message in case of corrupted data. This function
is changed to return a status code to let its callers return an error instead.
This commit is required for upcoming WAL compression feature so that
the WAL reader facility can decompress the WAL data by using pglz_decompress.
Michael Paquier
Diffstat (limited to 'src/include/common')
| -rw-r--r-- | src/include/common/pg_lzcompress.h | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/include/common/pg_lzcompress.h b/src/include/common/pg_lzcompress.h new file mode 100644 index 0000000000..f36d2da8ee --- /dev/null +++ b/src/include/common/pg_lzcompress.h @@ -0,0 +1,112 @@ +/* ---------- + * pg_lzcompress.h - + * + * Definitions for the builtin LZ compressor + * + * src/include/common/pg_lzcompress.h + * ---------- + */ + +#ifndef _PG_LZCOMPRESS_H_ +#define _PG_LZCOMPRESS_H_ + + +/* ---------- + * PGLZ_Header - + * + * The information at the start of the compressed data. + * ---------- + */ +typedef struct PGLZ_Header +{ + int32 vl_len_; /* varlena header (do not touch directly!) */ + int32 rawsize; +} PGLZ_Header; + + +/* ---------- + * PGLZ_MAX_OUTPUT - + * + * Macro to compute the buffer size required by pglz_compress(). + * We allow 4 bytes for overrun before detecting compression failure. + * ---------- + */ +#define PGLZ_MAX_OUTPUT(_dlen) ((_dlen) + 4 + sizeof(PGLZ_Header)) + +/* ---------- + * PGLZ_RAW_SIZE - + * + * Macro to determine the uncompressed data size contained + * in the entry. + * ---------- + */ +#define PGLZ_RAW_SIZE(_lzdata) ((_lzdata)->rawsize) + + +/* ---------- + * PGLZ_Strategy - + * + * Some values that control the compression algorithm. + * + * min_input_size Minimum input data size to consider compression. + * + * max_input_size Maximum input data size to consider compression. + * + * min_comp_rate Minimum compression rate (0-99%) to require. + * Regardless of min_comp_rate, the output must be + * smaller than the input, else we don't store + * compressed. + * + * first_success_by Abandon compression if we find no compressible + * data within the first this-many bytes. + * + * 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 always 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 by which match_size_good is lowered + * after 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 max_input_size; + int32 min_comp_rate; + int32 first_success_by; + int32 match_size_good; + int32 match_size_drop; +} PGLZ_Strategy; + + +/* ---------- + * The standard strategies + * + * PGLZ_strategy_default Recommended default strategy for TOAST. + * + * PGLZ_strategy_always Try to compress inputs of any length. + * Fallback to uncompressed storage only if + * output would be larger than input. + * ---------- + */ +extern const PGLZ_Strategy *const PGLZ_strategy_default; +extern const PGLZ_Strategy *const PGLZ_strategy_always; + + +/* ---------- + * Global function declarations + * ---------- + */ +extern bool pglz_compress(const char *source, int32 slen, PGLZ_Header *dest, + const PGLZ_Strategy *strategy); +extern bool pglz_decompress(const PGLZ_Header *source, char *dest); + +#endif /* _PG_LZCOMPRESS_H_ */ |
