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]

Reply via email to