Changeset: 1d24f2fb0ff4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1d24f2fb0ff4
Modified Files:
        sql/backends/monet5/sql.c
Branch: strheapvacuum
Log Message:

factor out common code


diffs (178 lines):

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
@@ -4979,18 +4979,44 @@ finalize:
        return ret;
 }
 
+static str
+do_str_column_vacuum(sql_trans *tr, sql_column *c, int access, char *sname, 
char *tname, char *cname) {
+       int res;
+       BAT* b = NULL;
+       BAT* bn = NULL;
+       sqlstore *store = tr->store;
+
+       if ((b = store->storage_api.bind_col(tr, c, access)) == NULL)
+               throw(SQL, "do_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, "do_str_column_vacuum", SQLSTATE(42S22) 
"COLcopy failed for %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, "do_str_column_vacuum", 
SQLSTATE(25S01) "TRANSACTION CONFLICT in storage_api.swap_bats %s.%s.%s", 
sname, tname, cname);
+                       if (res == LOG_ERR)
+                               throw(SQL, "do_str_column_vacuum", 
SQLSTATE(HY000) "LOG ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, 
cname);
+                       throw(SQL, "do_str_column_vacuum", SQLSTATE(HY000) 
"ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
+               }
+       }
+       BBPunfix(b->batCacheid);
+       return MAL_SUCCEED;
+}
+
 str
 SQLstr_column_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        mvc *m = NULL;
-       BAT* b = NULL;
-       BAT* bn = NULL;
+       //BAT* b = NULL;
+       //BAT* bn = NULL;
        str msg = NULL;
        int access = 0;
-       int res = 0;
-       const char *sname = *getArgReference_str(stk, pci, 1);
-       const char *tname = *getArgReference_str(stk, pci, 2);
-       const char *cname = *getArgReference_str(stk, pci, 3);
+       // int res = 0;
+       char *sname = *getArgReference_str(stk, pci, 1);
+       char *tname = *getArgReference_str(stk, pci, 2);
+       char *cname = *getArgReference_str(stk, pci, 3);
 
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
                return msg;
@@ -4998,7 +5024,7 @@ SQLstr_column_vacuum(Client cntxt, MalBl
                return msg;
 
        sql_trans *tr = m->session->tr;
-       sqlstore *store = tr->store;
+       // sqlstore *store = tr->store;
        sql_schema *s = NULL;
        sql_table *t = NULL;
        sql_column *c = NULL;
@@ -5010,38 +5036,71 @@ SQLstr_column_vacuum(Client cntxt, MalBl
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                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.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.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.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.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;
+       // if ((b = store->storage_api.bind_col(tr, c, access)) == NULL)
+       //      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.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.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.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 do_str_column_vacuum(tr, c, access, sname, tname, cname);
 }
 
+
 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;
+str_column_vacuum_callback(int argc, void *argv[]) {
+       mvc *m = (mvc *) argv[0];
+       char *sname = (char *) argv[1];
+       char *tname = (char *) argv[2];
+       char *cname = (char *) argv[3];
+       sql_schema *s = NULL;
+       sql_table *t = NULL;
+       sql_column *c = NULL;
+       sql_trans *tr = NULL;
+       int access = 0;
+       char *msg;
+       gdk_return res = GDK_SUCCEED;
+
        (void) argc;
-       // TODO
-       return GDK_SUCCEED;
+
+       if((s = mvc_bind_schema(m, sname)) == NULL) {
+               TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] -- 
Invalid or missing schema %s!",sname);
+               return GDK_FAIL;
+       }
+
+       if((t = mvc_bind_table(m, s, tname)) == NULL) {
+               TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] -- 
Invalid or missing table %s!", tname);
+               return GDK_FAIL;
+       }
+
+       if ((c = mvc_bind_column(m, t, cname)) == NULL) {
+               TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] -- 
Invalid or missing column %s!", cname);
+               return GDK_FAIL;
+       }
+
+       if((tr = sql_trans_create(m->store, NULL, NULL)) == NULL) {
+               TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] -- 
Failed to create transaction!");
+               return GDK_FAIL;
+       }
+
+       if((msg=do_str_column_vacuum(tr, c, access, sname, tname, cname)) != 
MAL_SUCCEED) {
+               TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] -- 
%s", msg);
+               res = GDK_FAIL;
+       }
+       sql_trans_destroy(tr);
+       return res;
 }
 
+
 str
 SQLstr_column_auto_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci)
 {
@@ -5073,13 +5132,14 @@ SQLstr_column_auto_vacuum(Client cntxt, 
                return createException(SQL, "sql.str_column_auto_vacuum", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
        *callback = (gdk_callback) {
                .name = "str_column_vacuum",
-               .argc = 3,
+               .argc = 4,
                .interval = interval,
-               .func = do_str_column_vacuum,
+               .func = str_column_vacuum_callback,
        };
 
        if (!(*callback->argv = GDKmalloc(sizeof(char *[3]))))
                return createException(SQL, "sql.str_column_auto_vacuum", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       callback->argv[0] = m; // mvc
        callback->argv[0] = sname;
        callback->argv[1] = tname;
        callback->argv[2] = cname;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to