27#ifndef LZ4F_HEADER_SIZE_MAX
28#define LZ4F_HEADER_SIZE_MAX 32
39typedef struct LZ4State
46 LZ4F_preferences_t prefs;
48 LZ4F_compressionContext_t ctx;
49 LZ4F_decompressionContext_t dtx;
92LZ4State_compression_init(LZ4State *
state)
116 if (
state->buflen < LZ4F_HEADER_SIZE_MAX)
117 state->buflen = LZ4F_HEADER_SIZE_MAX;
119 status = LZ4F_createCompressionContext(&
state->ctx, LZ4F_VERSION);
120 if (LZ4F_isError(status))
122 state->errcode = status;
131 status = LZ4F_compressBegin(
state->ctx,
134 if (LZ4F_isError(status))
136 state->errcode = status;
140 state->bufdata = status;
159 LZ4F_decompressionContext_t ctx = NULL;
160 LZ4F_decompressOptions_t dec_opt;
161 LZ4F_errorCode_t status;
163 memset(&dec_opt, 0,
sizeof(dec_opt));
164 status = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
165 if (LZ4F_isError(status))
166 pg_fatal(
"could not create LZ4 decompression context: %s",
167 LZ4F_getErrorName(status));
172 while ((r = cs->
readF(AH, &readbuf, &readbuflen)) > 0)
179 readend = readbuf + r;
180 while (readp < readend)
183 size_t read_size = readend - readp;
185 status = LZ4F_decompress(ctx, outbuf, &out_size,
186 readp, &read_size, &dec_opt);
187 if (LZ4F_isError(status))
188 pg_fatal(
"could not decompress: %s",
189 LZ4F_getErrorName(status));
191 ahwrite(outbuf, 1, out_size, AH);
199 status = LZ4F_freeDecompressionContext(ctx);
200 if (LZ4F_isError(status))
201 pg_fatal(
"could not free LZ4 decompression context: %s",
202 LZ4F_getErrorName(status));
207 const void *
data,
size_t dLen)
229 status = LZ4F_compressUpdate(
state->ctx,
234 if (LZ4F_isError(status))
235 pg_fatal(
"could not compress data: %s",
236 LZ4F_getErrorName(status));
238 state->bufdata += status;
240 data = ((
const char *)
data) + chunk;
264 status = LZ4F_compressEnd(
state->ctx,
268 if (LZ4F_isError(status))
269 pg_fatal(
"could not end compression: %s",
270 LZ4F_getErrorName(status));
271 state->bufdata += status;
276 status = LZ4F_freeCompressionContext(
state->ctx);
277 if (LZ4F_isError(status))
278 pg_fatal(
"could not end compression: %s",
279 LZ4F_getErrorName(status));
295 cs->
readData = ReadDataFromArchiveLZ4;
297 cs->
end = EndCompressorLZ4;
312 if (!LZ4State_compression_init(
state))
313 pg_fatal(
"could not initialize LZ4 compression: %s",
314 LZ4F_getErrorName(
state->errcode));
334 return state->outbufnext >=
state->outbufdata &&
345 if (LZ4F_isError(
state->errcode))
366LZ4Stream_init(LZ4State *
state,
bool compressing)
373 state->compressing = compressing;
375 if (
state->compressing)
377 if (!LZ4State_compression_init(
state))
382 status = LZ4F_createDecompressionContext(&
state->dtx, LZ4F_VERSION);
383 if (LZ4F_isError(status))
385 state->errcode = status;
395 state->inited =
true;
410LZ4Stream_read_internal(LZ4State *
state,
void *ptr,
int ptrsize,
bool eol_flag)
416 if (!LZ4Stream_init(
state,
false ))
419 LZ4F_getErrorName(
state->errcode));
431 char *outptr =
state->outbuf +
state->outbufnext;
432 size_t readlen =
state->outbufdata -
state->outbufnext;
433 bool eol_found =
false;
440 char *eolptr = memchr(outptr,
'\n', readlen);
444 readlen = eolptr - outptr + 1;
448 memcpy(ptr, outptr, readlen);
449 ptr = ((
char *) ptr) + readlen;
450 state->outbufnext += readlen;
468 if (rsize < state->buflen && !feof(
state->fp))
475 state->bufdata = rsize;
484 size_t outlen =
state->outbuflen;
485 size_t inlen =
state->bufdata -
state->bufnext;
487 status = LZ4F_decompress(
state->dtx,
488 state->outbuf, &outlen,
492 if (LZ4F_isError(status))
494 state->errcode = status;
496 LZ4F_getErrorName(
state->errcode));
499 state->bufnext += inlen;
500 state->outbufdata = outlen;
501 state->outbufnext = 0;
518 if (!LZ4Stream_init(
state,
true))
519 pg_fatal(
"unable to initialize LZ4 library: %s",
520 LZ4F_getErrorName(
state->errcode));
538 errno = (errno) ? errno : ENOSPC;
539 pg_fatal(
"error during writing: %m");
544 status = LZ4F_compressUpdate(
state->ctx,
548 if (LZ4F_isError(status))
549 pg_fatal(
"error during writing: %s", LZ4F_getErrorName(status));
550 state->bufdata += status;
552 ptr = ((
const char *) ptr) + chunk;
566 if ((ret = LZ4Stream_read_internal(
state, ptr, size,
false)) < 0)
567 pg_fatal(
"could not read from input file: %s", LZ4Stream_get_error(CFH));
581 if (LZ4Stream_read_internal(
state, &
c, 1,
false) <= 0)
583 if (!LZ4Stream_eof(CFH))
584 pg_fatal(
"could not read from input file: %s", LZ4Stream_get_error(CFH));
586 pg_fatal(
"could not read from input file: end of file");
601 ret = LZ4Stream_read_internal(
state, ptr, size - 1,
true);
636 if (
state->compressing)
645 errno = (errno) ? errno : ENOSPC;
651 status = LZ4F_compressEnd(
state->ctx,
655 if (LZ4F_isError(status))
658 LZ4F_getErrorName(status));
661 state->bufdata += status;
666 errno = (errno) ? errno : ENOSPC;
670 status = LZ4F_freeCompressionContext(
state->ctx);
671 if (LZ4F_isError(status))
673 LZ4F_getErrorName(status));
677 status = LZ4F_freeDecompressionContext(
state->dtx);
678 if (LZ4F_isError(status))
680 LZ4F_getErrorName(status));
702LZ4Stream_open(
const char *path,
int fd,
const char *
mode,
711 if (
state->fp == NULL)
713 state->errcode = errno;
768 pg_fatal(
"this build does not support compression with %s",
"LZ4");
775 pg_fatal(
"this build does not support compression with %s",
"LZ4");
#define DEFAULT_IO_BUFFER_SIZE
void InitCompressFileHandleLZ4(CompressFileHandle *CFH, const pg_compress_specification compression_spec)
void InitCompressorLZ4(CompressorState *cs, const pg_compress_specification compression_spec)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
void * pg_malloc(size_t size)
void * pg_malloc0(size_t size)
Assert(PointerIsAligned(start, uint64))
if(TABLE==NULL||TABLE_index==NULL)
#define pg_log_error(...)
void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
static PgChecksumMode mode
static int fd(const char *x, int i)
char * psprintf(const char *fmt,...)
char *(* gets_func)(char *s, int size, CompressFileHandle *CFH)
bool(* open_write_func)(const char *path, const char *mode, CompressFileHandle *CFH)
int(* getc_func)(CompressFileHandle *CFH)
const char *(* get_error_func)(CompressFileHandle *CFH)
bool(* eof_func)(CompressFileHandle *CFH)
size_t(* read_func)(void *ptr, size_t size, CompressFileHandle *CFH)
bool(* open_func)(const char *path, int fd, const char *mode, CompressFileHandle *CFH)
pg_compress_specification compression_spec
bool(* close_func)(CompressFileHandle *CFH)
void(* write_func)(const void *ptr, size_t size, CompressFileHandle *CFH)
void(* readData)(ArchiveHandle *AH, CompressorState *cs)
pg_compress_specification compression_spec
void(* end)(ArchiveHandle *AH, CompressorState *cs)
void(* writeData)(ArchiveHandle *AH, CompressorState *cs, const void *data, size_t dLen)