Changeset: ebea7ee57059 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ebea7ee57059
Modified Files:
        design.txt
        sql/backends/monet5/sql_execute.c
        tools/monetdbe/monetdbe.c
Branch: monetdbe-proxy
Log Message:

Work in process on prepared statments.


diffs (truncated from 310 to 300 lines):

diff --git a/design.txt b/design.txt
--- a/design.txt
+++ b/design.txt
@@ -56,4 +56,45 @@ stuurt header op welke ook de volgorde v
 de client leest de header stream en pakt daarna de onderliggende read stream 
en vangt daarmee de bats op.
 
 
+handling monetdbe_prepare
 
+Normale prepare komt in
+
+sql_scenario.c:parser terecht. Daar wordt de PREPARE herkent en daar wordt 
m(ode) van de mvc
+op m_prepare gezet. de sql_parse operatie parst de hele query en maakt een 
geoptimaliseerd relationeel plan
+met place holders. Deze wordt vervolgens in de query cache gestopt via 
sql_qc.c:qc_insert.
+Een id naar de query in de qc wordt teruggegeven en bewaard in de backend van 
de mvc.
+
+normale exec
+
+#0  rel_nop (query=0x7fffd42c6830, rel=0x7ffff02e1858, se=0x7fffd42c67e0, 
fs=32772, ek=...)
+    at /home/aris/sources/monetdb/sql/server/rel_select.c:3137
+#1  0x00007ffff1eacebc in rel_value_exp2 (query=0x7fffd42c6830, 
rel=0x7ffff02e1858, se=0x7fffd42c67e0, 
+    f=32772, ek=...) at /home/aris/sources/monetdb/sql/server/rel_select.c:4923
+#2  0x00007ffff1ead4f0 in rel_value_exp (query=0x7fffd42c6830, 
rel=0x7ffff02e1858, se=0x7fffd42c67e0, 
+    f=32772, ek=...) at /home/aris/sources/monetdb/sql/server/rel_select.c:5050
+#3  0x00007ffff1f27a6a in rel_psm_call (query=0x7fffd42c6830, 
se=0x7fffd42c67e0)
+    at /home/aris/sources/monetdb/sql/server/rel_psm.c:166
+#4  0x00007ffff1f2f5ee in rel_psm (query=0x7fffd42c6830, s=0x7fffd42c6800)
+    at /home/aris/sources/monetdb/sql/server/rel_psm.c:1576
+#5  0x00007ffff1e91f34 in rel_semantic (query=0x7fffd42c6830, s=0x7fffd42c6800)
+    at /home/aris/sources/monetdb/sql/server/rel_semantic.c:198
+(gdb) p s->token 
+$24 = SQL_CALL
+#6  0x00007ffff1d3a754 in sql_symbol2relation (be=0x7fffd4222fc0, 
sym=0x7fffd42c6800)
+    at /home/aris/sources/monetdb/sql/backends/monet5/sql.c:119
+#7  0x00007ffff1d5d1b4 in SQLparser (c=0x5555557b51c0)
+    at /home/aris/sources/monetdb/sql/backends/monet5/sql_scenario.c:1074
+#8  0x00007ffff795d01b in runPhase (c=0x5555557b51c0, phase=1)
+    at /home/aris/sources/monetdb/monetdb5/mal/mal_scenario.c:448
+
+mclient doet prepare niet via mapi_prepare maar via een normale mapi_query.
+De remote zal dan dit normaal parsen. en geeft in 
sql_result.c:mvc_export_prepare
+de noodzakelijke meta data voor het aanroepen van de prepared statement.
+mclient gebruikt 
+
+Plan
+
+Expand sqlStatementIntern to incorporate prepared statements.
+
+use remote to call sql.prepare on the remote side. Remote should return 
similar info as regular mapi.
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -311,8 +311,12 @@ SQLescapeString(str s)
 }
 
 str
-SQLstatementIntern(Client c, str *expr, str nme, bit execute, bit output, 
res_table **result)
+SQLstatementIntern2(Client c, str *expr, str nme, bit prepare, bit execute, 
bit output, res_table **result);
+
+str
+SQLstatementIntern2(Client c, str *expr, str nme, bit prepare, bit execute, 
bit output, res_table **result)
 {
+       (void) prepare;
        int status = 0, err = 0, oldvtop, oldstop = 1, inited = 0, ac, 
sizeframes, topframes;
        unsigned int label;
        mvc *o = NULL, *m = NULL;
@@ -588,6 +592,12 @@ endofcompile:
 }
 
 str
+SQLstatementIntern(Client c, str *expr, str nme, bit execute, bit output, 
res_table **result)
+{
+       return SQLstatementIntern2(c, expr, nme, FALSE, execute, output, 
result);
+}
+
+str
 SQLengineIntern(Client c, backend *be)
 {
        str msg = MAL_SUCCEED;
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -95,6 +95,7 @@ typedef struct {
        monetdbe_data_time time_null;
        monetdbe_data_timestamp timestamp_null;
        Mapi mid;
+       str mid_sr;
 } monetdbe_database_internal;
 
 typedef struct {
@@ -251,7 +252,7 @@ monetdbe_get_results(monetdbe_result** r
        monetdbe_result_internal* res_internal;
 
     if (!(res_internal = GDKzalloc(sizeof(monetdbe_result_internal)))) {
-        mdbe->msg = createException(MAL, "monetdbe.monetdbe_query_internal", 
MAL_MALLOC_FAIL);
+        mdbe->msg = createException(MAL, "monetdbe.monetdbe_get_results", 
MAL_MALLOC_FAIL);
         return mdbe->msg;
     }
     // TODO: set type of result outside.
@@ -268,7 +269,7 @@ monetdbe_get_results(monetdbe_result** r
         be->results = NULL;
         res_internal->converted_columns = GDKzalloc(sizeof(monetdbe_column*) * 
res_internal->res.ncols);
         if (!res_internal->converted_columns) {
-            mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_internal", MAL_MALLOC_FAIL);
+            mdbe->msg = createException(MAL, "monetdbe.monetdbe_get_results", 
MAL_MALLOC_FAIL);
             return mdbe->msg;
         }
     }
@@ -600,6 +601,74 @@ static bool urls_matches(const char* l, 
        return (l && r && (strcmp(l, r) == 0)) || (l == NULL && r == NULL);
 }
 
+#include <mal.h>
+#include <mal_backend.h>
+#include <opt_prelude.h>
+
+static int
+monetdbe_open_remote(monetdbe_database_internal *mdbe, char *url, 
monetdbe_options *opts) {
+
+       monetdbe_remote* remote = opts->remote;
+       if (!remote) {
+               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", "Missing user credential for monetdbe remote 
proxy set up");
+               return -1;
+       }
+
+       Client c = mdbe->c;
+
+       assert(!c->curprg);
+
+       const char *mod = "user";
+       char nme[16];
+       const char *name = number2name(nme, sizeof(nme), ++((backend*)  
c->sqlcontext)->remote);
+       c->curprg = newFunction(putName(mod), putName(name), FUNCTIONsymbol);
+
+       if (c->curprg == NULL) {
+               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL);
+               return -2;
+       }
+
+       MalBlkPtr mb = c->curprg->def;
+
+       InstrPtr q = getInstrPtr(mb, 0);
+       q->argc = q->retc = 0;
+       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_str));
+
+       InstrPtr p = newFcnCall(mb, remoteRef, connectRef);
+       p = pushStr(mb, p, url);
+       p = pushStr(mb, p, remote->username);
+       p = pushStr(mb, p, remote->password);
+       p = pushStr(mb, p, "msql");
+
+       q = newInstruction(mb, NULL, NULL);
+       q->barrier= RETURNsymbol;
+       q = pushReturn(mb, q, getArg(p, 0));
+
+       pushInstruction(mb, q);
+
+       if (p == NULL) {
+               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL);
+               return -2;
+       }
+       if ( (mdbe->msg = chkProgram(c->usermodule, mb)) != MAL_SUCCEED ) {
+               return -2;
+       }
+       MalStkPtr stk = prepareMALstack(mb, mb->vsize);
+       stk->keepAlive = TRUE;
+       if ( (mdbe->msg = runMAL(c, mb, 0, stk)) != MAL_SUCCEED ) {
+               return -2;
+       }
+       mdbe->mid_sr = strdup(*getArgReference_str(stk, p, 0));
+
+       garbageCollector(c, mb, stk, TRUE);
+       freeStack(stk);
+
+       printf("yeah a connect string: %s!\n", mdbe->mid_sr);
+
+
+       return 0;
+}
+
 int
 monetdbe_open(monetdbe_database *dbhdl, char *url, monetdbe_options *opts)
 {
@@ -618,27 +687,6 @@ monetdbe_open(monetdbe_database *dbhdl, 
        mdbe->c = NULL;
 
        bool is_remote = monetdbe_is_remote(url);
-
-       if (is_remote) {
-               monetdbe_remote* remote = opts->remote;
-               if (!remote) {
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Missing user credential for monetdbe remote proxy 
set up");
-                       return -1;
-               }
-
-               Mapi mid = mapi_mapiuri(url, remote->username, 
remote->password, remote->lang);
-               if (mid == NULL) {
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot initialize mapi object.");
-                       return -2;
-               }
-               else if(mapi_reconnect(mid) /* actually, initial connect */, 
mapi_error(mid)) {
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "%s", mapi_error_str(mid));
-                       return -2;
-               }
-
-               mdbe->mid = mid;
-       }
-
        if (!monetdbe_embedded_initialized) {
                /* When used as a remote mapi proxy,
                 * it is still necessary to have an initialized monetdbe. E.g. 
for BAT life cycle management.
@@ -653,6 +701,10 @@ monetdbe_open(monetdbe_database *dbhdl, 
 
        if (!mdbe->msg)
                res = monetdbe_open_internal(mdbe);
+
+       if (res == 0 && is_remote)
+               res = monetdbe_open_remote(mdbe, url, opts);
+
        MT_lock_unset(&embedded_lock);
        if (mdbe->msg)
                return -2;
@@ -796,15 +848,12 @@ monetdbe_in_transaction(monetdbe_databas
        return result;
 }
 
-char*
-monetdbe_query(monetdbe_database dbhdl, char* query, monetdbe_result** result, 
monetdbe_cnt* affected_rows)
+static char*
+monetdbe_query_external(monetdbe_database_internal *mdbe, char* query, 
monetdbe_result** result, monetdbe_cnt* affected_rows)
 {
-       if (!dbhdl)
-               return NULL;
-       monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl;
-
-       if (mdbe->mid) {
-               if (mapi_set_columnar_protocol(mdbe->mid, true) != MOK || 
mapi_error(mdbe->mid)) {
+       // TODO: do something with affected_rows
+       (void) affected_rows;
+       if (mapi_set_columnar_protocol(mdbe->mid, true) != MOK || 
mapi_error(mdbe->mid)) {
                        mdbe->msg = createException(MAL, "monetdbe.connect", 
"%s", mapi_error_str(mdbe->mid));
                        return mdbe->msg;
                }
@@ -880,13 +929,48 @@ monetdbe_query(monetdbe_database dbhdl, 
                }
 
                return mdbe->msg;
+}
+
+char*
+monetdbe_query(monetdbe_database dbhdl, char* query, monetdbe_result** result, 
monetdbe_cnt* affected_rows)
+{
+       if (!dbhdl)
+               return NULL;
+       monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl;
+
+       if (mdbe->mid) {
+               mdbe->msg = monetdbe_query_external(mdbe, query, result, 
affected_rows);
        }
        else {
                mdbe->msg = monetdbe_query_internal(mdbe, query, result, 
affected_rows, NULL, 'S');
-               return mdbe->msg;
        }
+
+       return mdbe->msg;
 }
 
+
+/*
+static 
+void _remote_execute(
+       monetdbe_database_internal *mdbe,
+       char* query,
+       monetdbe_statement **stmt) {
+
+       Client c = mdbe->c;
+       MalBlkPtr curBlk = 0;
+       InstrPtr curInstr = 0, p, o;
+
+       backup = c->curprg;
+       const char *mod = "user";
+
+       
+       c->curprg = newFunction(putName(mod), putName(name), FUNCTIONsymbol);
+
+}
+*/
+
+
+
 char*
 monetdbe_prepare(monetdbe_database dbhdl, char* query, monetdbe_statement 
**stmt)
 {
@@ -973,9 +1057,13 @@ monetdbe_execute(monetdbe_statement *stm
                if (!stmt_internal->data[i].vtype)
                        return createException(MAL, 
"monetdbe.monetdbe_execute", "Parameter %d not bound to a value", i);
        }
-       //MalStkPtr glb = (MalStkPtr) (q->stk);
-       //Symbol s = (Symbol)q->code;
-       //mdbe->msg = callMAL(mdbe->c, s->def, &glb, stmt_internal->args, 0);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to