22 typedef struct bbsink_gzip
37 static void bbsink_gzip_begin_backup(
bbsink *sink);
38 static void bbsink_gzip_begin_archive(
bbsink *sink,
const char *archive_name);
39 static void bbsink_gzip_archive_contents(
bbsink *sink,
size_t len);
40 static void bbsink_gzip_manifest_contents(
bbsink *sink,
size_t len);
41 static void bbsink_gzip_end_archive(
bbsink *sink);
42 static void *gzip_palloc(
void *opaque,
unsigned items,
unsigned size);
43 static void gzip_pfree(
void *opaque,
void *address);
47 .begin_archive = bbsink_gzip_begin_archive,
48 .archive_contents = bbsink_gzip_archive_contents,
49 .end_archive = bbsink_gzip_end_archive,
51 .manifest_contents = bbsink_gzip_manifest_contents,
66 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
67 errmsg(
"gzip compression is not supported by this build")));
83 sink =
palloc0(
sizeof(bbsink_gzip));
84 *((
const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_gzip_ops;
85 sink->base.bbs_next =
next;
98 bbsink_gzip_begin_backup(
bbsink *sink)
118 bbsink_gzip_begin_archive(
bbsink *sink,
const char *archive_name)
120 bbsink_gzip *mysink = (bbsink_gzip *) sink;
121 char *gz_archive_name;
126 zs->zalloc = gzip_palloc;
127 zs->zfree = gzip_pfree;
143 if (deflateInit2(zs, mysink->compresslevel, Z_DEFLATED, 15 + 16, 8,
144 Z_DEFAULT_STRATEGY) != Z_OK)
146 errcode(ERRCODE_INTERNAL_ERROR),
147 errmsg(
"could not initialize compression library"));
153 gz_archive_name =
psprintf(
"%s.gz", archive_name);
156 pfree(gz_archive_name);
171 bbsink_gzip_archive_contents(
bbsink *sink,
size_t len)
173 bbsink_gzip *mysink = (bbsink_gzip *) sink;
185 Assert(mysink->bytes_written < mysink->base.bbs_next->bbs_buffer_length);
187 mysink->base.bbs_next->bbs_buffer + mysink->bytes_written;
189 mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written;
202 res = deflate(zs, Z_NO_FLUSH);
203 if (
res == Z_STREAM_ERROR)
204 elog(
ERROR,
"could not compress data: %s", zs->msg);
207 mysink->bytes_written =
208 mysink->base.bbs_next->bbs_buffer_length - zs->
avail_out;
214 if (mysink->bytes_written >= mysink->base.bbs_next->bbs_buffer_length)
217 mysink->bytes_written = 0;
229 bbsink_gzip_end_archive(
bbsink *sink)
231 bbsink_gzip *mysink = (bbsink_gzip *) sink;
243 Assert(mysink->bytes_written < mysink->base.bbs_next->bbs_buffer_length);
245 mysink->base.bbs_next->bbs_buffer + mysink->bytes_written;
247 mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written;
253 res = deflate(zs, Z_FINISH);
254 if (
res == Z_STREAM_ERROR)
255 elog(
ERROR,
"could not compress data: %s", zs->msg);
258 mysink->bytes_written =
259 mysink->base.bbs_next->bbs_buffer_length - zs->
avail_out;
265 if (mysink->bytes_written == 0)
270 mysink->bytes_written = 0;
282 bbsink_gzip_manifest_contents(
bbsink *sink,
size_t len)
293 gzip_palloc(
void *opaque,
unsigned items,
unsigned size)
295 return palloc(items * size);
303 gzip_pfree(
void *opaque,
void *address)
bbsink * bbsink_gzip_new(bbsink *next, pg_compress_specification *compress)
void bbsink_forward_begin_manifest(bbsink *sink)
void bbsink_forward_end_backup(bbsink *sink, XLogRecPtr endptr, TimeLineID endtli)
void bbsink_forward_cleanup(bbsink *sink)
void bbsink_forward_end_archive(bbsink *sink)
void bbsink_forward_end_manifest(bbsink *sink)
static void bbsink_begin_backup(bbsink *sink, bbsink_state *state, int buffer_length)
static void bbsink_begin_archive(bbsink *sink, const char *archive_name)
static void bbsink_archive_contents(bbsink *sink, size_t len)
static void bbsink_manifest_contents(bbsink *sink, size_t len)
#define PG_COMPRESSION_OPTION_LEVEL
static void PGresult * res
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * palloc0(Size size)
#define Z_DEFAULT_COMPRESSION
char * psprintf(const char *fmt,...)
void(* begin_backup)(bbsink *sink)