Changeset: b6ed319a21c4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b6ed319a21c4
Modified Files:
        sql/backends/monet5/vaults/monetdb/monetdb.c
Branch: odbc_loader
Log Message:

Normalize url in monetdb loader


diffs (106 lines):

diff --git a/sql/backends/monet5/vaults/monetdb/monetdb.c 
b/sql/backends/monet5/vaults/monetdb/monetdb.c
--- a/sql/backends/monet5/vaults/monetdb/monetdb.c
+++ b/sql/backends/monet5/vaults/monetdb/monetdb.c
@@ -36,8 +36,8 @@ static char *sql_template(allocator *sa,
 
 typedef struct mdb_loader_t {
        char *uri;
-       char *sname;
-       char *tname;
+       const char *sname;
+       const char *tname;
 } mdb_loader_t;
 
 
@@ -51,31 +51,29 @@ typedef struct mdb_loader_t {
  * Fill the list res_exps, with one result expressions per resulting column.
  */
 static str
-monetdb_relation(mvc *sql, sql_subfunc *f, char *uri, list *res_exps, char 
*aname)
+monetdb_relation(mvc *sql, sql_subfunc *f, char *raw_uri, list *res_exps, char 
*aname)
 {
        str ret; // intentionally uninitialized to provoke control flow warnings
 
-       msettings *mp = msettings_create();
        const char *uri_error = NULL;
        Mapi dbh = NULL;
        MapiHdl hdl = NULL;
 
-       if (
-               !mp
-               || msetting_set_string(mp, MP_USER, "monetdb") != NULL
-               || msetting_set_string(mp, MP_PASSWORD, "monetdb") != NULL
-       ) {
+       // Normalize uri
+       msettings *mp = sa_msettings_create(sql->sa);
+       if (!mp) {
                ret = sa_message(sql->sa, "could not allocate msettings");
                goto end;
        }
 
        if (
-               (uri_error = msettings_parse_url(mp, uri))
+               (uri_error = msettings_parse_url(mp, raw_uri))
                || (uri_error = msettings_validate(mp))
        ) {
-               ret = sa_message(sql->sa, "uri '%s' invalid: %s\n", uri, 
uri_error);
+               ret = sa_message(sql->sa, "uri '%s' invalid: %s\n", raw_uri, 
uri_error);
                goto end;
        }
+       const char *uri = sa_msettings_to_string(mp, sql->sa, strlen(raw_uri));
 
        const char *sname = msetting_string(mp, MP_TABLESCHEMA);   // not 
MP_SCHEMA, that's something else
        const char *tname = msetting_string(mp, MP_TABLE);
@@ -85,12 +83,9 @@ monetdb_relation(mvc *sql, sql_subfunc *
                goto end;
        }
 
-       /* set up mapi connection */
-       dbh = mapi_settings(mp);
-       if (dbh) {
-               /* mp has moved into dhb, will be free'd with it*/
-               mp = NULL;
-       } else {
+       /* set up mapi connection; user and password will possibly be 
overridden in the uri */
+       dbh = mapi_mapiuri(uri, "monetdb", "monetdb", "sql");
+       if (dbh == NULL) {
                ret = MAL_MALLOC_FAIL;
                goto end;
        }
@@ -156,8 +151,8 @@ monetdb_relation(mvc *sql, sql_subfunc *
        f->colnames = nameslist;
 
        mdb_loader_t *r = (mdb_loader_t *)sa_alloc(sql->sa, 
sizeof(mdb_loader_t));
-       r->sname = sa_strdup(sql->sa, sname);
-       r->tname = sa_strdup(sql->sa, tname);
+       r->sname = sname;
+       r->tname = tname;
        r->uri = sa_strdup(sql->sa, uri);
        f->sname = (char*)r; /* pass mdb_loader */
        ret = NULL;
@@ -167,7 +162,7 @@ end:
                mapi_close_handle(hdl);
        if (dbh)
                mapi_destroy(dbh);
-       msettings_destroy(mp);
+       // do not destroy mp because r->sname and r->tname point inside it
        return ret;
 }
 
@@ -211,6 +206,7 @@ sql_template(allocator *sa, const char *
 static void *
 monetdb_load(void *BE, sql_subfunc *f, char *uri, sql_exp *topn)
 {
+       (void)uri; // assumed to be equivalent to mdb_loader_t->uri, though 
maybe unnormalized.
        (void)topn;
 
        backend *be = (backend*)BE;
@@ -227,7 +223,7 @@ monetdb_load(void *BE, sql_subfunc *f, c
        if (mvc_create_table( &t, be->mvc, be->mvc->session->tr->tmp/* misuse 
tmp schema */, r->tname /*gettable name*/, tt_remote, false, 
SQL_DECLARED_TABLE, 0, 0, false) != LOG_OK)
                /* alloc error */
                return NULL;
-       t->query = uri; /* set uri */
+       t->query = r->uri; /* set uri */
        node *n, *nn = f->colnames->h, *tn = f->coltypes->h;
        for (n = f->res->h; n; n = n->next, nn = nn->next, tn = tn->next) {
                const char *name = nn->data;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to