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