Changeset: a9c95d2d4caa for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a9c95d2d4caa
Branch: octbugs
Log Message:
Merge with Oct2020 branch.
diffs (truncated from 310 to 300 lines):
diff --git a/NT/mksqlwxs.py b/NT/mksqlwxs.py
--- a/NT/mksqlwxs.py
+++ b/NT/mksqlwxs.py
@@ -151,6 +151,7 @@ def main():
vcpkg.format(r'bin\libcharset.dll'), # for libiconv.dll
vcpkg.format(r'bin\libcrypto-1_1{}.dll'.format(libcrypto)),
vcpkg.format(r'bin\libxml2.dll'),
+ vcpkg.format(r'bin\lz4.dll'),
vcpkg.format(r'bin\lzma.dll'),
vcpkg.format(r'bin\pcre.dll'),
vcpkg.format(r'bin\zlib1.dll')])
@@ -200,8 +201,12 @@ def main():
r'lib\stream.lib',
vcpkg.format(r'lib\libiconv.lib'),
vcpkg.format(r'lib\bz2.lib'),
+ vcpkg.format(r'lib\getopt.lib'),
+ vcpkg.format(r'lib\libcharset.lib'),
vcpkg.format(r'lib\libcrypto.lib'),
vcpkg.format(r'lib\libxml2.lib'),
+ vcpkg.format(r'lib\lz4.lib'),
+ vcpkg.format(r'lib\lzma.lib'),
vcpkg.format(r'lib\pcre.lib'),
vcpkg.format(r'lib\zlib.lib')])
print(r' </Directory>')
diff --git a/common/stream/stdio_stream.c b/common/stream/stdio_stream.c
--- a/common/stream/stdio_stream.c
+++ b/common/stream/stdio_stream.c
@@ -165,6 +165,7 @@ file_fsetpos(stream *restrict s, fpos_t
/* convert a string from UTF-8 to wide characters; the return value is
* freshly allocated */
+#ifdef HAVE__WFOPEN
static wchar_t *
utf8towchar(const char *src)
{
@@ -246,6 +247,8 @@ utf8towchar(const char *src)
return dest;
}
+#else
+
static char *
cvfilename(const char *filename)
{
@@ -281,6 +284,7 @@ cvfilename(const char *filename)
* locale's encoding is not UTF-8) */
return strdup(filename);
}
+#endif
stream *
@@ -297,7 +301,6 @@ open_stream(const char *restrict filenam
{
wchar_t *wfname = utf8towchar(filename);
wchar_t *wflags = utf8towchar(flags);
- (void)cvfilename;
if (wfname != NULL && wflags != NULL)
fp = _wfopen(wfname, wflags);
else
@@ -310,7 +313,6 @@ open_stream(const char *restrict filenam
#else
{
char *fname = cvfilename(filename);
- (void)utf8towchar;
if (fname) {
fp = fopen(fname, flags);
free(fname);
@@ -498,3 +500,24 @@ getFileSize(stream *s)
return (size_t) stb.st_size;
return 0; /* unknown */
}
+
+int
+file_remove(const char *filename)
+{
+ int rc = -1;
+
+#ifdef HAVE__WFOPEN
+ wchar_t *wfname = utf8towchar(filename);
+ if (wfname != NULL) {
+ rc = _wremove(wfname);
+ free(wfname);
+ }
+#else
+ char *fname = cvfilename(filename);
+ if (fname) {
+ rc = remove(fname);
+ free(fname);
+ }
+#endif
+ return rc;
+}
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -851,7 +851,7 @@ open_rstream(const char *filename)
stream *c = compressed_stream(s, 0);
if (c == NULL)
- mnstr_close(s);
+ mnstr_destroy(s);
return c;
}
@@ -870,8 +870,10 @@ open_wstream(const char *filename)
return NULL;
stream *c = compressed_stream(s, 0);
- if (c == NULL)
- mnstr_close(s);
+ if (c == NULL) {
+ mnstr_destroy(s);
+ file_remove(filename);
+ }
return c;
}
@@ -890,7 +892,7 @@ open_rastream(const char *filename)
stream *t = create_text_stream(s);
if (t == NULL)
- mnstr_close(s);
+ mnstr_destroy(s);
return t;
}
@@ -908,8 +910,10 @@ open_wastream(const char *filename)
return NULL;
stream *t = create_text_stream(s);
- if (t == NULL)
- mnstr_close(s);
+ if (t == NULL) {
+ mnstr_destroy(s);
+ file_remove(filename);
+ }
return t;
}
diff --git a/common/stream/stream_internal.h b/common/stream/stream_internal.h
--- a/common/stream/stream_internal.h
+++ b/common/stream/stream_internal.h
@@ -207,6 +207,9 @@ stream *open_stream(const char *restrict
stream *file_stream(const char *name)
__attribute__((__visibility__("hidden")));
+int file_remove(const char *filename)
+ __attribute__((__visibility__("hidden")));
+
/* implementation detail of stdio_stream.c which must be public because
* for example bstream() special cases on it to provide a fast path for file
* i/o.
diff --git a/debian/control b/debian/control
--- a/debian/control
+++ b/debian/control
@@ -158,7 +158,7 @@ Section: libs
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends},
monetdb5-server (= ${source:Version})
-Description: MonetDB5 SQL GIS support module
+Description: MonetDB5 add on module for FITS files
MonetDB is a database management system that is developed from a
main-memory perspective with use of a fully decomposed storage model,
automatic index management, extensibility of data types and search
@@ -190,7 +190,7 @@ Package: monetdb5-server-dev
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends},
monetdb5-server (= ${source:Version}), libmonetdb-dev (= ${source:Version})
-Description: MonetDB database server version 5
+Description: MonetDB database server version 5 development files
MonetDB is a database management system that is developed from a
main-memory perspective with use of a fully decomposed storage model,
automatic index management, extensibility of data types and search
diff --git a/monetdb5/mal/mal_exception.c b/monetdb5/mal/mal_exception.c
--- a/monetdb5/mal/mal_exception.c
+++ b/monetdb5/mal/mal_exception.c
@@ -61,22 +61,39 @@ dupError(const char *err)
static str __attribute__((__format__(__printf__, 3, 0), __returns_nonnull__))
createExceptionInternal(enum malexception type, const char *fcn, const char
*format, va_list ap)
{
- char local[GDKMAXERRLEN];
+ size_t msglen;
int len;
+ char *msg;
+ va_list ap2;
#ifndef NDEBUG
// if there is an error we allow memory allocation once again
GDKsetmallocsuccesscount(-1);
#endif
- len = snprintf(local, GDKMAXERRLEN, "%s:%s:", exceptionNames[type],
fcn);
- len = vsnprintf(local + len, GDKMAXERRLEN - len, format, ap);
- if (len < 0)
+ va_copy(ap2, ap); /* we need to use it twice */
+ msglen = strlen(exceptionNames[type]) + strlen(fcn) + 2;
+ len = vsnprintf(NULL, 0, format, ap); /* count necessary length */
+ if (len < 0) {
TRC_CRITICAL(MAL_SERVER, "called with bad arguments");
- char *q = local;
- for (char *p = strchr(q, '\n'); p; q = p + 1, p = strchr(q, '\n'))
- TRC_ERROR(MAL_SERVER, "%.*s\n", (int) (p - q), q);
- if (*q)
- TRC_ERROR(MAL_SERVER, "%s\n", q);
- return dupError(local);
+ len = 0;
+ }
+ msg = GDKmalloc(msglen + len + 1);
+ if (msg != NULL) {
+ /* the calls below succeed: the arguments have already been
checked */
+ (void) strconcat_len(msg, msglen + 1,
+ exceptionNames[type],
":", fcn, ":", NULL);
+ if (len > 0)
+ (void) vsnprintf(msg + msglen, len + 1, format, ap2);
+ va_end(ap2);
+ char *q = msg;
+ for (char *p = strchr(msg, '\n'); p; q = p + 1, p = strchr(q,
'\n'))
+ TRC_ERROR(MAL_SERVER, "%.*s\n", (int) (p - q), q);
+ if (*q)
+ TRC_ERROR(MAL_SERVER, "%s\n", q);
+ } else {
+ msg = M5OutOfMemory;
+ }
+ va_end(ap2);
+ return msg;
}
/**
@@ -145,38 +162,52 @@ freeException(str msg)
static str __attribute__((__format__(__printf__, 5, 0), __returns_nonnull__))
createMalExceptionInternal(MalBlkPtr mb, int pc, enum malexception type, char
*prev, const char *format, va_list ap)
{
- char buf[GDKMAXERRLEN];
- size_t i;
- str s, fcn;
+ bool addnl = false;
+ const char *s = mb ? getModName(mb) : "unknown";
+ const char *fcn = mb ? getFcnName(mb) : "unknown";
+ size_t msglen;
- s = mb ? getModName(mb) : "unknown";
- fcn = mb ? getFcnName(mb) : "unknown";
- i = 0;
-
- if (prev){
- if( *prev){
- i += snprintf(buf + i, GDKMAXERRLEN - 1 - i, "%s",
prev);
- if( buf[i-1] != '\n')
- buf[i++]= '\n';
+ if (prev) {
+ msglen = strlen(prev);
+ if (msglen > 0 && prev[msglen - 1] != '\n') {
+ addnl = true;
+ msglen++;
}
- i += snprintf(buf + i, GDKMAXERRLEN - 1 - i, "!%s:%s.%s[%d]:",
- exceptionNames[type], s, fcn, pc);
- freeException(prev);
- } else if( type == SYNTAX)
- i += snprintf(buf + i, GDKMAXERRLEN - 1 - i, "%s:",
- exceptionNames[type]);
- else
- i += snprintf(buf + i, GDKMAXERRLEN - 1 - i, "%s:%s.%s[%d]:",
- exceptionNames[type], s, fcn, pc);
- i += vsnprintf(buf + i, GDKMAXERRLEN - 1 - i, format, ap);
- if( buf[i-1] != '\n')
- buf[i++]= '\n';
- buf[i] = '\0';
-
- s = GDKstrdup(buf);
- if (s == NULL) /* make sure we always return
something */
- s = M5OutOfMemory;
- return s;
+ msglen += snprintf(NULL, 0, "!%s:%s.%s[%d]:",
+ exceptionNames[type], s,
fcn, pc);
+ } else if (type == SYNTAX) {
+ msglen = strlen(exceptionNames[type]) + 1;
+ } else {
+ msglen = snprintf(NULL, 0, "%s:%s.%s[%d]:",
+ exceptionNames[type], s, fcn,
pc);
+ }
+ va_list ap2;
+ va_copy(ap2, ap);
+ int len = vsnprintf(NULL, 0, format, ap);
+ if (len < 0)
+ len = 0;
+ char *msg = GDKmalloc(msglen + len + 1);
+ if (msg != NULL) {
+ /* the calls below succeed: the arguments have already been
checked */
+ if (prev) {
+ (void) snprintf(msg, msglen + 1, "%s%s!%s:%s.%s[%d]:",
+ prev, addnl ? "\n" : "",
+ exceptionNames[type],
s, fcn, pc);
+ } else if (type == SYNTAX) {
+ (void) strconcat_len(msg, msglen + 1,
+
exceptionNames[type], ":", NULL);
+ } else {
+ (void) snprintf(msg, msglen + 1, "%s:%s.%s[%d]:",
+ exceptionNames[type],
s, fcn, pc);
+ }
+ if (len > 0)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list