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

Reply via email to