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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to