Changeset: 3ada678b76e9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3ada678b76e9
Modified Files:
common/stream/stream.h
common/stream/xz_stream.c
Branch: makelibstreamgreatagain
Log Message:
Introduce the xz_stream wrapper
diffs (268 lines):
diff --git a/common/stream/stream.h b/common/stream/stream.h
--- a/common/stream/stream.h
+++ b/common/stream/stream.h
@@ -164,6 +164,8 @@ stream_export stream *file_wstream(FILE
stream_export stream *file_rastream(FILE *restrict fp, const char *restrict
name); // mclient.c, gdk_utils.c/THRinit
stream_export stream *file_wastream(FILE *restrict fp, const char *restrict
name); // mclient.c, msqldump.c, gdk_utils/THRinit
+stream_export stream *xz_stream(stream *inner, int preset);
+
stream_export FILE *getFile(stream *s); // gdk_logger.c progress messages
stream_export int getFileNo(stream *s); /* fileno(getFile(s)) */ //
mclient.c, gdk_logger.c progress messages
stream_export size_t getFileSize(stream *s); // mal_import.c, sql_scenario.c,
wlr.c, store.c, bat_logger.c
diff --git a/common/stream/xz_stream.c b/common/stream/xz_stream.c
--- a/common/stream/xz_stream.c
+++ b/common/stream/xz_stream.c
@@ -17,7 +17,6 @@
#ifdef HAVE_LIBLZMA
#define XZBUFSIZ 64*1024
typedef struct xz_state {
- FILE *fp;
lzma_stream strm;
uint8_t buf[XZBUFSIZ];
} xz_state;
@@ -75,26 +74,14 @@ static ssize_t
ship_in(void *state, char *start, size_t count)
{
stream *s = (stream*) state;
- xz_state *xz = (xz_state*) s->stream_data.p;
-
- size_t nread = fread(start, 1, count, xz->fp);
- if (nread == 0 && ferror(xz->fp))
- return -1;
- else
- return (ssize_t)nread;
+ return mnstr_read(s->inner, start, 1, count);
}
static ssize_t
ship_out(void *state, char *start, size_t count)
{
stream *s = (stream*) state;
- xz_state *xz = (xz_state*) s->stream_data.p;
-
- size_t nwritten = fwrite(start, 1, count, xz->fp);
- if (nwritten == 0 && ferror(xz->fp))
- return -1;
- else
- return (ssize_t)nwritten;
+ return mnstr_write(s->inner, start, 1, count);
}
@@ -182,15 +169,15 @@ stream_xzclose(stream *s)
xz->strm.next_in = NULL;
xz->strm.avail_in = 0;
if (pump_out(s, PUMP_FINISH) == PUMP_END) {
- fflush(xz->fp);
+ mnstr_flush(s->inner);
} else {
s->errnr = MNSTR_WRITE_ERROR;
}
}
- if (xz->fp)
- fclose(xz->fp);
+ mnstr_close(s->inner);
lzma_end(&xz->strm);
free(xz);
+ s->stream_data.p = NULL;
}
s->stream_data.p = NULL;
}
@@ -208,104 +195,91 @@ stream_xzflush(stream *s)
xz->strm.next_in = NULL;
xz->strm.avail_in = 0;
if (pump_out(s, PUMP_FLUSH_ALL) == PUMP_OK) {
- fflush(xz->fp);
+ mnstr_flush(s->inner);
+ return 0;
} else {
s->errnr = MNSTR_WRITE_ERROR;
+ return -1;
+ }
+}
+
+stream *
+xz_stream(stream *inner, int preset)
+{
+ if (inner == NULL)
+ return NULL;
+
+ xz_state *xz = calloc(1, sizeof(xz_state));
+ if (xz == NULL)
+ return NULL;
+
+ lzma_ret ret;
+ if (inner->readonly)
+ ret = lzma_stream_decoder(&xz->strm, UINT64_MAX,
LZMA_CONCATENATED);
+ else
+ ret = lzma_easy_encoder(&xz->strm, preset, LZMA_CHECK_CRC64);
+ if (ret != LZMA_OK) {
+ free(xz);
+ return NULL;
}
- return 0;
+ stream *s = create_wrapper_stream(NULL, inner);
+ if (s == NULL) {
+ free(xz);
+ return NULL;
+ }
+
+ s->stream_data.p = (void*) xz;
+ s->read = stream_xzread;
+ s->write = stream_xzwrite;
+ s->close = stream_xzclose;
+ s->flush = stream_xzflush;
+
+ if (s->readonly) {
+ xz->strm.next_in = xz->buf;
+ xz->strm.avail_in = 0;
+ } else {
+ xz->strm.next_out = xz->buf;
+ xz->strm.avail_out = XZBUFSIZ;
+ }
+
+ return s;
}
static stream *
open_xzstream(const char *restrict filename, const char *restrict flags)
{
- stream *s;
- xz_state *xz;
- uint32_t preset = 0;
- char fl[3];
+ stream *inner;
+ int preset = 0;
- if ((xz = calloc(1, sizeof(struct xz_state))) == NULL)
- return NULL;
- if (((flags[0] == 'r' &&
- lzma_stream_decoder(&xz->strm, UINT64_MAX, LZMA_CONCATENATED) !=
LZMA_OK)) ||
- (flags[0] == 'w' &&
- lzma_easy_encoder(&xz->strm, preset, LZMA_CHECK_CRC64) !=
LZMA_OK)) {
- free(xz);
- return NULL;
- }
- if ((s = create_stream(filename)) == NULL) {
- free(xz);
+ inner = open_stream(filename, flags);
+ if (inner == NULL)
return NULL;
- }
- fl[0] = flags[0]; /* 'r' or 'w' */
- fl[1] = 'b'; /* always binary */
- fl[2] = '\0';
-#ifdef HAVE__WFOPEN
- {
- wchar_t *wfname = utf8towchar(filename);
- wchar_t *wflags = utf8towchar(fl);
- if (wfname != NULL)
- xz->fp = _wfopen(wfname, wflags);
- else
- xz->fp = NULL;
- if (wfname)
- free(wfname);
- if (wflags)
- free(wflags);
- }
-#else
- {
- char *fname = cvfilename(filename);
- if (fname) {
- xz->fp = fopen(fname, fl);
- free(fname);
- } else
- xz->fp = NULL;
- }
-#endif
- if (xz->fp == NULL) {
- destroy_stream(s);
- free(xz);
- return NULL;
- }
- s->read = stream_xzread;
- s->write = stream_xzwrite;
- s->close = stream_xzclose;
- s->flush = stream_xzflush;
- s->stream_data.p = (void *) xz;
- if (flags[0] == 'r') {
- // input stream -> our buffer -> lzma_state -> caller buffer
- xz->strm.next_in = xz->buf;
- xz->strm.avail_in = 0;
- } else {
- assert(flags[0] == 'w');
- // caller buffer -> lzma_state -> our buffer -> output stream
- xz->strm.next_out = xz->buf;
- xz->strm.avail_out = XZBUFSIZ;
- }
- return s;
+
+ return xz_stream(inner, preset);
}
stream *
open_xzrstream(const char *filename)
{
- stream *s;
+ stream *s = open_xzstream(filename, "rb");
+ if (s == NULL)
+ return NULL;
- if ((s = open_xzstream(filename, "rb")) == NULL)
- return NULL;
- s->binary = true;
+ assert(s->readonly == true);
+ assert(s->binary == true);
return s;
}
stream *
open_xzwstream(const char *restrict filename, const char *restrict mode)
{
- stream *s;
+ stream *s = open_xzstream(filename, mode);
+ if (s == NULL)
+ return NULL;
- if ((s = open_xzstream(filename, mode)) == NULL)
- return NULL;
- s->readonly = false;
- s->binary = true;
+ assert(s->readonly == false);
+ assert(s->binary == true);
return s;
}
@@ -313,18 +287,24 @@ stream *
open_xzrastream(const char *filename)
{
stream *s = open_xzstream(filename, "r");
- return create_text_stream(s);
+ s = create_text_stream(s);
+ if (s == NULL)
+ return NULL;
+
+ assert(s->readonly == true);
+ assert(s->binary == false);
+ return s;
}
stream *
open_xzwastream(const char *restrict filename, const char *restrict mode)
{
- stream *s;
-
- if ((s = open_xzstream(filename, mode)) == NULL)
+ stream *s = open_xzstream(filename, mode);
+ s = create_text_stream(s);
+ if (s == NULL)
return NULL;
- s->readonly = false;
- s->binary = false;
+ assert(s->readonly == false);
+ assert(s->binary == false);
return s;
}
#else
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list