Changeset: ead4a7595cee for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ead4a7595cee
Added Files:
        sql/test/BugTracker-2013/Tests/copy-into-decimal.Bug-3265.sql
        sql/test/BugTracker-2013/Tests/copy-into-decimal.Bug-3265.stable.err
        sql/test/BugTracker-2013/Tests/copy-into-decimal.Bug-3265.stable.out
        sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.SQL.py
        sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.stable.err
        sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.stable.out
Modified Files:
        clients/mapilib/mapi.c
        common/stream/stream.c
        common/stream/stream.h
        gdk/gdk_atoms.c
        gdk/gdk_bbp.c
        gdk/gdk_logger.c
        gdk/gdk_utils.c
        geom/monetdb5/geom.c
        monetdb5/modules/atoms/blob.c
        monetdb5/modules/atoms/url.c
        monetdb5/modules/mal/remote.c
        sql/backends/monet5/datacell/actuator.c
        sql/backends/monet5/datacell/receptor.c
        sql/backends/monet5/sql_result.c
        sql/test/BugTracker-2013/Tests/All
Branch: default
Log Message:

Merge with Feb2013 branch.


diffs (truncated from 1991 to 300 lines):

diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -1036,8 +1036,8 @@ static int mapi_initialized = 0;
        do {                                                            \
                if ((s) == NULL || mnstr_errnr(s)) {                    \
                        mapi_log_record(mid,msg);                       \
-                       mapi_log_record(mid,f);                 \
-                       close_connection(mid);                  \
+                       mapi_log_record(mid,f);                         \
+                       close_connection(mid);                          \
                        mapi_setError((mid), (msg), (f), MTIMEOUT);     \
                        return (e);                                     \
                }                                                       \
@@ -3290,12 +3290,12 @@ read_line(Mapi mid)
                if (mid->trace == MAPI_TRACE)
                        printf("fetch next block: start at:%d\n", mid->blk.end);
                len = mnstr_read(mid->from, mid->blk.buf + mid->blk.end, 1, 
BLOCK);
+               check_stream(mid, mid->from, "Connection terminated", 
"read_line", (mid->blk.eos = 1, (char *) 0));
                if (mid->tracelog) {
                        mapi_log_header(mid, "R");
                        mnstr_write(mid->tracelog, mid->blk.buf + mid->blk.end, 
1, len);
                        mnstr_flush(mid->tracelog);
                }
-               check_stream(mid, mid->from, "Connection terminated", 
"read_line", (mid->blk.eos = 1, (char *) 0));
                mid->blk.buf[mid->blk.end + len] = 0;
                if (mid->trace == MAPI_TRACE) {
                        printf("got next block: length:" SSZFMT "\n", len);
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -174,7 +174,7 @@ mnstr_init(void)
 /* #define BSTREAM_DEBUG 1 */
 
 /* Read at most cnt elements of size elmsize from the stream.  Returns
-   the number of elements actually read. */
+ * the number of elements actually read or < 0 on failure. */
 ssize_t
 mnstr_read(stream *s, void *buf, size_t elmsize, size_t cnt)
 {
@@ -183,12 +183,13 @@ mnstr_read(stream *s, void *buf, size_t 
 #endif
        assert(s->access == ST_READ);
        if (s->errnr)
-               return s->errnr;
+               return -1;
        return (*s->read) (s, buf, elmsize, cnt);
 }
 
-/* Read one line (seperated by \n) of atmost maxcnt characters from the 
stream. 
-   Returns the number of characters actually read, includes the trailing \n */
+/* Read one line (seperated by \n) of atmost maxcnt characters from
+ * the stream.  Returns the number of characters actually read,
+ * includes the trailing \n */
 ssize_t
 mnstr_readline(stream *s, void *buf, size_t maxcnt)
 {
@@ -197,7 +198,7 @@ mnstr_readline(stream *s, void *buf, siz
 #endif
        assert(s->access == ST_READ);
        if (s->errnr)
-               return s->errnr;
+               return -1;
        if (!s->readline) {
                size_t len = 0;
                char *b = buf, *start = buf;
@@ -206,15 +207,15 @@ mnstr_readline(stream *s, void *buf, siz
                                break;
                }
                if (s->errnr)
-                       return s->errnr;
+                       return -1;
                return (ssize_t) (start - b);
        } else
                return (*s->readline) (s, buf, maxcnt);
 }
 
 /* Write cnt elements of size elmsize to the stream.  Returns the
-   number of elements actually written.  If elmsize or cnt equals zero,
-   returns cnt. */
+ * number of elements actually written.  If elmsize or cnt equals zero,
+ * returns cnt. */
 ssize_t
 mnstr_write(stream *s, const void *buf, size_t elmsize, size_t cnt)
 {
@@ -223,7 +224,7 @@ mnstr_write(stream *s, const void *buf, 
 #endif
        assert(s->access == ST_WRITE);
        if (s->errnr)
-               return s->errnr;
+               return -1;
        return (*s->write) (s, buf, elmsize, cnt);
 }
 
@@ -265,6 +266,7 @@ mnstr_error(stream *s)
        return (*s->error) (s);
 }
 
+/* flush buffer, return 0 on success, non-zero on failure */
 int
 mnstr_flush(stream *s)
 {
@@ -275,12 +277,13 @@ mnstr_flush(stream *s)
 #endif
        assert(s->access == ST_WRITE);
        if (s->errnr)
-               return s->errnr;
+               return -1;
        if (s->flush)
                return (*s->flush) (s);
        return 0;
 }
 
+/* sync file to disk, return 0 on success, non-zero on failure */
 int
 mnstr_fsync(stream *s)
 {
@@ -291,7 +294,7 @@ mnstr_fsync(stream *s)
 #endif
        assert(s->access == ST_WRITE);
        if (s->errnr)
-               return s->errnr;
+               return -1;
        if (s->fsync)
                return (*s->fsync) (s);
        return 0;
@@ -306,7 +309,7 @@ mnstr_fgetpos(stream *s, lng *p)
        printf("fgetpos %s\n", s->name ? s->name : "<unnamed>");
 #endif
        if (s->errnr)
-               return s->errnr;
+               return -1;
        if (s->fgetpos)
                return (*s->fgetpos) (s, p);
        return 0;
@@ -321,7 +324,7 @@ mnstr_fsetpos(stream *s, lng p)
        printf("fsetpos %s\n", s->name ? s->name : "<unnamed>");
 #endif
        if (s->errnr)
-               return s->errnr;
+               return -1;
        if (s->fsetpos)
                return (*s->fsetpos) (s, p);
        return 0;
@@ -494,8 +497,10 @@ file_read(stream *s, void *buf, size_t e
 
        if (!feof(fp)) {
                rc = fread(buf, elmsize, cnt, fp);
-               if (ferror(fp))
+               if (ferror(fp)) {
                        s->errnr = MNSTR_READ_ERROR;
+                       return -1;
+               }
        }
        return (ssize_t) rc;
 }
@@ -506,8 +511,10 @@ file_write(stream *s, const void *buf, s
        if (elmsize && cnt) {
                size_t rc = fwrite(buf, elmsize, cnt, (FILE *) 
s->stream_data.p);
 
-               if (rc < cnt)
+               if (ferror((FILE *) s->stream_data.p)) {
                        s->errnr = MNSTR_WRITE_ERROR;
+                       return -1;
+               }
                return (ssize_t) rc;
        }
        return (ssize_t) cnt;
@@ -537,7 +544,7 @@ file_flush(stream *s)
 
        if (s->access == ST_WRITE && fflush(fp) < 0) {
                s->errnr = MNSTR_WRITE_ERROR;
-               return 1;
+               return -1;
        }
        return 0;
 }
@@ -562,7 +569,7 @@ file_fsync(stream *s)
 #endif
            ) {
                s->errnr = MNSTR_WRITE_ERROR;
-               return 1;
+               return -1;
        }
        return 0;
 }
@@ -581,7 +588,7 @@ file_fgetpos(stream *s, lng *p)
        *p = (lng) ftell(fp);   /* returns long */
 #endif
 #endif
-       return 0;
+       return *p < 0 ? -1 : 0;
 }
 
 static int
@@ -657,11 +664,15 @@ stream_gzread(stream *s, void *buf, size
 {
        gzFile fp = (gzFile) s->stream_data.p;
        int size = (int) (elmsize * cnt);
+       int err;
 
        if (!gzeof(fp)) {
                size = gzread(fp, buf, size);
-               if (size)
-                       return (ssize_t) (size / elmsize);
+               if (gzerror(fp, &err) != NULL) {
+                       s->errnr = MNSTR_READ_ERROR;
+                       return -1;
+               }
+               return (ssize_t) (size / elmsize);
        }
        return 0;
 }
@@ -669,10 +680,16 @@ stream_gzread(stream *s, void *buf, size
 static ssize_t
 stream_gzwrite(stream *s, const void *buf, size_t elmsize, size_t cnt)
 {
+       gzFile fp = (gzFile) s->stream_data.p;
        int size = (int) (elmsize * cnt);
+       int err;
 
        if (size) {
-               size = gzwrite((gzFile) s->stream_data.p, buf, size);
+               size = gzwrite(fp, buf, size);
+               if (gzerror(fp, &err) != NULL) {
+                       s->errnr = MNSTR_WRITE_ERROR;
+                       return -1;
+               }
                return (ssize_t) (size / elmsize);
        }
        return (ssize_t) cnt;
@@ -689,8 +706,9 @@ stream_gzclose(stream *s)
 static int
 stream_gzflush(stream *s)
 {
-       if (s->access == ST_WRITE)
-               gzflush((gzFile) s->stream_data.p, Z_SYNC_FLUSH);
+       if (s->access == ST_WRITE &&
+           gzflush((gzFile) s->stream_data.p, Z_SYNC_FLUSH) != Z_OK)
+               return -1;
        return 0;
 }
 
@@ -737,8 +755,11 @@ open_gzwstream_(const char *filename, co
                return NULL;
        s->access = ST_WRITE;
        s->type = ST_BIN;
-       if (s->errnr == MNSTR_NO__ERROR)
-               gzwrite((gzFile) s->stream_data.p, (void *) &s->byteorder, 
sizeof(s->byteorder));
+       if (s->errnr == MNSTR_NO__ERROR &&
+           gzwrite((gzFile) s->stream_data.p, (void *) &s->byteorder, 
sizeof(s->byteorder)) < (int) sizeof(s->byteorder)) {
+               stream_gzclose(s);
+               s->errnr = MNSTR_OPEN_ERROR;
+       }
        return s;
 }
 
@@ -847,8 +868,11 @@ stream_bzread(stream *s, void *buf, size
                                stream_bzclose(s);
                        }
                }
-               if (err == BZ_OK)
-                       return size / elmsize;
+               if (err != BZ_OK) {
+                       s->errnr = MNSTR_READ_ERROR;
+                       return -1;
+               }
+               return size / elmsize;
        }
        return 0;
 }
@@ -861,8 +885,11 @@ stream_bzwrite(stream *s, const void *bu
 
        if (size) {
                BZ2_bzWrite(&err, ((struct bz *) s->stream_data.p)->b, (void *) 
buf, size);
-               if (err == BZ_OK)
-                       return cnt;
+               if (err != BZ_OK) {
+                       s->errnr = MNSTR_WRITE_ERROR;
+                       return -1;
+               }
+               return cnt;
        }
        return 0;
 }
@@ -928,8 +955,11 @@ open_bzwstream_(const char *filename, co
                return NULL;
        s->access = ST_WRITE;
        s->type = ST_BIN;
-       if (s->errnr == MNSTR_NO__ERROR)
-               stream_bzwrite(s, (void *) &s->byteorder, sizeof(s->byteorder), 
1);
+       if (s->errnr == MNSTR_NO__ERROR &&
+           stream_bzwrite(s, (void *) &s->byteorder, sizeof(s->byteorder), 1) 
!= 1) {
+               stream_bzclose(s);
+               s->errnr = MNSTR_OPEN_ERROR;
+       }
        return s;
 }
 
@@ -1004,18 +1034,14 @@ open_rstream(const char *filename)
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to