Changeset: 6be7362eb489 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6be7362eb489 Modified Files: README common/stream/stream.c monetdb5/extras/jaql/json.c testing/Mtest.py.in Branch: default Log Message:
Merge with Oct2012 branch. diffs (truncated from 451 to 300 lines): diff --git a/README b/README --- a/README +++ b/README @@ -35,3 +35,4 @@ The Initial Developer of the Original Co Portions created by CWI are Copyright (C) 1997-July 2008 CWI. Copyright August 2008-2012 MonetDB B.V. All Rights Reserved. + diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -799,14 +799,57 @@ stream *open_gzwastream(const char *file /* streams working on a bzip2-compressed disk file */ #ifdef HAVE_LIBBZ2 +struct bz { + BZFILE *b; + FILE *f; +}; + +static void +stream_bzclose(stream *s) +{ + int err = BZ_OK; + + if (s->stream_data.p) { + if (s->access == ST_READ) + BZ2_bzReadClose(&err, ((struct bz *) s->stream_data.p)->b); + else + BZ2_bzWriteClose(&err, ((struct bz *) s->stream_data.p)->b, 0, NULL, NULL); + fclose(((struct bz *) s->stream_data.p)->f); + free(s->stream_data.p); + } + s->stream_data.p = NULL; +} + static ssize_t stream_bzread(stream *s, void *buf, size_t elmsize, size_t cnt) { int size = (int) (elmsize * cnt); - - size = BZ2_bzread((BZFILE *) s->stream_data.p, buf, size); - if (size) - return size / elmsize; + int err; + void *punused; + int nunused; + char unused[BZ_MAX_UNUSED]; + + if (s->stream_data.p) { + size = BZ2_bzRead(&err, ((struct bz *) s->stream_data.p)->b, buf, size); + if (err == BZ_STREAM_END) { + /* end of stream, but not necessarily end of + * file: get unused bits, close stream, and + * open again with the saved unused bits */ + BZ2_bzReadGetUnused(&err, ((struct bz *) s->stream_data.p)->b, &punused, &nunused); + if (err == BZ_OK && + (nunused > 0 || + !feof(((struct bz *) s->stream_data.p)->f))) { + if (nunused > 0) + memcpy(unused, punused, nunused); + BZ2_bzReadClose(&err, ((struct bz *) s->stream_data.p)->b); + ((struct bz *) s->stream_data.p)->b = BZ2_bzReadOpen(&err, ((struct bz *) s->stream_data.p)->f, 0, 0, unused, nunused); + } else { + stream_bzclose(s); + } + } + if (err == BZ_OK) + return size / elmsize; + } return 0; } @@ -814,27 +857,13 @@ static ssize_t stream_bzwrite(stream *s, const void *buf, size_t elmsize, size_t cnt) { int size = (int) (elmsize * cnt); + int err; if (size) { - size = BZ2_bzwrite((BZFILE *) s->stream_data.p, (void *) buf, size); - return size / elmsize; + BZ2_bzWrite(&err, ((struct bz *) s->stream_data.p)->b, (void *) buf, size); + if (err == BZ_OK) + return cnt; } - return cnt; -} - -static void -stream_bzclose(stream *s) -{ - if (s->stream_data.p) - BZ2_bzclose((BZFILE *) s->stream_data.p); - s->stream_data.p = NULL; -} - -static int -stream_bzflush(stream *s) -{ - if (s->access == ST_WRITE) - BZ2_bzflush((BZFILE *) s->stream_data.p); return 0; } @@ -842,17 +871,35 @@ static stream * open_bzstream(const char *filename, const char *flags) { stream *s; - BZFILE *fp; - - if ((s = create_stream(filename)) == NULL) + int err; + struct bz *bzp; + + if ((bzp = malloc(sizeof(struct bz))) == NULL) return NULL; - if ((fp = BZ2_bzopen(filename, flags)) == NULL) + if ((s = create_stream(filename)) == NULL) { + free(bzp); + return NULL; + } + if ((bzp->f = fopen(filename, flags)) == NULL) + s->errnr = MNSTR_OPEN_ERROR; + if (strchr(flags, 'r') != NULL) { + bzp->b = BZ2_bzReadOpen(&err, bzp->f, 0, 0, NULL, 0); + s->access = ST_READ; + if (err == BZ_STREAM_END) { + BZ2_bzReadClose(&err, bzp->b); + bzp->b = NULL; + } + } else { + bzp->b = BZ2_bzWriteOpen(&err, bzp->f, 9, 0, 30); + s->access = ST_WRITE; + } + if (err != BZ_OK) s->errnr = MNSTR_OPEN_ERROR; s->read = stream_bzread; s->write = stream_bzwrite; s->close = stream_bzclose; - s->flush = stream_bzflush; - s->stream_data.p = (void *) fp; + s->flush = NULL; + s->stream_data.p = (void *) bzp; return s; } @@ -865,7 +912,7 @@ open_bzrstream(const char *filename) return NULL; s->type = ST_BIN; if (s->errnr == MNSTR_NO__ERROR && - BZ2_bzread((BZFILE *) s->stream_data.p, (void *) &s->byteorder, sizeof(s->byteorder)) < (int) sizeof(s->byteorder)) { + stream_bzread(s, (void *) &s->byteorder, sizeof(s->byteorder), 1) != 1) { stream_bzclose(s); s->errnr = MNSTR_OPEN_ERROR; } @@ -882,7 +929,7 @@ open_bzwstream_(const char *filename, co s->access = ST_WRITE; s->type = ST_BIN; if (s->errnr == MNSTR_NO__ERROR) - BZ2_bzwrite((BZFILE *) s->stream_data.p, (void *) &s->byteorder, sizeof(s->byteorder)); + stream_bzwrite(s, (void *) &s->byteorder, sizeof(s->byteorder), 1); return s; } diff --git a/monetdb5/extras/jaql/json.c b/monetdb5/extras/jaql/json.c --- a/monetdb5/extras/jaql/json.c +++ b/monetdb5/extras/jaql/json.c @@ -54,35 +54,53 @@ static void json_error(jsonbat *, char * _In_z_ _Printf_format_string_ const char *, ...) __attribute__((__format__(__printf__, 3, 4))); static void -json_error(jsonbat *jb, char *p, const char *format, ...) +json_error(jsonbat *jb, char *n, const char *format, ...) { va_list ap; char message[8096]; size_t len; char around[32]; - size_t off = p - jb->streambuf; + char *p, *q, *start = around; char hadend = 0; va_start(ap, format); len = vsnprintf(message, sizeof(message), format, ap); va_end(ap); - if (off < 13) - off = 13; - off -= 13; - if (snprintf(around, sizeof(around), "%s", jb->streambuf + off) - <= (int)(sizeof(around))) + p = n; + q = around + 13 + 1; + *q = '\0'; + for (; p >= jb->streambuf && q > around; p--) { + if (isspace(*p)) { + if (*q != ' ') + *--q = ' '; + } else if (*p == '\0') { + /* artifact from parse_json_string */ + *--q = '"'; + } else { + *--q = *p; + } + } + start = q; + p = n + 1; + q = around + 13; + for (; *p != '\0' && q - around < (ssize_t)sizeof(around) - 1; p++) { + if (isspace(*p)) { + if (*q != ' ') + *++q = ' '; + } else if (*p == '\0') { + /* artifact from parse_json_string */ + *++q = '"'; + } else { + *++q = *p; + } + } + *++q = '\0'; + if (q - around < (ssize_t)sizeof(around)) hadend = 1; - /* wrap at newline */ - for (p = around; *p != '\0'; p++) - if (*p == '\n' || *p == '\r') - *p = ' '; - /* trim */ - for (--p; p > around && isspace(*p); p--) - *p = '\0'; - for (p = around; *p != '\0' && isspace(*p); p++); + snprintf(message + len, sizeof(message) - len, " at or around '%s%s%s'", - off == 0 ? "" : "...", p, hadend == 0 ? "..." : ""); + start == around ? "..." : "", start, hadend == 0 ? "..." : ""); if (jb->error != NULL) GDKfree(jb->error); @@ -108,7 +126,7 @@ read_from_stream(jsonbat *jb, char **pos } shift = *pos - jb->streambuf; - if (*pos == jb->streambuf + jb->streambuflen) { + if (*pos == jb->streambuf + jb->streambuflen - 1) { size_t rshift = *recall - jb->streambuf; char *newbuf = realloc(jb->streambuf, jb->streambuflen += 8096); if (newbuf == NULL) @@ -124,30 +142,34 @@ read_from_stream(jsonbat *jb, char **pos sret = mnstr_read(jb->is, *pos, 1, jb->streambuflen - shift - 1); if (sret <= 0) return 0; - jb->streambuf[sret] = '\0'; + jb->streambuf[shift + sret] = '\0'; + assert(**pos != '\0'); return sret; } static char * -parse_json_string(jsonbat *jb, oid *v, char pair, char *p) +parse_json_string(jsonbat *jb, oid *v, char pair, char *p, char **recall) { char escape = 0; + char *r = p; char *n = p; char *w = p; - for (; ; p++) { + for (; ; p++, w++) { if (*p == '\0' && (jb->is == NULL || read_from_stream(jb, &p, &n, &w) == 0)) - break; + { + json_error(jb, p, "unexpected end of stream while reading string"); + return NULL; + } switch (*p) { case '\\': if (escape) { *w = '\\'; } else if (w != p) { - *w = *p; + w--; } - w++; escape = !escape; break; case 'b': @@ -156,7 +178,6 @@ parse_json_string(jsonbat *jb, oid *v, c } else if (w != p) { *w = *p; } - w++; escape = 0; break; case 'f': @@ -165,7 +186,6 @@ parse_json_string(jsonbat *jb, oid *v, c } else if (w != p) { *w = *p; } _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list