26 typedef struct bbstreamer_gzip_writer
31 } bbstreamer_gzip_writer;
33 typedef struct bbstreamer_gzip_decompressor
38 } bbstreamer_gzip_decompressor;
40 static void bbstreamer_gzip_writer_content(
bbstreamer *streamer,
44 static void bbstreamer_gzip_writer_finalize(
bbstreamer *streamer);
45 static void bbstreamer_gzip_writer_free(
bbstreamer *streamer);
46 static const char *get_gz_error(gzFile gzf);
49 .
content = bbstreamer_gzip_writer_content,
50 .finalize = bbstreamer_gzip_writer_finalize,
51 .free = bbstreamer_gzip_writer_free
54 static void bbstreamer_gzip_decompressor_content(
bbstreamer *streamer,
58 static void bbstreamer_gzip_decompressor_finalize(
bbstreamer *streamer);
59 static void bbstreamer_gzip_decompressor_free(
bbstreamer *streamer);
60 static void *gzip_palloc(
void *opaque,
unsigned items,
unsigned size);
61 static void gzip_pfree(
void *opaque,
void *address);
64 .
content = bbstreamer_gzip_decompressor_content,
65 .finalize = bbstreamer_gzip_decompressor_finalize,
66 .free = bbstreamer_gzip_decompressor_free
83 bbstreamer_gzip_writer *streamer;
85 streamer =
palloc0(
sizeof(bbstreamer_gzip_writer));
87 &bbstreamer_gzip_writer_ops;
89 streamer->pathname =
pstrdup(pathname);
93 streamer->gzfile = gzopen(pathname,
"wb");
94 if (streamer->gzfile == NULL)
95 pg_fatal(
"could not create compressed file \"%s\": %m",
100 int fd = dup(fileno(file));
103 pg_fatal(
"could not duplicate stdout: %m");
105 streamer->gzfile = gzdopen(
fd,
"wb");
106 if (streamer->gzfile == NULL)
107 pg_fatal(
"could not open output file: %m");
110 if (gzsetparams(streamer->gzfile, compress->
level, Z_DEFAULT_STRATEGY) != Z_OK)
111 pg_fatal(
"could not set compression level %d: %s",
112 compress->
level, get_gz_error(streamer->gzfile));
114 return &streamer->base;
116 pg_fatal(
"this build does not support compression with %s",
"gzip");
126 bbstreamer_gzip_writer_content(
bbstreamer *streamer,
130 bbstreamer_gzip_writer *mystreamer;
132 mystreamer = (bbstreamer_gzip_writer *) streamer;
138 if (gzwrite(mystreamer->gzfile,
data,
len) !=
len)
143 pg_fatal(
"could not write to compressed file \"%s\": %s",
144 mystreamer->pathname, get_gz_error(mystreamer->gzfile));
159 bbstreamer_gzip_writer_finalize(
bbstreamer *streamer)
161 bbstreamer_gzip_writer *mystreamer;
163 mystreamer = (bbstreamer_gzip_writer *) streamer;
166 if (gzclose(mystreamer->gzfile) != 0)
167 pg_fatal(
"could not close compressed file \"%s\": %m",
168 mystreamer->pathname);
170 mystreamer->gzfile = NULL;
177 bbstreamer_gzip_writer_free(
bbstreamer *streamer)
179 bbstreamer_gzip_writer *mystreamer;
181 mystreamer = (bbstreamer_gzip_writer *) streamer;
183 Assert(mystreamer->base.bbs_next == NULL);
184 Assert(mystreamer->gzfile == NULL);
186 pfree(mystreamer->pathname);
194 get_gz_error(gzFile gzf)
199 errmsg = gzerror(gzf, &errnum);
200 if (errnum == Z_ERRNO)
215 bbstreamer_gzip_decompressor *streamer;
220 streamer =
palloc0(
sizeof(bbstreamer_gzip_decompressor));
222 &bbstreamer_gzip_decompressor_ops;
224 streamer->base.bbs_next =
next;
228 zs = &streamer->zstream;
229 zs->zalloc = gzip_palloc;
230 zs->zfree = gzip_pfree;
231 zs->next_out = (
uint8 *) streamer->base.bbs_buffer.data;
232 zs->avail_out = streamer->base.bbs_buffer.maxlen;
244 if (inflateInit2(zs, 15 + 16) != Z_OK)
245 pg_fatal(
"could not initialize compression library");
247 return &streamer->base;
249 pg_fatal(
"this build does not support compression with %s",
"gzip");
261 bbstreamer_gzip_decompressor_content(
bbstreamer *streamer,
266 bbstreamer_gzip_decompressor *mystreamer;
269 mystreamer = (bbstreamer_gzip_decompressor *) streamer;
271 zs = &mystreamer->zstream;
276 while (zs->avail_in > 0)
280 Assert(mystreamer->bytes_written < mystreamer->base.bbs_buffer.maxlen);
282 zs->next_out = (
uint8 *)
283 mystreamer->base.bbs_buffer.data + mystreamer->bytes_written;
285 mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
293 res = inflate(zs, Z_NO_FLUSH);
295 if (
res == Z_STREAM_ERROR)
298 mystreamer->bytes_written =
299 mystreamer->base.bbs_buffer.maxlen - zs->avail_out;
302 if (mystreamer->bytes_written >= mystreamer->base.bbs_buffer.maxlen)
305 mystreamer->base.bbs_buffer.data,
306 mystreamer->base.bbs_buffer.maxlen, context);
307 mystreamer->bytes_written = 0;
316 bbstreamer_gzip_decompressor_finalize(
bbstreamer *streamer)
318 bbstreamer_gzip_decompressor *mystreamer;
320 mystreamer = (bbstreamer_gzip_decompressor *) streamer;
327 mystreamer->base.bbs_buffer.data,
328 mystreamer->base.bbs_buffer.maxlen,
338 bbstreamer_gzip_decompressor_free(
bbstreamer *streamer)
350 gzip_palloc(
void *opaque,
unsigned items,
unsigned size)
352 return palloc(items * size);
360 gzip_pfree(
void *opaque,
void *address)
static void bbstreamer_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
static void bbstreamer_finalize(bbstreamer *streamer)
bbstreamer_archive_context
static void bbstreamer_free(bbstreamer *streamer)
bbstreamer * bbstreamer_gzip_writer_new(char *pathname, FILE *file, pg_compress_specification *compress)
bbstreamer * bbstreamer_gzip_decompressor_new(bbstreamer *next)
static void PGresult * res
int errmsg(const char *fmt,...)
if(TABLE==NULL||TABLE_index==NULL)
Assert(fmt[strlen(fmt) - 1] !='\n')
#define pg_log_error(...)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
static int fd(const char *x, int i)
void initStringInfo(StringInfo str)
void(* content)(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
StringInfoData bbs_buffer