Changeset: e82bc7317e60 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e82bc7317e60 Modified Files: sql/backends/monet5/vaults/vault.c Branch: data-vaults Log Message:
Generic checktable, analyzetable, tid and bind. Once a checktable or analyzetable is executed we check which reader attached the table and then we call the correct reader check and analyze table functions diffs (truncated from 399 to 300 lines): diff --git a/sql/backends/monet5/vaults/vault.c b/sql/backends/monet5/vaults/vault.c --- a/sql/backends/monet5/vaults/vault.c +++ b/sql/backends/monet5/vaults/vault.c @@ -107,11 +107,17 @@ #include "vault.h" #include "mal_client.h" #include "mal_interpreter.h" +#include <sql_mvc.h> +#include <sql_scenario.h> +#include <sql.h> #ifdef HAVE_CURL #include <curl/curl.h> #endif +/*New Readers*/ +#include "lidar.h" +#include "gadget.h" char vaultpath[BUFSIZ]; /* @@ -215,10 +221,10 @@ VLTimport(Client cntxt, MalBlkPtr mb, Ma } - str -VLTprelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +VLTprelude(void *ret) { + (void) ret; #ifdef HAVE_CURL if (vaultpath[0] == 0){ curl_global_init(CURL_GLOBAL_DEFAULT); @@ -229,10 +235,6 @@ VLTprelude(Client cntxt, MalBlkPtr mb, M if (mkdir(vaultpath, 0755) < 0 && errno != EEXIST) return createException(MAL,"vault.getLocation", "can not access vault directory"); } - (void) cntxt; - (void) mb; - (void) stk; - (void) pci; /* fool compiler */ return MAL_SUCCEED; } @@ -275,3 +277,353 @@ VLTgetLocation(str *ret){ *ret= GDKstrdup(vaultpath); return MAL_SUCCEED; } + +str +VLTcheckTable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + str msg = MAL_SUCCEED; + mvc *m = NULL; + sql_schema *sch = NULL; + sql_table *vaults_tbl, *tbl = NULL; + sql_column *col; + oid rid = oid_nil; + int reader_id = 0, *res = NULL; + str tname = NULL; + + if (pci->argc == 4) { + tname = *getArgReference_str(stk, pci, 3); + printf("Table name%s\n", tname); + res = getArgReference_int(stk, pci, 0); + } else if (pci->argc == 3) { + tname = *getArgReference_str(stk, pci, 2); + printf("Table name%s\n", tname); + res = getArgReference_int(stk, pci, 0); + } else { + msg = createException(MAL, "vaults.check", "Incorrect number of arguments %d.\n", pci->argc); + return msg; + } + + printf("I am here\n"); + if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != MAL_SUCCEED) + return msg; + printf("I am here\n"); + if ((msg = checkSQLContext(cntxt)) != MAL_SUCCEED) + return msg; + printf("I am here\n"); + + sch = mvc_bind_schema(m, "sys"); + vaults_tbl = mvc_bind_table(m, sch, "vaults_journal"); + if (vaults_tbl == NULL) { + msg = createException(MAL, "vaults.check", "VAULTS catalog is missing.\n"); + return msg; + } + + /*Check if it is a table which belongs to vaults_tables*/ + col = mvc_bind_column(m, vaults_tbl, "table_name"); + rid = table_funcs.column_find_row(m->session->tr, col, tname, NULL); + if (rid == oid_nil) { + return MAL_SUCCEED; + } + + tbl = mvc_bind_table(m, sch, tname); + if (tbl == NULL) { + msg = createException(MAL, "vaults.check", "Could not find table %s.\n", tname); + return msg; + } + + /*Get reader id*/ + col = mvc_bind_column(m, vaults_tbl, "vault_reader_id"); + reader_id = *(int*) table_funcs.column_find_value(m->session->tr, col, (oid) rid); + + /* + * Check which reader. + * The info should be preserved in catalog to be more generic + */ + switch (reader_id) { + case VAULT_LIDAR_READER: + msg = LIDARCheckTable(cntxt, mb, stk, pci); + break; + case VAULT_GADGET_READER: + msg = gadgetCheckTable(cntxt, mb, stk, pci); + break; + default: + msg = createException(MAL, "vaults.check", "Reader does not exist %d.\n", reader_id); + } + *res = reader_id; + + return msg; +} + +str +VLTanalyzeTable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + mvc *m = NULL; + str msg = MAL_SUCCEED; + sql_schema *sch = NULL; + sql_table *vaults_tbl; + sql_column *col; + oid rid = oid_nil; + int reader_id = *getArgReference_int(stk, pci, 1); + int status = *getArgReference_int(stk, pci, 3); + str tname = *getArgReference_str(stk, pci, 4); + int *res = getArgReference_int(stk, pci, 0); + + if (status != VAULT_TABLE_ANALYZE) { + *res = status; + return msg; + } + + if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != MAL_SUCCEED) + return msg; + if ((msg = checkSQLContext(cntxt)) != MAL_SUCCEED) + return msg; + + sch = mvc_bind_schema(m, "sys"); + vaults_tbl = mvc_bind_table(m, sch, "vaults_journal"); + if (vaults_tbl == NULL) { + msg = createException(MAL, "vaults.analyze", "VAULTS catalog is missing.\n"); + return msg; + } + + /*Check if it is a table which belongs to vaults_tables*/ + col = mvc_bind_column(m, vaults_tbl, "table_name"); + rid = table_funcs.column_find_row(m->session->tr, col, tname, NULL); + if (rid == oid_nil) { + msg = createException(MAL, "vaults.analyze", "Table %s is unknown to the VAULTS catalog. Attach first the containing file\n", tname); + return msg; + } + + /*Get reader id*/ + col = mvc_bind_column(m, vaults_tbl, "vault_reader_id"); + reader_id = *(int*) table_funcs.column_find_value(m->session->tr, col, (oid) rid); + + /* + * Check which reader. + * The info should be preserved in catalog to be more generic + */ + switch (reader_id) { + case VAULT_LIDAR_READER: + msg = LIDARAnalyzeTable(cntxt, mb, stk, pci); + break; + case VAULT_GADGET_READER: + msg = gadgetAnalyzeTable(cntxt, mb, stk, pci); + break; + default: + msg = createException(MAL, "vaults.analyze", "Reader does not exist %d.\n", reader_id); + } + + /*TODO: such value should be set by the reader, not by vaults*/ + *res = VAULT_TABLE_DONE; + + return MAL_SUCCEED; +} + +static BAT * +mvc_bind(mvc *m, char *sname, char *tname, char *cname, int access) +{ + sql_trans *tr = m->session->tr; + BAT *b = NULL; + sql_schema *s = NULL; + sql_table *t = NULL; + sql_column *c = NULL; + + s = mvc_bind_schema(m, sname); + if (s == NULL) + return NULL; + t = mvc_bind_table(m, s, tname); + if (t == NULL) + return NULL; + c = mvc_bind_column(m, t, cname); + if (c == NULL) + return NULL; + + b = store_funcs.bind_col(tr, c, access); + return b; +} + +/* str mvc_bind_wrap(int *bid, str *sname, str *tname, str *cname, int *access); */ +str +mvc_VLT_bind_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + int upd = (pci->argc == 8 || pci->argc == 10); + BAT *b = NULL, *bn; + bat *bid = getArgReference_bat(stk, pci, 0); + int coltype = getBatType(getArgType(mb, pci, 0)); + mvc *m = NULL; + str msg; + int status = *getArgReference_int(stk, pci, 1 + upd); + str *sname = getArgReference_str(stk, pci, 3 + upd); + str *tname = getArgReference_str(stk, pci, 4 + upd); + str *cname = getArgReference_str(stk, pci, 5 + upd); + int *access = getArgReference_int(stk, pci, 6 + upd); + + if (!*access && status == VAULT_TABLE_LOADED) + *access = RD_INS; + + printf (" Level 0\n" ); + if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) + return msg; + if ((msg = checkSQLContext(cntxt)) != NULL) + return msg; + b = mvc_bind(m, *sname, *tname, *cname, *access); + if (b && b->ttype != coltype) + throw(SQL,"sql.bind","tail type mismatch"); + if (b) { + printf ("argc %d upd %d", pci->argc, upd); + if (pci->argc == (9 + upd) && getArgType(mb, pci, 7 + upd) == TYPE_int) { + BUN cnt = BATcount(b), psz; + /* partitioned access */ + int part_nr = *getArgReference_int(stk, pci, 7 + upd); + int nr_parts = *getArgReference_int(stk, pci, 8 + upd); + printf (" Level 1\n" ); + + if (*access == 0) { + psz = cnt ? (cnt / nr_parts) : 0; + bn = BATslice(b, part_nr * psz, (part_nr + 1 == nr_parts) ? cnt : ((part_nr + 1) * psz)); + BAThseqbase(bn, part_nr * psz); + } else { + /* BAT b holds the UPD_ID bat */ + oid l, h; + BAT *c = mvc_bind(m, *sname, *tname, *cname, 0); + if (c == NULL) + throw(SQL,"sql.bind","Cannot access the update column"); + + cnt = BATcount(c); + psz = cnt ? (cnt / nr_parts) : 0; + l = part_nr * psz; + h = (part_nr + 1 == nr_parts) ? cnt : ((part_nr + 1) * psz); + h--; + bn = BATselect(b, NULL, &l, &h, 1, 1, 0); + BBPunfix(c->batCacheid); + } + BBPunfix(b->batCacheid); + b = bn; + } else if (upd) { + BAT *uv = mvc_bind(m, *sname, *tname, *cname, RD_UPD_VAL); + bat *uvl = getArgReference_bat(stk, pci, 1); + printf (" Level 2\n" ); + + if (uv == NULL) + throw(SQL,"sql.bind","Cannot access the update column"); + BBPkeepref(*bid = b->batCacheid); + BBPkeepref(*uvl = uv->batCacheid); + return MAL_SUCCEED; + } + if (upd) { + bat *uvl = getArgReference_bat(stk, pci, 1); + printf (" Level 3\n" ); + + if (BATcount(b)) { + BAT *uv = mvc_bind(m, *sname, *tname, *cname, RD_UPD_VAL); + BAT *ui = mvc_bind(m, *sname, *tname, *cname, RD_UPD_ID); + BAT *id; + BAT *vl; + if (ui == NULL) + throw(SQL,"sql.bind","Cannot access the insert column"); + if (uv == NULL) + throw(SQL,"sql.bind","Cannot access the update column"); + id = BATproject(b, ui); + vl = BATproject(b, uv); + assert(BATcount(id) == BATcount(vl)); + bat_destroy(ui); + bat_destroy(uv); + BBPkeepref(*bid = id->batCacheid); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list