Changeset: c74f5672c1b5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c74f5672c1b5
Modified Files:
        clients/examples/C/testsfile.c
        clients/mapilib/connect.c
        clients/mapilib/connect_unix.c
        clients/mapilib/mapi.c
        clients/mapilib/msettings.c
        clients/mapilib/msettings.h
        clients/mapilib/msettings_internal.h
        clients/mapilib/parseurl.c
        clients/odbc/driver/SQLDriverConnect.c
        sql/backends/monet5/vaults/monetdb/monetdb.c
Branch: odbc_loader
Log Message:

Change msettings api: do not return allocated strings


diffs (truncated from 500 to 300 lines):

diff --git a/clients/examples/C/testsfile.c b/clients/examples/C/testsfile.c
--- a/clients/examples/C/testsfile.c
+++ b/clients/examples/C/testsfile.c
@@ -31,33 +31,26 @@ static msettings *mp = NULL;
 static bool
 handle_parse_command(const char *location, char *url)
 {
-       char *errmsg = NULL;
-       bool ok = msettings_parse_url(mp, url, &errmsg);
-       if (!ok) {
-               assert(errmsg);
-               fprintf(stderr, "%s: %s\n", location, errmsg);
-               free(errmsg);
-               return false;
-       }
-       return true;
+       const char *errmsg = msettings_parse_url(mp, url);
+       if (!errmsg)
+               return true;
+
+       fprintf(stderr, "%s: %s\n", location, errmsg);
+       return false;
 }
 
 static bool
 handle_accept_command(const char *location, char *url)
 {
-       char *errmsg = NULL;
-       bool ok = msettings_parse_url(mp, url, &errmsg);
-       if (!ok) {
-               assert(errmsg);
+       const char *errmsg = msettings_parse_url(mp, url);
+       if (errmsg) {
                fprintf(stderr, "%s: %s\n", location, errmsg);
-               free(errmsg);
                return false;
        }
 
-       char *msg = NULL;
-       if (!msettings_validate(mp, &msg)) {
+       const char *msg = msettings_validate(mp);
+       if (msg != NULL) {
                fprintf(stderr, "%s: URL invalid: %s\n", location, msg);
-               free(msg);
                return false;
        }
        return true;
@@ -66,13 +59,11 @@ handle_accept_command(const char *locati
 static bool
 handle_reject_command(const char *location, char *url)
 {
-       bool ok = msettings_parse_url(mp, url, NULL);
-       if (!ok)
+       const char *errmsg = msettings_parse_url(mp, url);
+       if (errmsg)
                return true;
 
-       char *msg = NULL;
-       if (!msettings_validate(mp, &msg)) {
-               free(msg);
+       if (msettings_validate(mp) != NULL) {
                return true;
        }
 
@@ -93,11 +84,10 @@ handle_set_command(const char *location,
 
 static bool
 ensure_valid(const char *location) {
-       char *msg = NULL;
-       if (msettings_validate(mp, &msg))
+       const char *msg = msettings_validate(mp);
+       if (msg == NULL)
                return true;
        fprintf(stderr, "%s: invalid parameter state: %s\n", location, msg);
-       free(msg);
        return false;
 }
 
@@ -209,9 +199,7 @@ handle_expect_command(const char *locati
                }
                bool expected_valid = x > 0;
 
-               char * msg = NULL;
-               bool actually_valid = msettings_validate(mp, &msg);
-               free(msg);
+               bool actually_valid = msettings_validate(mp) == NULL;
                if (actually_valid != expected_valid) {
                        fprintf(stderr, "%s: expected '%s', found '%s'\n",
                                location,
diff --git a/clients/mapilib/connect.c b/clients/mapilib/connect.c
--- a/clients/mapilib/connect.c
+++ b/clients/mapilib/connect.c
@@ -84,10 +84,9 @@ scan_unix_sockets(Mapi mid)
 MapiMsg
 mapi_reconnect(Mapi mid)
 {
-       char *err = NULL;
-       if (!msettings_validate(mid->settings, &err)) {
+       const char *err = msettings_validate(mid->settings);
+       if (err) {
                mapi_setError(mid, err, __func__, MERROR);
-               free(err);
                return MERROR;
        }
 
@@ -103,18 +102,16 @@ mapi_reconnect(Mapi mid)
 static MapiMsg
 scan_sockets(Mapi mid)
 {
+       msettings_error errmsg;
+
        if (scan_unix_sockets(mid) == MOK)
                return MOK;
 
-       // When the Unix sockets have been scanned we can freely modify 
'original'.
-       msettings_error errmsg = msetting_set_string(mid->settings, MP_HOST, 
"localhost");
-       char *allocated_errmsg = NULL;
-       if (!errmsg && !msettings_validate(mid->settings, &allocated_errmsg)) {
-               errmsg = allocated_errmsg;
-       }
+       errmsg = msetting_set_string(mid->settings, MP_HOST, "localhost");
+       if (!errmsg)
+               errmsg = msettings_validate(mid->settings);
        if (errmsg) {
                MapiMsg err = mapi_setError(mid, errmsg, __func__, MERROR);
-               free(allocated_errmsg);
                return err;
        }
        return establish_connection(mid);
@@ -823,18 +820,17 @@ mapi_handshake(Mapi mid)
                        /* we only implement following the first */
                        char *red = mid->redirects[0];
 
-                       char *error_message = NULL;
-                       if (!msettings_parse_url(mid->settings, red, 
&error_message)
-                           || !msettings_validate(mid->settings, 
&error_message)
+                       const char *error_message = NULL;
+                       if ((error_message = msettings_parse_url(mid->settings, 
red))
+                           || (error_message = 
msettings_validate(mid->settings))
                        ) {
                                mapi_close_handle(hdl);
                                close_connection(mid);
                                MapiMsg err = mapi_printError(
                                        mid, __func__, MERROR,
                                        "%s: %s",
-                                       error_message ? error_message : 
"invalid redirect",
+                                       error_message,
                                        red);
-                               free(error_message);
                                return err;
                        }
 
diff --git a/clients/mapilib/connect_unix.c b/clients/mapilib/connect_unix.c
--- a/clients/mapilib/connect_unix.c
+++ b/clients/mapilib/connect_unix.c
@@ -91,13 +91,10 @@ scan_unix_sockets(Mapi mid)
                                return mapi_setError(mid, "malloc failed", 
__func__, MERROR);
                        }
                        msettings_error errmsg = 
msetting_set_long(mid->settings, MP_PORT, candidates[i].port);
-                       char *allocated_errmsg = NULL;
-                       if (!errmsg && !msettings_validate(mid->settings, 
&allocated_errmsg)) {
-                               errmsg = allocated_errmsg;
-                       }
+                       if (!errmsg)
+                               errmsg = msettings_validate(mid->settings);
                        if (errmsg) {
                                mapi_setError(mid, errmsg, __func__, MERROR);
-                               free(allocated_errmsg);
                                free(namebuf);
                                msettings_destroy(mid->settings);
                                mid->settings = original;
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -1923,11 +1923,9 @@ mapi_mapiuri(const char *url, const char
                return mid;
        }
 
-       char *error_message = NULL;
-       if (!msettings_parse_url(mid->settings, url, &error_message)) {
-               char *msg = error_message ? error_message : "malloc failed";
-               mapi_setError(mid, msg, __func__, MERROR);
-               free(error_message);
+       const char *error_message = msettings_parse_url(mid->settings, url);
+       if (error_message) {
+               mapi_setError(mid, error_message, __func__, MERROR);
                return mid;
        }
 
diff --git a/clients/mapilib/msettings.c b/clients/mapilib/msettings.c
--- a/clients/mapilib/msettings.c
+++ b/clients/mapilib/msettings.c
@@ -38,7 +38,6 @@ msettings_malloc_failed(msettings_error 
 }
 
 
-
 int msetting_parse_bool(const char *text)
 {
        static struct { const char *word; bool value; } variants[] = {
@@ -298,10 +297,7 @@ msettings_destroy(msettings *mp)
        return NULL;
 }
 
-static const char *format_error(msettings *mp, const char *fmt, ...)
-       __attribute__((__format__(__printf__, 2, 3)));
-
-static const char *
+const char *
 format_error(msettings *mp, const char *fmt, ...)
 {
        va_list ap;
@@ -592,11 +588,11 @@ validate_identifier(const char *name)
        return true;
 }
 
-bool
-msettings_validate(msettings *mp, char **errmsg)
+msettings_error
+msettings_validate(msettings *mp)
 {
        if (mp->validated)
-               return true;
+               return NULL;
 
        // 1. The parameters have the types listed in the table in [Section
        //    Parameters](#parameters).
@@ -604,11 +600,10 @@ msettings_validate(msettings *mp, char *
 
        // 2. At least one of **sock** and **host** must be empty.
        if (nonempty(mp, MP_SOCK) && nonempty(mp, MP_HOST)) {
-               *errmsg = allocprintf(
+               return format_error(mp,
                        "With sock='%s', host must be 'localhost', not '%s'",
                        msetting_string(mp, MP_SOCK),
                        msetting_string(mp, MP_HOST));
-               return false;
        }
 
        // 3. The string parameter **binary** must either parse as a boolean or 
as a
@@ -618,28 +613,25 @@ msettings_validate(msettings *mp, char *
        long level = msettings_connect_binary(mp);
        mp->validated = false;
        if (level < 0) {
-               *errmsg = allocprintf("invalid value '%s' for parameter 
'binary'", msetting_string(mp, MP_BINARY));
-               return false;
+               return format_error(mp, "invalid value '%s' for parameter 
'binary'", msetting_string(mp, MP_BINARY));
        }
 
        // 4. If **sock** is not empty, **tls** must be 'off'.
        if (nonempty(mp, MP_SOCK) && msetting_bool(mp, MP_TLS)) {
-               *errmsg = allocprintf("TLS cannot be used with Unix domain 
sockets");
-               return false;
+               return format_error(mp, "TLS cannot be used with Unix domain 
sockets");
        }
 
        // 5. If **certhash** is not empty, it must be of the form 
`sha256:hexdigits`
        //    where hexdigits is a non-empty sequence of 0-9, a-f, A-F and 
colons.
        const char *certhash_msg = validate_certhash(mp);
        if (certhash_msg) {
-               *errmsg = strdup(certhash_msg);
-               return false;
+               return format_error(mp, "%s", certhash_msg);
        }
+
        // 6. If **tls** is 'off', **cert** and **certhash** must be 'off' as 
well.
        if (nonempty(mp, MP_CERT) || nonempty(mp, MP_CERTHASH))
                if (!msetting_bool(mp, MP_TLS)) {
-                       *errmsg = strdup("'cert' and 'certhash' can only be 
used with monetdbs://");
-                       return false;
+                       return format_error(mp, "'cert' and 'certhash' can only 
be used with monetdbs://");
                }
 
        // 7. Parameters **database**, **tableschema** and **table** must 
consist only of
@@ -647,32 +639,27 @@ msettings_validate(msettings *mp, char *
        //    start with a dash.
        const char *database = msetting_string(mp, MP_DATABASE);
        if (!validate_identifier(database)) {
-               *errmsg = allocprintf("invalid database name '%s'", database);
-               return false;
+               return format_error(mp, "invalid database name '%s'", database);
        }
        const char *tableschema = msetting_string(mp, MP_TABLESCHEMA);
        if (!validate_identifier(tableschema)) {
-               *errmsg = allocprintf("invalid schema name '%s'", tableschema);
-               return false;
+               return format_error(mp, "invalid schema name '%s'", 
tableschema);
        }
        const char *table = msetting_string(mp, MP_TABLE);
        if (!validate_identifier(table)) {
-               *errmsg = allocprintf("invalid table name '%s'", table);
-               return false;
+               return format_error(mp, "invalid table name '%s'", table);
        }
 
        // 8. Parameter **port** must be -1 or in the range 1-65535.
        long port = msetting_long(mp, MP_PORT);
        bool port_ok = (port == -1 || (port >= 1 && port <= 65535));
        if (!port_ok) {
-               *errmsg = allocprintf("invalid port '%ld'", port);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to