Changeset: a670b5793f79 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a670b5793f79
Modified Files:
        gdk/gdk.h
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/scripts/26_sysmon.sql
Branch: strheapvacuum
Log Message:

add dummy callback


diffs (144 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2387,7 +2387,7 @@ gdk_export BAT *BATsample_with_seed(BAT 
 typedef struct gdk_callback {
        char *name;
        int argc;
-       int delay;  // units sec or ms??
+       int interval;  // units sec or ms??
        lng last_called; // timestamp GDKusec
        gdk_return (*func)(int argc, void *argv[]);
        gdk_return (*argsfree)(int argc, void *argv[]);
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
@@ -5004,31 +5004,91 @@ SQLstr_column_vacuum(Client cntxt, MalBl
        sql_column *c = NULL;
 
        if((s = mvc_bind_schema(m, sname)) == NULL)
-               throw(SQL, "sql.column_vacuum", SQLSTATE(3F000) "Invalid or 
missing schema %s",sname);
+               throw(SQL, "sql.str_column_vacuum", SQLSTATE(3F000) "Invalid or 
missing schema %s",sname);
        if((t = mvc_bind_table(m, s, tname)) == NULL)
-               throw(SQL, "sql.column_vacuum", SQLSTATE(42S02) "Invalid or 
missing table %s.%s",sname,tname);
+               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42S02) "Invalid or 
missing table %s.%s",sname,tname);
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
-               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) "Column not 
found %s.%s",sname,tname);
+               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42S22) "Column not 
found %s.%s",sname,tname);
 
        if ((b = store->storage_api.bind_col(tr, c, access)) == NULL)
-               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) 
"storage_api.bind_col failed for %s.%s.%s",sname, tname, cname);
+               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42S22) 
"storage_api.bind_col failed for %s.%s.%s",sname, tname, cname);
        // vacuum only string bats
        if (ATOMstorage(b->ttype) == TYPE_str) {
                if ((bn = COLcopy(b, b->ttype, true, b->batRole)) == NULL)
-                       throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) 
"COLcopy failed %s.%s.%s", sname, tname, cname);
+                       throw(SQL, "sql.str_column_vacuum", SQLSTATE(42S22) 
"COLcopy failed %s.%s.%s", sname, tname, cname);
                if ((res = (int) store->storage_api.swap_bats(tr, c, bn)) != 
LOG_OK) {
                        BBPreclaim(bn);
                        if (res == LOG_CONFLICT)
-                               throw(SQL, "sql.column_vacuum", SQLSTATE(25S01) 
"TRANSACTION CONFLICT in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
+                               throw(SQL, "sql.str_column_vacuum", 
SQLSTATE(25S01) "TRANSACTION CONFLICT in storage_api.swap_bats %s.%s.%s", 
sname, tname, cname);
                        if (res == LOG_ERR)
-                               throw(SQL, "sql.column_vacuum", SQLSTATE(HY000) 
"LOG ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
-                       throw(SQL, "sql.column_vacuum", SQLSTATE(HY000) "ERROR 
in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
+                               throw(SQL, "sql.str_column_vacuum", 
SQLSTATE(HY000) "LOG ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, 
cname);
+                       throw(SQL, "sql.str_column_vacuum", SQLSTATE(HY000) 
"ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
                }
        }
        BBPunfix(b->batCacheid);
        return MAL_SUCCEED;
 }
 
+static gdk_return
+do_str_column_vacuum(int argc, void *argv[]) {
+       char *sname = (char *) argv[0];
+       char *tname = (char *) argv[1];
+       char *cname = (char *) argv[2];
+       (void) sname;
+       (void) tname;
+       (void) cname;
+       (void) argc;
+       // TODO
+       return GDK_SUCCEED;
+}
+
+str
+SQLstr_column_auto_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci)
+{
+       mvc *m = NULL;
+       str msg = NULL;
+       gdk_callback *callback = NULL;
+       char *sname = *getArgReference_str(stk, pci, 1);
+       char *tname = *getArgReference_str(stk, pci, 2);
+       char *cname = *getArgReference_str(stk, pci, 3);
+       int interval = *getArgReference_int(stk, pci, 4);
+
+       if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+
+       sql_schema *s = NULL;
+       sql_table *t = NULL;
+       sql_column *c = NULL;
+
+       if((s = mvc_bind_schema(m, sname)) == NULL)
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(3F000) 
"Invalid or missing schema %s",sname);
+       if((t = mvc_bind_table(m, s, tname)) == NULL)
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S02) 
"Invalid or missing table %s.%s",sname,tname);
+       if ((c = mvc_bind_column(m, t, cname)) == NULL)
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S22) 
"Column not found %s.%s",sname,tname);
+       // register callback
+       if (!(callback = GDKmalloc(sizeof(gdk_callback))))
+               return createException(SQL, "sql.str_column_auto_vacuum", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       *callback = (gdk_callback) {
+               .name = "str_column_vacuum",
+               .argc = 3,
+               .interval = interval,
+               .func = do_str_column_vacuum,
+       };
+
+       if (!(*callback->argv = GDKmalloc(sizeof(char *[3]))))
+               return createException(SQL, "sql.str_column_auto_vacuum", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       callback->argv[0] = sname;
+       callback->argv[1] = tname;
+       callback->argv[2] = cname;
+       gdk_add_callback(callback);
+
+       return MAL_SUCCEED;
+}
+
+
 #include "wlr.h"
 #include "sql_cat.h"
 #include "sql_rank.h"
@@ -6112,6 +6172,7 @@ static mel_func sql_init_funcs[] = {
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,8, 
batarg("",dbl),batarg("b",hge),batarg("c",hge),argany("p",0),argany("o",0),arg("t",int),argany("s",0),argany("e",0))),
 #endif
  pattern("sql", "vacuum", SQLstr_column_vacuum, false, "vacuum a string 
column", args(0,3, arg("sname",str),arg("tname",str),arg("cname",str))),
+ pattern("sql", "vacuum", SQLstr_column_auto_vacuum, false, "auto vacuum 
string column with interval(sec)", args(0,4, 
arg("sname",str),arg("tname",str),arg("cname",str),arg("interval", int))),
  { .imp=NULL }
 };
 #include "mal_import.h"
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
@@ -304,6 +304,7 @@ extern str SQLsession_prepared_statement
 
 extern str SQLunionfunc(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 extern str SQLstr_column_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+extern str SQLstr_column_auto_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 
 sql5_export str getBackendContext(Client cntxt, backend **be);
 
diff --git a/sql/scripts/26_sysmon.sql b/sql/scripts/26_sysmon.sql
--- a/sql/scripts/26_sysmon.sql
+++ b/sql/scripts/26_sysmon.sql
@@ -52,3 +52,6 @@ external name sysmon.user_statistics;
 create procedure sys.vacuum(sname string, tname string, cname string)
        external name sql.vacuum;
 
+create procedure sys.vacuum(sname string, tname string, cname string, interval 
int)
+       external name sql.vacuum;
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to