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 -- [email protected]
To unsubscribe send an email to [email protected]