Changeset: f1d5c034b558 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f1d5c034b558
Modified Files:
        sql/server/rel_remote.c
        sql/server/rel_remote.h
        sql/server/rel_schema.c
Branch: odbc_loader
Log Message:

Let the mapiuri_valid/uri/schema/table use msettings

So they can handle all urls.

This changes the signature of mapiuri_valid().


diffs (198 lines):

diff --git a/sql/server/rel_remote.c b/sql/server/rel_remote.c
--- a/sql/server/rel_remote.c
+++ b/sql/server/rel_remote.c
@@ -45,131 +45,56 @@ sa_msettings_create(allocator *sa)
 #define monetdb_prefix "monetdb"
 
 int
-mapiuri_valid( const char *uri)
+mapiuri_valid( const char *uri, allocator *sa)
 {
-       int i = 0, l = 0;
-       const char *p = uri;
-
-       if (strncmp(p, mapi_prefix, strlen(mapi_prefix)) == 0)
-               p += strlen(mapi_prefix);
-       if (strncmp(p, monetdb_prefix, strlen(monetdb_prefix)))
-               return 0;
-       p += strlen(monetdb_prefix);
-       if (p[0] == 's')
-               p++;
-       if (p[0] != ':' || p[1] != '/' || p[2] != '/')
-               return 0;
-       p += 3;
-       /* optional host (todo limit to valid hostnames ??) */
-       if (*p == '[') { //check for IPv6 addresses
-               for (; *p; p++) {
-                       if (*p == ']')
-                               break;
-               }
-       }
-       if (!p)
-               return 0;
-       for (; *p; p++) {
-               if (*p == ':' || *p == '/')
-                       break;
-       }
-       if (!p)
-               return 0;
-       if (*p == ':') {
-               char *x;
-               int i = strtol(p+1, &x, 10);
-
-               if (!x || i < 0 || i >= 64*1024)
-                       return 0;
-               p = x;
-       }
-       if (*p != '/')
-               return 0;
-       p++;
-       /* now find at most 2 '/'s, with some string in between */
-       for(; *p; p++, l++) {
-               if (*p == '/') {
-                       if (l == 0) /* no string in between */
-                               return 0;
-                       if (i == 2) /* 3 parts (ie database/schema/table) */
-                               return 0;
-                       i++;
-                       l=0;
-               }
-       }
-       if (i == 0 && l == 0) /* missing database name */
-               return 0;
-       return 1;
+       msettings *mp = sa_msettings_create(sa);
+       return msettings_parse_url(mp, uri) == NULL;
 }
 
 /* assume valid uri's next functions */
 
-/* mapiuri_uri prefix including database name */
+/* strip schema- and table name from uri  */
 const char *
 mapiuri_uri( const char *uri, allocator *sa)
 {
-       const char *p = uri, *b = uri, *e;
-
-       p = strchr(p, '/')+1;
-       p++;
-       e = p = strchr(p, '/');
-       e = strchr(p+1, '/');
-       if (e)
-               return sa_strndup(sa, b, e - b);
-       else
-               return sa_strdup(sa, b);
-}
+       msettings *mp = sa_msettings_create(sa);
+       if (!mp || msettings_parse_url(mp, uri) != NULL)
+               return NULL;
+       msetting_set_string(mp, MP_TABLESCHEMA, "");
+       msetting_set_string(mp, MP_TABLE, "");
 
-const char *
-mapiuri_database( const char *uri, allocator *sa)
-{
-       const char *p = uri, *b, *e;
+       size_t buffer_size = strlen(uri) + 1;
+       do {
+               char *buffer = sa_alloc(sa, buffer_size);
+               if (!buffer)
+                       return NULL;
+               size_t needed = msettings_write_url(mp, buffer, buffer_size);
+               if (needed + 1 <= buffer_size)
+                       return buffer;
+               // it's unlikely but remotely possible that the url as written 
by
+               // msettings_write_url is longer, for example because it 
escapes some
+               // characters that were not escaped in the original
+               buffer_size = needed + 1;
+       } while (1);
 
-       p = strchr(p, '/')+1;
-       p++;
-       b = p = strchr(p, '/')+1;
-       e = strchr(p, '/');
-
-       if (e) {
-               return sa_strndup(sa, b, e - b);
-       } else {
-               return sa_strdup(sa, b);
-       }
 }
 
 const char *
 mapiuri_schema( const char *uri, allocator *sa, const char *fallback)
 {
-       const char *p = uri, *b, *e;
-
-       p = strchr(p, '/')+1;
-       p = strchr(p+1, '/');
-       p = strchr(p+1, '/');
-       if (!p)
+       msettings *mp = sa_msettings_create(sa);
+       if (!mp || msettings_parse_url(mp, uri) != NULL)
                return fallback;
-       b = ++p;
-       e = strchr(p, '/');
-
-       if (e) {
-               return sa_strndup(sa, b, e - b);
-       } else {
-               return sa_strdup(sa, b);
-       }
+       const char *schema = msetting_string(mp, MP_TABLESCHEMA);
+       return schema[0] ? schema : fallback;
 }
 
 const char *
 mapiuri_table( const char *uri, allocator *sa, const char *fallback)
 {
-       const char *p = uri, *b;
-
-       p = strchr(p, '/')+1;
-       p = strchr(p+1, '/');
-       p = strchr(p+1, '/');
-       if (!p)
+       msettings *mp = sa_msettings_create(sa);
+       if (!mp || msettings_parse_url(mp, uri) != NULL)
                return fallback;
-       p = strchr(p+1, '/');
-       if (!p)
-               return fallback;
-       b = ++p;
-       return sa_strdup(sa, b);
+       const char *schema = msetting_string(mp, MP_TABLE);
+       return schema[0] ? schema : fallback;
 }
diff --git a/sql/server/rel_remote.h b/sql/server/rel_remote.h
--- a/sql/server/rel_remote.h
+++ b/sql/server/rel_remote.h
@@ -19,7 +19,7 @@
 // maybe this needs to be somewhere more global?
 extern msettings *sa_msettings_create(allocator *sa);
 
-sql_export int mapiuri_valid( const char *uri);
+sql_export int mapiuri_valid( const char *uri, allocator *sa);
 extern const char *mapiuri_uri(const char *uri, allocator *sa);
 extern const char *mapiuri_database(const char *uri, allocator *sa);
 extern const char *mapiuri_schema(const char *uri, allocator *sa, const char 
*fallback);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -1543,7 +1543,7 @@ rel_create_table(sql_query *query, int t
                int res = LOG_OK;
 
                if (tt == tt_remote) {
-                       if (!mapiuri_valid(loc))
+                       if (!mapiuri_valid(loc, sql->sa))
                                return sql_error(sql, 02, SQLSTATE(42000) "%s 
TABLE: incorrect uri '%s' for remote table '%s'", action, loc, name);
                        res = mvc_create_remote(&t, sql, s, name, 
SQL_DECLARED_TABLE, loc);
                } else {
@@ -1599,7 +1599,7 @@ rel_create_table(sql_query *query, int t
 
                /* create table */
                if (tt == tt_remote) {
-                       if (!mapiuri_valid(loc))
+                       if (!mapiuri_valid(loc, sql->sa))
                                return sql_error(sql, 02, SQLSTATE(42000) "%s 
TABLE: incorrect uri '%s' for remote table '%s'", action, loc, name);
                        if ((t = mvc_create_remote_as_subquery(sql, sq, s, 
name, column_spec, loc, (temp == SQL_DECLARED_TABLE)?"DECLARE TABLE":"CREATE 
TABLE")) == NULL) {
                                rel_destroy(sq);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to