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