提交 60838df9 编写于 作者: F Fujii Masao

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
上级 5b89473d
......@@ -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);
......
......@@ -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 \
......
......@@ -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
......
......@@ -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;
}
......@@ -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_ */
......@@ -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));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册