Changeset: 9bbb3a228121 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9bbb3a228121
Modified Files:
        tools/embedded/embedded.c
        tools/embedded/embedded.h
        tools/embedded/rpackage/R/monetdb.R
Branch: embedded
Log Message:

mal black magic


diffs (231 lines):

diff --git a/tools/embedded/embedded.c b/tools/embedded/embedded.c
--- a/tools/embedded/embedded.c
+++ b/tools/embedded/embedded.c
@@ -27,8 +27,16 @@ typedef str (*SQLautocommit_ptr_tpe)(Cli
 SQLautocommit_ptr_tpe SQLautocommit_ptr = NULL;
 typedef str (*SQLinitClient_ptr_tpe)(Client);
 SQLinitClient_ptr_tpe SQLinitClient_ptr = NULL;
+typedef str (*getSQLContext_ptr_tpe)(Client, MalBlkPtr, mvc**, backend**);
+getSQLContext_ptr_tpe getSQLContext_ptr = NULL;
 typedef void (*res_table_destroy_ptr_tpe)(res_table *t);
 res_table_destroy_ptr_tpe res_table_destroy_ptr = NULL;
+typedef str (*mvc_append_wrap_ptr_tpe)(Client, MalBlkPtr, MalStkPtr, InstrPtr);
+mvc_append_wrap_ptr_tpe mvc_append_wrap_ptr = NULL;
+typedef sql_schema* (*mvc_bind_schema_ptr_tpe)(mvc*, const char*);
+mvc_bind_schema_ptr_tpe mvc_bind_schema_ptr = NULL;
+typedef sql_table* (*mvc_bind_table_ptr_tpe)(mvc*, sql_schema*, const char*);
+mvc_bind_table_ptr_tpe mvc_bind_table_ptr = NULL;
 
 static bit monetdb_embedded_initialized = 0;
 static MT_Lock monetdb_embedded_lock;
@@ -76,12 +84,20 @@ int monetdb_startup(char* dir, char sile
        if (silent) mal_clients[0].fdout = THRdata[0];
 
        // This dynamically looks up functions, because the library containing 
them is loaded at runtime.
+       // argh
        SQLstatementIntern_ptr = (SQLstatementIntern_ptr_tpe) 
lookup_function("lib_sql",  "SQLstatementIntern");
        SQLautocommit_ptr = (SQLautocommit_ptr_tpe) lookup_function("lib_sql",  
"SQLautocommit");
        SQLinitClient_ptr = (SQLinitClient_ptr_tpe) lookup_function("lib_sql",  
"SQLinitClient");
+       getSQLContext_ptr = (getSQLContext_ptr_tpe) lookup_function("lib_sql",  
"getSQLContext");
        res_table_destroy_ptr  = (res_table_destroy_ptr_tpe)  
lookup_function("libstore", "res_table_destroy");
+       mvc_append_wrap_ptr = (mvc_append_wrap_ptr_tpe)  
lookup_function("lib_sql", "mvc_append_wrap");
+       mvc_bind_schema_ptr = (mvc_bind_schema_ptr_tpe)  
lookup_function("lib_sql", "mvc_bind_schema");
+       mvc_bind_table_ptr = (mvc_bind_table_ptr_tpe)  
lookup_function("lib_sql", "mvc_bind_table");
+
        if (SQLstatementIntern_ptr == NULL || SQLautocommit_ptr == NULL ||
-                       SQLinitClient_ptr == NULL || res_table_destroy_ptr == 
NULL) {
+                       SQLinitClient_ptr == NULL || getSQLContext_ptr == NULL 
||
+                       res_table_destroy_ptr == NULL || mvc_append_wrap_ptr == 
NULL ||
+                       mvc_bind_schema_ptr == NULL || mvc_bind_table_ptr == 
NULL) {
                retval = -4;
                goto cleanup;
        }
@@ -102,7 +118,6 @@ cleanup:
        return retval;
 }
 
-// TODO: This does stop working on the first failing query, do something about 
this
 char* monetdb_query(char* query, void** result) {
        str res = MAL_SUCCEED;
        Client c = &mal_clients[0];
@@ -136,32 +151,47 @@ char* monetdb_query(char* query, void** 
        return res;
 }
 
-char* monetdb_append(char* schema, char* table, append_data *data, int ncols) {
+char* monetdb_append(const char* schema, const char* table, append_data *data, 
int col_ct) {
        int i;
+       int nvar = 6; // variables we need to make up
        MalBlkRecord mb;
-       MalStack     stk;
-       InstrRecord  pci;
+       MalStack*     stk = NULL;
+       InstrRecord*  pci = NULL;
        str res = MAL_SUCCEED;
+       VarRecord bat_varrec;
 
-       assert(table != NULL && append_data != NULL && ncols > 0);
-       for (i = 0; i < 6; i++) {
-               pci.argv[i] = i;
+       assert(table != NULL && data != NULL && col_ct > 0);
+       // very black MAL magic below
+       mb.var = GDKmalloc(6 * sizeof(VarRecord*));
+       stk = GDKmalloc(sizeof(MalStack) + nvar * sizeof(ValRecord));
+       pci = GDKmalloc(sizeof(InstrRecord) + nvar * sizeof(int));
+       assert(mb.var != NULL && stk != NULL && pci != NULL); // cough, cough
+       bat_varrec.type = TYPE_bat;
+       for (i = 0; i < nvar; i++) {
+               pci->argv[i] = i;
        }
+       stk->stk[0].vtype = TYPE_int;
+       stk->stk[2].val.sval = (str) schema;
+       stk->stk[2].vtype = TYPE_str;
+       stk->stk[3].val.sval = (str) table;
+       stk->stk[3].vtype = TYPE_str;
+       stk->stk[4].vtype = TYPE_str;
+       stk->stk[5].vtype = TYPE_bat;
+       mb.var[5] = &bat_varrec;
 
-       stk.stk[2].val.sval = schema;
-       stk.stk[3].val.sval = table;
+       for (i=0; i < col_ct; i++) {
+               append_data ad = data[i];
+               stk->stk[4].val.sval = ad.colname;
+               stk->stk[5].val.bval = ad.batid;
 
-       for (i=0; i <ncols; i++) {
-               append_data ad = data[i];
-               stk.stk[4].val.sval = ad.colname;
-               stk.stk[5].vtype = TYPE_bat;
-               stk.stk[5].val.bval = ad.batid;
-
-               res = mvc_append_wrap(&mal_clients[0], mb, stk, pci);
+               res = (*mvc_append_wrap_ptr)(&mal_clients[0], &mb, stk, pci);
                if (res != NULL) {
                        break;
                }
        }
+       GDKfree(mb.var);
+       GDKfree(stk);
+       GDKfree(pci);
        return res;
 }
 
@@ -304,7 +334,7 @@ SEXP monetdb_startup_R(SEXP dirsexp, SEX
        return ScalarInteger(res);
 }
 
-str monetdb_get_columns(char* schema_name, char *table_name, int 
*column_count, char ***column_names, int **column_types) {
+static str monetdb_get_columns(const char* schema_name, const char 
*table_name, int *column_count, char ***column_names, int **column_types) {
        Client c = &mal_clients[0];
        mvc *m;
        sql_schema *s;
@@ -315,13 +345,13 @@ str monetdb_get_columns(char* schema_nam
 
        assert(column_count != NULL && column_names != NULL && column_types != 
NULL);
 
-       if ((msg = getSQLContext(c, NULL, &m, NULL)) != NULL)
+       if ((msg = (*getSQLContext_ptr)(c, NULL, &m, NULL)) != NULL)
                return msg;
 
-       s = mvc_bind_schema(m, schema_name);
+       s = (*mvc_bind_schema_ptr)(m, schema_name);
        if (s == NULL)
                msg = createException(MAL, "embedded", "Missing schema!");
-       t = mvc_bind_table(m, s, table_name);
+       t = (*mvc_bind_table_ptr)(m, s, table_name);
        if (t == NULL)
                msg = createException(MAL, "embedded", "Could not find table 
%s", table_name);
 
@@ -345,7 +375,7 @@ str monetdb_get_columns(char* schema_nam
 SEXP monetdb_append_R(SEXP schemasexp, SEXP namesexp, SEXP tabledatasexp) {
        const char *schema = NULL, *name = NULL;
        str msg;
-       int ncols, nrows, i, j;
+       int col_ct, row_ct, i, j;
        BAT *b;
        BUN cnt;
        append_data *ad = NULL;
@@ -359,33 +389,31 @@ SEXP monetdb_append_R(SEXP schemasexp, S
        schema = CHAR(STRING_ELT(schemasexp, 0));
        name = CHAR(STRING_ELT(namesexp, 0));
 
-       ncols = LENGTH(tabledatasexp);
-       nrows = LENGTH(VECTOR_ELT(tabledatasexp, 0));
+       col_ct = LENGTH(tabledatasexp);
+       row_ct = LENGTH(VECTOR_ELT(tabledatasexp, 0));
 
        msg = monetdb_get_columns(schema, name, &t_column_count, 
&t_column_names, &t_column_types);
        if (msg != MAL_SUCCEED)
                goto wrapup;
 
-       if (t_column_count != ncols) {
+       if (t_column_count != col_ct) {
                msg = GDKstrdup("Unequal number of columns"); // TODO: add 
counts here
                goto wrapup;
        }
 
-       ad = GDKmalloc(ncols * sizeof(append_data));
+       ad = GDKmalloc(col_ct * sizeof(append_data));
 
-       for (i = 0; i < ncols; i++) {
+       for (i = 0; i < col_ct; i++) {
                SEXP ret_col = VECTOR_ELT(tabledatasexp, i);
                int bat_type = t_column_types[i];
-               cnt = (BUN) nrows;
+               cnt = (BUN) row_ct;
 
                // hand over the vector into a BAT
                switch (bat_type) {
                case TYPE_int: {
                        if (!IS_INTEGER(ret_col)) {
                                msg =
-                                       createException(MAL, "rapi.eval",
-                                                                       "wrong 
R column type for column %d, expected INTeger, got %s.",
-                                                                       i, 
rtypename(TYPEOF(ret_col)));
+                                       createException(MAL, "rapi.eval", 
"boo"); // TODO: better error message
                                goto wrapup;
                        }
                        SXP_TO_BAT(int, INTEGER_POINTER, *p==NA_INTEGER);
@@ -396,7 +424,7 @@ SEXP monetdb_append_R(SEXP schemasexp, S
                ad[i].batid = b->batCacheid;
        }
 
-       monetdb_append(schema, name, ad, ncols);
+       msg = monetdb_append(schema, name, ad, col_ct);
        wrapup:
                if (t_column_names != NULL) {
                        GDKfree(t_column_names);
@@ -404,6 +432,9 @@ SEXP monetdb_append_R(SEXP schemasexp, S
                if (t_column_types != NULL) {
                        GDKfree(t_column_types);
                }
+               if (msg == NULL) {
+                       return ScalarLogical(1);
+               }
                return ScalarString(mkCharCE(msg, CE_UTF8));
 }
 
diff --git a/tools/embedded/embedded.h b/tools/embedded/embedded.h
--- a/tools/embedded/embedded.h
+++ b/tools/embedded/embedded.h
@@ -22,7 +22,7 @@ typedef struct append_data {
 
 int monetdb_startup(char* dir, char silent);
 char* monetdb_query(char* query, void** result);
-char* monetdb_append(char* schema, char* table, *append_data, int ncols);
+char* monetdb_append(const char* schema, const char* table, append_data *ad, 
int ncols);
 void monetdb_cleanup_result(void* output);
 SEXP monetdb_query_R(SEXP querysexp);
 SEXP monetdb_startup_R(SEXP dirsexp, SEXP silentsexp);
diff --git a/tools/embedded/rpackage/R/monetdb.R 
b/tools/embedded/rpackage/R/monetdb.R
--- a/tools/embedded/rpackage/R/monetdb.R
+++ b/tools/embedded/rpackage/R/monetdb.R
@@ -48,7 +48,6 @@ monetdb_embedded_query <- function(query
        resp
 }
 
-
 monetdb_embedded_append <- function(table, tdata, schema="sys") {
        table <- as.character(table)
        if (length(table) != 1) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to