Changeset: 27f48e7ab297 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/27f48e7ab297
Modified Files:
clients/Tests/exports.stable.out
clients/mapilib/Tests/tests.md
clients/mapilib/connect_unix.c
clients/mapilib/msettings.c
clients/mapilib/msettings.h
Branch: monetdburl
Log Message:
Allow msetting strings to be non-malloc'ed to enable default values
Use this for sockdir and binary
diffs (truncated from 302 to 300 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -724,7 +724,6 @@ long msettings_connect_binary(const mset
const char *msettings_connect_certhash_digits(const msettings *mp);
long msettings_connect_port(const msettings *mp);
bool msettings_connect_scan(const msettings *mp);
-const char *msettings_connect_sockdir(const msettings *mp);
const char *msettings_connect_tcp(const msettings *mp);
enum msetting_tls_verify msettings_connect_tls_verify(const msettings *mp);
const char *msettings_connect_unix(const msettings *mp);
diff --git a/clients/mapilib/Tests/tests.md b/clients/mapilib/Tests/tests.md
--- a/clients/mapilib/Tests/tests.md
+++ b/clients/mapilib/Tests/tests.md
@@ -258,6 +258,7 @@ EXPECT port=-1
EXPECT database=
EXPECT tableschema=
EXPECT table=
+EXPECT binary=on
```
### sock
@@ -272,6 +273,15 @@ ACCEPT monetdb:///?sock=C:\TEMP\sock
EXPECT sock=C:\TEMP\sock
```
+### sockdir
+
+```test
+EXPECT sockdir=/tmp
+ACCEPT monetdb:///demo?sockdir=/tmp/nonstandard
+EXPECT sockdir=/tmp/nonstandard
+EXPECT connect_unix=/tmp/nonstandard/.s.monetdb.50000
+```
+
### cert
```test
@@ -471,14 +481,8 @@ ACCEPT monetdb:///?binary=0100
EXPECT connect_binary=100
```
-We take empty to be 'on'
-
```test
-ACCEPT monetdb:///?binary=
-EXPECT connect_binary=65535
-```
-
-```test
+REJECT monetdb:///?binary=
REJECT monetdb:///?binary=-1
REJECT monetdb:///?binary=1.0
REJECT monetdb:///?binary=banana
@@ -1129,6 +1133,21 @@ EXPECT connect_tcp=not.localhost
REJECT monetdbs://not.localhost/?sock=/a/path
```
+### sock and sockdir
+
+Sockdir only applies to implicit Unix domain sockets,
+not to ones that are given explicitly
+
+```test
+EXPECT sockdir=/tmp
+EXPECT port=-1
+EXPECT host=
+EXPECT connect_unix=/tmp/.s.monetdb.50000
+SET sockdir=/somewhere/else
+EXPECT connect_unix=/somewhere/else/.s.monetdb.50000
+SET port=12345
+EXPECT connect_unix=/somewhere/else/.s.monetdb.12345
+```
## Legacy URL's
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
@@ -34,7 +34,7 @@ scan_unix_sockets(Mapi mid)
DIR *dir = NULL;
struct dirent *entry;
- const char *sockdir = msettings_connect_sockdir(mid->settings);
+ const char *sockdir = msetting_string(mid->settings, MP_SOCKDIR);
size_t len = strlen(sockdir);
char *namebuf = malloc(len + 50);
if (namebuf == NULL)
diff --git a/clients/mapilib/msettings.c b/clients/mapilib/msettings.c
--- a/clients/mapilib/msettings.c
+++ b/clients/mapilib/msettings.c
@@ -153,6 +153,11 @@ mparm_is_core(mparm parm)
}
}
+struct string {
+ char *str;
+ bool must_free;
+};
+
struct msettings {
// Must match EXACTLY the order of enum mparm
bool dummy_start_bool;
@@ -168,23 +173,23 @@ struct msettings {
long dummy_end_long;
// Must match EXACTLY the order of enum mparm
- char *dummy_start_string;
- char *sock;
- char *sockdir;
- char *cert;
- char *clientkey;
- char *clientcert;
- char *host;
- char *database;
- char *tableschema;
- char *table;
- char *certhash;
- char *user;
- char *password;
- char *language;
- char *schema;
- char *binary;
- char *dummy_end_string;
+ struct string dummy_start_string;
+ struct string sock;
+ struct string sockdir;
+ struct string cert;
+ struct string clientkey;
+ struct string clientcert;
+ struct string host;
+ struct string database;
+ struct string tableschema;
+ struct string table;
+ struct string certhash;
+ struct string user;
+ struct string password;
+ struct string language;
+ struct string schema;
+ struct string binary;
+ struct string dummy_end_string;
char **unknown_parameters;
size_t nr_unknown;
@@ -207,20 +212,8 @@ const msettings msettings_default_values
.timezone = 0,
.replysize = 100,
- .sock = NULL,
- .cert = NULL,
- .clientkey = NULL,
- .clientcert = NULL,
- .host = NULL,
- .database = NULL,
- .tableschema = NULL,
- .table = NULL,
- .certhash = NULL,
- .user = NULL,
- .password = NULL,
- .language = NULL,
- .schema = NULL,
- .binary = NULL,
+ .sockdir = { "/tmp", false },
+ .binary = { "on", false },
.unknown_parameters = NULL,
.nr_unknown = 0,
@@ -262,13 +255,13 @@ msettings *msettings_clone(const msettin
// now we have to very carefully duplicate the strings.
// taking care to only free our own ones if that fails
- char **start = &mp->dummy_start_string;
- char **end = &mp->dummy_end_string;
- char **p = start;
+ struct string *start = &mp->dummy_start_string;
+ struct string *end = &mp->dummy_end_string;
+ struct string *p = start;
while (p < end) {
- if (*p != NULL) {
- *p = strdup(*p);
- if (*p == NULL)
+ if (p->must_free) {
+ p->str = strdup(p->str);
+ if (p->str == NULL)
goto bailout;
}
p++;
@@ -285,8 +278,9 @@ msettings *msettings_clone(const msettin
return mp;
bailout:
- for (char **q = start; q < p; q++)
- free(*q);
+ for (struct string *q = start; q < p; q++)
+ if (q->must_free)
+ free(q->str);
for (size_t i = 0; i < 2 * mp->nr_unknown; i++)
free(mp->unknown_parameters[i]);
free(mp->unix_sock_name_buffer);
@@ -300,8 +294,9 @@ msettings_destroy(msettings *mp)
if (mp == NULL)
return NULL;
- for (char **p = &mp->dummy_start_string + 1; p < &mp->dummy_end_string;
p++) {
- free(*p);
+ for (struct string *p = &mp->dummy_start_string + 1; p <
&mp->dummy_end_string; p++) {
+ if (p->must_free)
+ free(p->str);
}
for (size_t i = 0; i < mp->nr_unknown; i++) {
free(mp->unknown_parameters[2 * i]);
@@ -320,10 +315,10 @@ msetting_string(const msettings *mp, mpa
if (mparm_classify(parm) != MPCLASS_STRING)
FATAL();
int i = parm - MP__STRING_START;
- char * const *p = &mp->dummy_start_string + 1 + i;
+ struct string const *p = &mp->dummy_start_string + 1 + i;
if (p >= &mp->dummy_end_string)
FATAL();
- char *s = *p;
+ char *s = p->str;
if (s == NULL) {
if (parm == MP_LANGUAGE)
@@ -344,15 +339,17 @@ msetting_set_string(msettings *mp, mparm
if (mparm_classify(parm) != MPCLASS_STRING)
FATAL();
int i = parm - MP__STRING_START;
- char **p = &mp->dummy_start_string + 1 + i;
+ struct string *p = &mp->dummy_start_string + 1 + i;
if (p >= &mp->dummy_end_string)
FATAL();
char *v = strdup(value);
if (!v)
return "malloc failed";
- free(*p);
- *p = v;
+ if (p->must_free)
+ free(p->str);
+ p->str = v;
+ p->must_free = true;
switch (parm) {
case MP_USER:
@@ -676,7 +673,7 @@ msettings_validate(msettings *mp, char *
}
// compute this here so the getter function can take const msettings*
- const char *sockdir = msettings_connect_sockdir(mp);
+ const char *sockdir = msetting_string(mp, MP_SOCKDIR);
long effective_port = msettings_connect_port(mp);
free(mp->unix_sock_name_buffer);
mp->unix_sock_name_buffer = allocprintf("%s/.s.monetdb.%ld", sockdir,
effective_port);
@@ -707,16 +704,6 @@ msettings_connect_scan(const msettings *
}
const char *
-msettings_connect_sockdir(const msettings *mp)
-{
- const char *dir = msetting_string(mp, MP_SOCKDIR);
- if (dir[0] != '\0')
- return dir;
- else
- return "/tmp";
-}
-
-const char *
msettings_connect_unix(const msettings *mp)
{
assert(mp->validated);
@@ -792,10 +779,6 @@ msettings_connect_binary(const msettings
const long sufficiently_large = 65535;
const char *binary = msetting_string(mp, MP_BINARY);
- // empty is same as true
- if (binary[0] == '\0')
- return sufficiently_large;
-
// may be bool
int b = msetting_parse_bool(binary);
if (b == 0)
@@ -806,7 +789,7 @@ msettings_connect_binary(const msettings
char *end;
long level = strtol(binary, &end, 10);
- if (*end == '\0')
+ if (end != binary && *end == '\0')
return level;
return -1;
diff --git a/clients/mapilib/msettings.h b/clients/mapilib/msettings.h
--- a/clients/mapilib/msettings.h
+++ b/clients/mapilib/msettings.h
@@ -140,7 +140,6 @@ enum msetting_tls_verify {
verify_hash,
};
mapi_export bool msettings_connect_scan(const msettings *mp);
-mapi_export const char *msettings_connect_sockdir(const msettings *mp);
mapi_export const char *msettings_connect_unix(const msettings *mp);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]