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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list