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