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
This commit is contained in:
Fujii Masao 2014-12-25 20:46:14 +09:00
parent 5b89473d87
commit 60838df922
6 changed files with 29 additions and 17 deletions

View File

@ -37,7 +37,7 @@
#include "catalog/catalog.h"
#include "miscadmin.h"
#include "utils/fmgroids.h"
#include "utils/pg_lzcompress.h"
#include "common/pg_lzcompress.h"
#include "utils/rel.h"
#include "utils/typcache.h"
#include "utils/tqual.h"
@ -142,7 +142,8 @@ heap_tuple_untoast_attr(struct varlena * attr)
attr = (struct varlena *) palloc(PGLZ_RAW_SIZE(tmp) + VARHDRSZ);
SET_VARSIZE(attr, PGLZ_RAW_SIZE(tmp) + VARHDRSZ);
pglz_decompress(tmp, VARDATA(attr));
if (!pglz_decompress(tmp, VARDATA(attr)))
elog(ERROR, "compressed data is corrupted");
pfree(tmp);
}
}
@ -167,7 +168,8 @@ heap_tuple_untoast_attr(struct varlena * attr)
attr = (struct varlena *) palloc(PGLZ_RAW_SIZE(tmp) + VARHDRSZ);
SET_VARSIZE(attr, PGLZ_RAW_SIZE(tmp) + VARHDRSZ);
pglz_decompress(tmp, VARDATA(attr));
if (!pglz_decompress(tmp, VARDATA(attr)))
elog(ERROR, "compressed data is corrupted");
}
else if (VARATT_IS_SHORT(attr))
{
@ -239,7 +241,8 @@ heap_tuple_untoast_attr_slice(struct varlena * attr,
preslice = (struct varlena *) palloc(size);
SET_VARSIZE(preslice, size);
pglz_decompress(tmp, VARDATA(preslice));
if (!pglz_decompress(tmp, VARDATA(preslice)))
elog(ERROR, "compressed data is corrupted");
if (tmp != (PGLZ_Header *) attr)
pfree(tmp);

View File

@ -25,8 +25,8 @@ OBJS = acl.o arrayfuncs.o array_selfuncs.o array_typanalyze.o \
jsonfuncs.o like.o lockfuncs.o mac.o misc.o nabstime.o name.o \
network.o network_gist.o network_selfuncs.o \
numeric.o numutils.o oid.o oracle_compat.o \
orderedsetaggs.o pg_lzcompress.o pg_locale.o pg_lsn.o \
pgstatfuncs.o pseudotypes.o quote.o rangetypes.o rangetypes_gist.o \
orderedsetaggs.o pg_locale.o pg_lsn.o pgstatfuncs.o \
pseudotypes.o quote.o rangetypes.o rangetypes_gist.o \
rangetypes_selfuncs.o rangetypes_spgist.o rangetypes_typanalyze.o \
regexp.o regproc.o ri_triggers.o rowtypes.o ruleutils.o \
selfuncs.o tid.o timestamp.o trigfuncs.o \

View File

@ -23,7 +23,8 @@ include $(top_builddir)/src/Makefile.global
override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
LIBS += $(PTHREAD_LIBS)
OBJS_COMMON = exec.o pgfnames.o psprintf.o relpath.o rmtree.o username.o wait_error.o
OBJS_COMMON = exec.o pg_lzcompress.o pgfnames.o psprintf.o relpath.o \
rmtree.o username.o wait_error.o
OBJS_FRONTEND = $(OBJS_COMMON) fe_memutils.o

View File

@ -27,7 +27,7 @@
* FALSE if not; in the latter case the contents of dest
* are undefined.
*
* void
* bool
* pglz_decompress(const PGLZ_Header *source, char *dest)
*
* source is the compressed input.
@ -40,6 +40,10 @@
* The data is written to buff exactly as it was handed
* to pglz_compress(). No terminating zero byte is added.
*
* The return value is TRUE if decompression succeeded,
* FALSE if not; in the latter case the contents of dest
* are undefined.
*
* The decompression algorithm and internal data format:
*
* PGLZ_Header is defined as
@ -169,14 +173,14 @@
*
* Copyright (c) 1999-2014, PostgreSQL Global Development Group
*
* src/backend/utils/adt/pg_lzcompress.c
* src/common/pg_lzcompress.c
* ----------
*/
#include "postgres.h"
#include <limits.h>
#include "utils/pg_lzcompress.h"
#include "common/pg_lzcompress.h"
/* ----------
@ -492,7 +496,8 @@ pglz_find_match(int16 *hstart, const char *input, const char *end,
/* ----------
* pglz_compress -
*
* Compresses source into dest using strategy.
* Compresses source into dest using strategy. Returns false if a failure
* occurred, true in case of success.
* ----------
*/
bool
@ -678,10 +683,11 @@ pglz_compress(const char *source, int32 slen, PGLZ_Header *dest,
/* ----------
* pglz_decompress -
*
* Decompresses source into dest.
* Decompresses source into dest. Returns false if a failure
* occurred, true in case of success.
* ----------
*/
void
bool
pglz_decompress(const PGLZ_Header *source, char *dest)
{
const unsigned char *sp;
@ -771,9 +777,10 @@ pglz_decompress(const PGLZ_Header *source, char *dest)
* Check we decompressed the right amount.
*/
if (dp != destend || sp != srcend)
elog(ERROR, "compressed data is corrupt");
return false;
/*
* That's it.
*/
return true;
}

View File

@ -3,7 +3,7 @@
*
* Definitions for the builtin LZ compressor
*
* src/include/utils/pg_lzcompress.h
* src/include/common/pg_lzcompress.h
* ----------
*/
@ -107,6 +107,6 @@ extern const PGLZ_Strategy *const PGLZ_strategy_always;
*/
extern bool pglz_compress(const char *source, int32 slen, PGLZ_Header *dest,
const PGLZ_Strategy *strategy);
extern void pglz_decompress(const PGLZ_Header *source, char *dest);
extern bool pglz_decompress(const PGLZ_Header *source, char *dest);
#endif /* _PG_LZCOMPRESS_H_ */

View File

@ -76,7 +76,8 @@ sub mkvcbuild
push(@pgportfiles, 'rint.c') if ($vsVersion < '12.00');
our @pgcommonallfiles = qw(
exec.c pgfnames.c psprintf.c relpath.c rmtree.c username.c wait_error.c);
exec.c pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c
username.c wait_error.c);
our @pgcommonfrontendfiles = (@pgcommonallfiles, qw(fe_memutils.c));