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