Changeset: 0af7f9dfa6e6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0af7f9dfa6e6
Modified Files:
common/stream/gz_stream.c
Branch: default
Log Message:
Support reading concatenated .gz files in libstream
diffs (69 lines):
diff --git a/common/stream/gz_stream.c b/common/stream/gz_stream.c
--- a/common/stream/gz_stream.c
+++ b/common/stream/gz_stream.c
@@ -20,7 +20,9 @@ struct inner_state {
z_stream strm;
int (*indeflate)(z_streamp strm, int flush);
int (*indeflateEnd)(z_streamp strm);
+ void (*reset)(inner_state_t *inner_state);
Bytef buf[64*1024];
+ bool prev_was_stream_end;
};
static pump_buffer
@@ -88,13 +90,29 @@ work(inner_state_t *inner_state, pump_ac
return PUMP_ERROR;
}
+ if (inner_state->strm.next_in == NULL &&
inner_state->prev_was_stream_end) {
+ // on the previous Z_STREAM_END we attempted to continue in
case there
+ // was a concatenated additional zstream but that is not the
case.
+ return PUMP_END;
+ }
+
int ret = inner_state->indeflate(&inner_state->strm, a);
+ inner_state->prev_was_stream_end = false;
switch (ret) {
case Z_OK:
return PUMP_OK;
case Z_STREAM_END:
- return PUMP_END;
+ inner_state->prev_was_stream_end = true;
+ if (action == PUMP_NO_FLUSH && inner_state->reset !=
NULL) {
+ // zlib returns end, but maybe the input
consists of multiple
+ // gzipped files.
+ inner_state->reset(inner_state);
+ return PUMP_OK;
+ } else {
+ // no more incoming data
+ return PUMP_END;
+ }
default:
return PUMP_ERROR;
}
@@ -114,6 +132,16 @@ get_error(inner_state_t *inner_state)
return inner_state->strm.msg;
}
+static void
+inflate_reset(inner_state_t *inner_state)
+{
+ pump_buffer src = get_src_win(inner_state);
+ pump_buffer dst = get_dst_win(inner_state);
+ inflateReset(&inner_state->strm);
+ set_src_win(inner_state, src);
+ set_dst_win(inner_state, dst);
+}
+
stream *
gz_stream(stream *inner, int level)
{
@@ -140,6 +168,7 @@ gz_stream(stream *inner, int level)
if (inner->readonly) {
gz->indeflate = inflate;
gz->indeflateEnd = inflateEnd;
+ gz->reset = inflate_reset;
gz->strm.next_in = gz->buf;
gz->strm.avail_in = 0;
gz->strm.next_in = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list