void
InitCompressorZstd(CompressorState *cs, const pg_compress_specification compression_spec)
{
pg_fatal("this build does not support compression with %s", "ZSTD");
}
void
InitCompressFileHandleZstd(CompressFileHandle *CFH, const pg_compress_specification compression_spec)
{
pg_fatal("this build does not support compression with %s", "ZSTD");
}
#else
#include <zstd.h>
typedefstruct ZstdCompressorState
{ /* This is a normal file to which we read/write compressed data */
FILE *fp;
res = ZSTD_CCtx_setParameter(cstream, param, value); if (ZSTD_isError(res))
pg_fatal("could not set compression parameter \"%s\": %s",
paramname, ZSTD_getErrorName(res));
}
/* Return a compression stream with parameters set per argument */ static ZSTD_CStream *
_ZstdCStreamParams(pg_compress_specification compress)
{
ZSTD_CStream *cstream;
cstream = ZSTD_createCStream(); if (cstream == NULL)
pg_fatal("could not initialize compression library");
/* Now decompress */ while (input->pos < input->size)
{
output->pos = 0;
res = ZSTD_decompressStream(zstdcs->dstream, output, input); if (ZSTD_isError(res))
pg_fatal("could not decompress data: %s", ZSTD_getErrorName(res));
for (;;)
{
Assert(input->pos <= input->size);
Assert(input->size <= input_allocated_size);
/* *Iftheinputiscompletelyconsumed,startbackatthebeginning
*/ if (input->pos == input->size)
{ /* input->size is size produced by "fread" */
input->size = 0; /* input->pos is position consumed by decompress */
input->pos = 0;
}
/* read compressed data if we must produce more input */ if (input->pos == input->size)
{
cnt = fread(unconstify(void *, input->src), 1, input_allocated_size, zstdcs->fp); if (ferror(zstdcs->fp))
{ if (exit_on_error)
pg_fatal("could not read from input file: %m"); return -1;
}
input->size = cnt;
Assert(cnt <= input_allocated_size);
/* If we have no more input to consume, we're done */ if (cnt == 0) break;
}
while (input->pos < input->size)
{ /* now decompress */
res = ZSTD_decompressStream(zstdcs->dstream, output, input);
if (ZSTD_isError(res))
{ if (exit_on_error)
pg_fatal("could not decompress data: %s", ZSTD_getErrorName(res)); return -1;
}
if (output->pos == output->size) break; /* No more room for output */
if (res == 0) break; /* End of frame */
}
if (output->pos == output->size) break; /* We read all the data that fits */
}
if (zstdcs->cstream == NULL)
{
zstdcs->output.size = ZSTD_CStreamOutSize();
zstdcs->output.dst = pg_malloc0(zstdcs->output.size);
zstdcs->cstream = _ZstdCStreamParams(CFH->compression_spec); if (zstdcs->cstream == NULL)
pg_fatal("could not initialize compression library");
}
/* Consume all input, to be flushed later */ while (input->pos != input->size)
{
output->pos = 0;
res = ZSTD_compressStream2(zstdcs->cstream, output, input, ZSTD_e_continue); if (ZSTD_isError(res))
pg_fatal("could not write to file: %s", ZSTD_getErrorName(res));
errno = 0;
cnt = fwrite(output->dst, 1, output->pos, zstdcs->fp); if (cnt != output->pos)
{
errno = (errno) ? errno : ENOSPC;
pg_fatal("could not write to file: %m");
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.