Changeset: 1fb531523d17 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1fb531523d17
Modified Files:
        clients/Tests/exports.stable.out
        monetdb5/modules/mal/remote.c
        monetdb5/modules/mal/remote.h
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_result.c
        tools/monetdbe/monetdbe.c
Branch: monetdbe-proxy
Log Message:

Factor out code between remote and monetdbe.


diffs (truncated from 581 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
@@ -1022,9 +1022,11 @@ str RMTdisconnect(void *ret, str *conn);
 str RMTepilogue(void *ret);
 str RMTexec(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str RMTget(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
+str RMTinternalcopyfrom(BAT **ret, char *hdr, stream *in);
 str RMTisalive(int *ret, str *conn);
 str RMTprelude(void *ret);
 str RMTput(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
+str RMTreadbatheader(stream *sin, char *buf);
 str RMTregister(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str RMTregisterSupervisor(int *ret, str *sup_uuid, str *query_uuid);
 str RMTresolve(bat *ret, str *pat);
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -75,7 +75,6 @@ static connection conns = NULL;
 static unsigned char localtype = 0177;
 
 static inline str RMTquery(MapiHdl *ret, const char *func, Mapi conn, const 
char *query);
-static inline str RMTinternalcopyfrom(BAT **ret, char *hdr, stream *in);
 
 /**
  * Returns a BAT with valid redirects for the given pattern.  If
@@ -516,6 +515,28 @@ str RMTepilogue(void *ret) {
        return(MAL_SUCCEED);
 }
 
+str RMTreadbatheader(stream* sin, char* buf) {
+               ssize_t sz = 0, rd;
+
+               /* read the JSON header */
+               while ((rd = mnstr_read(sin, &buf[sz], 1, 1)) == 1 && buf[sz] 
!= '\n') {
+                       sz += rd;
+               }
+               if (rd < 0) {
+                       throw(MAL, "remote.get", "could not read BAT JSON 
header");
+               }
+               if (buf[0] == '!') {
+                       char *result;
+                       if((result = GDKstrdup(buf)) == NULL)
+                               throw(MAL, "remote.get", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       return result;
+               }
+
+               buf[sz] = '\0';
+
+               return MAL_SUCCEED;
+}
+
 /**
  * get fetches the object referenced by ident over connection conn.
  * We are only interested in retrieving void-headed BATs, i.e. single columns.
@@ -638,7 +659,6 @@ str RMTget(Client cntxt, MalBlkPtr mb, M
                stream *sout;
                stream *sin;
                char buf[256];
-               ssize_t sz = 0, rd;
                BAT *b = NULL;
 
                /* this call should be a single transaction over the channel*/
@@ -657,23 +677,11 @@ str RMTget(Client cntxt, MalBlkPtr mb, M
                mnstr_printf(sout, "remote.batbincopy(%s);\n", ident);
                mnstr_flush(sout);
 
-               /* read the JSON header */
-               while ((rd = mnstr_read(sin, &buf[sz], 1, 1)) == 1 && buf[sz] 
!= '\n') {
-                       sz += rd;
-               }
-               if (rd < 0) {
+               if ( (tmp = RMTreadbatheader(sin, buf)) != MAL_SUCCEED) {
                        MT_lock_unset(&c->lock);
-                       throw(MAL, "remote.get", "could not read BAT JSON 
header");
-               }
-               if (buf[0] == '!') {
-                       char *result;
-                       MT_lock_unset(&c->lock);
-                       if((result = GDKstrdup(buf)) == NULL)
-                               throw(MAL, "remote.get", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-                       return result;
+                       return tmp;
                }
 
-               buf[sz] = '\0';
                if ((tmp = RMTinternalcopyfrom(&b, buf, sin)) != NULL) {
                        MT_lock_unset(&c->lock);
                        return(tmp);
@@ -1209,7 +1217,7 @@ typedef struct _binbat_v1 {
        size_t theapsize;
 } binbat;
 
-static inline str
+str
 RMTinternalcopyfrom(BAT **ret, char *hdr, stream *in)
 {
        binbat bb = { 0, 0, 0, false, false, false, false, false, 0, 0, 0, 0 };
diff --git a/monetdb5/modules/mal/remote.h b/monetdb5/modules/mal/remote.h
--- a/monetdb5/modules/mal/remote.h
+++ b/monetdb5/modules/mal/remote.h
@@ -61,5 +61,7 @@ mal_export str RMTbincopyfrom(Client cnt
 mal_export str RMTbintype(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 mal_export str RMTisalive(int *ret, str *conn);
 mal_export str RMTregisterSupervisor(int *ret, str *sup_uuid, str *query_uuid);
+mal_export str RMTreadbatheader(stream* sin, char* buf);
+mal_export str RMTinternalcopyfrom(BAT **ret, char *hdr, stream *in);
 #endif /* HAVE_MAPI */
 #endif /* _REMOTE_DEF */
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -189,7 +189,7 @@ checkSQLContext(Client cntxt)
        return MAL_SUCCEED;
 }
 
-static str
+str
 getBackendContext(Client cntxt, backend **be)
 {
        str msg;
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -287,4 +287,6 @@ sql5_export str SQLsession_prepared_stat
 
 sql5_export str SQLunionfunc(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 
+sql5_export str getBackendContext(Client cntxt, backend **be);
+
 #endif /* _SQL_H */
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -1628,7 +1628,6 @@ cleanup:
        return fres;
 }
 
-// TODO copied from/based on remote.c:RMTbincopyto
 static int
 mvc_export_table_columnar(stream *s, res_table *t, BAT *order) {
        int i;
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -28,6 +28,8 @@
 #include "mapi.h"
 #include "monetdbe_mapi.h"
 #include "msqldump.h"
+#include "remote.h"
+#include "sql.h"
 #include "sql_result.h"
 
 #define UNUSED(x) (void)(x)
@@ -238,6 +240,43 @@ cleanup:
 }
 
 static char*
+monetdbe_get_results(monetdbe_result** result, monetdbe_database_internal 
*mdbe) {
+
+       backend *be = NULL;
+       if ((mdbe->msg = getBackendContext(mdbe->c, &be)) != NULL)
+               return mdbe->msg;
+
+    mvc *m = be->mvc;
+
+       monetdbe_result_internal* res_internal;
+
+    if (!(res_internal = GDKzalloc(sizeof(monetdbe_result_internal)))) {
+        mdbe->msg = createException(MAL, "monetdbe.monetdbe_query_internal", 
MAL_MALLOC_FAIL);
+        return mdbe->msg;
+    }
+    // TODO: set type of result outside.
+    res_internal->res.last_id = be->last_id;
+    res_internal->mdbe = mdbe;
+    *result = (monetdbe_result*) res_internal;
+    m->reply_size = -2; /* do not clean up result tables */
+
+    if (be->results) {
+        res_internal->res.ncols = (size_t) be->results->nr_cols;
+        res_internal->monetdbe_resultset = be->results;
+        if (be->results->nr_cols > 0)
+            res_internal->res.nrows = be->results->nr_rows;
+        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);
+            return mdbe->msg;
+        }
+    }
+
+       return MAL_SUCCEED;
+}
+
+static char*
 monetdbe_query_internal(monetdbe_database_internal *mdbe, char* query, 
monetdbe_result** result, monetdbe_cnt* affected_rows, int *prepare_id, char 
language)
 {
        char *nq = NULL;
@@ -247,7 +286,6 @@ monetdbe_query_internal(monetdbe_databas
        size_t query_len, input_query_len, prep_len = 0;
        buffer query_buf;
        stream *query_stream;
-       monetdbe_result_internal *res_internal = NULL;
        bstream *old_bstream = NULL;
        stream *fdout = c->fdout;
 
@@ -328,31 +366,14 @@ monetdbe_query_internal(monetdbe_databas
                *affected_rows = b->rowcnt;
 
        if (result) {
-               if (!(res_internal = 
GDKzalloc(sizeof(monetdbe_result_internal)))) {
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_internal", MAL_MALLOC_FAIL);
+               if ((mdbe->msg = monetdbe_get_results(result, mdbe)) != 
MAL_SUCCEED) {
                        goto cleanup;
                }
+
                if (m->emode & m_prepare)
-                       res_internal->type = Q_PREPARE;
+                       ((monetdbe_result_internal*) result)->type = Q_PREPARE;
                else
-                       res_internal->type = (b->results) ? 
b->results->query_type : m->type;
-               res_internal->res.last_id = b->last_id;
-               res_internal->mdbe = mdbe;
-               *result = (monetdbe_result*) res_internal;
-               m->reply_size = -2; /* do not clean up result tables */
-
-               if (b->results) {
-                       res_internal->res.ncols = (size_t) b->results->nr_cols;
-                       res_internal->monetdbe_resultset = b->results;
-                       if (b->results->nr_cols > 0)
-                               res_internal->res.nrows = b->results->nr_rows;
-                       b->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);
-                               goto cleanup;
-                       }
-               }
+                       ((monetdbe_result_internal*) result)->type = 
(b->results) ? b->results->query_type : m->type;
        }
 
 cleanup:
@@ -365,7 +386,7 @@ cleanup:
                c->fdin = old_bstream;
        }
 
-       char* msg = commit_action(m, mdbe, result, res_internal);
+       char* msg = commit_action(m, mdbe, result, (monetdbe_result_internal*) 
result);
 
        return msg;
 }
@@ -775,221 +796,6 @@ monetdbe_in_transaction(monetdbe_databas
        return result;
 }
 
-typedef struct _binbat_v1 {
-       int Ttype;
-       oid Hseqbase;
-       oid Tseqbase;
-       bool
-               Tsorted:1,
-               Trevsorted:1,
-               Tkey:1,
-               Tnonil:1,
-               Tdense:1;
-       BUN size;
-       size_t headsize;
-       size_t tailsize;
-       size_t theapsize;
-} binbat;
-
-// TODO: copied from/based on remote.c:RMTinternalcopyfrom
-static inline str
-RMTinternalcopyfrom(BAT **ret, stream *sin)
-{
-       ssize_t sz = 0, rd;
-
-       char buf[256] = {0};
-
-       /* read the JSON header */
-       while ((rd = mnstr_read(sin, &buf[sz], 1, 1)) == 1 && buf[sz] != '\n') {
-               sz += rd;
-       }
-       if (rd < 0) {
-               throw(MAL, "remote.get", "could not read BAT JSON header");
-       }
-       if (buf[0] == '!') {
-               char *result;
-               if((result = GDKstrdup(buf)) == NULL)
-                       throw(MAL, "remote.get", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-               return result;
-       }
-
-       binbat bb = { 0, 0, 0, false, false, false, false, false, 0, 0, 0, 0 };
-       char *nme = NULL;
-       char *val = NULL;
-       char tmp;
-       size_t len;
-       lng lv, *lvp;
-
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to