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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list