mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
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:
parent
5b89473d87
commit
60838df922
@ -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));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user