Changeset: e285a0fcb4f2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e285a0fcb4f2
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/sql_storage.h
Branch: copybinary
Log Message:

Get rid of ugly is_new field on delta


diffs (190 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -18,6 +18,27 @@ static MT_Lock destroy_lock = MT_LOCK_IN
 sql_dbat *tobe_destroyed_dbat = NULL;
 sql_delta *tobe_destroyed_delta = NULL;
 
+/* used for communication between {append,update}_prepare and 
{append,update}_execute */
+struct prep_exec_cookie {
+       sql_delta *delta;
+       bool is_new; // only used for updates
+};
+
+/* creates a new cookie, backed by sql allocator memory so it is
+ * automatically freed even if errors occur
+ */
+static struct prep_exec_cookie *
+make_cookie(sql_trans *tr, sql_delta *delta, bool is_new)
+{
+       struct prep_exec_cookie *cookie;
+       cookie = sa_alloc(tr->sa, sizeof(*cookie));
+       if (!cookie)
+               return NULL;
+       cookie->delta = delta;
+       cookie->is_new = is_new;
+       return cookie;
+}
+
 static sql_trans *
 oldest_active_transaction(void)
 {
@@ -621,35 +642,33 @@ update_col_prepare(sql_trans *tr, sql_co
        assert(tr != gtrans);
        c->base.rtime = c->t->base.rtime = c->t->s->base.rtime = tr->stime;
 
-       delta->is_new = isNew(c);
-
-       return delta;
+       return make_cookie(tr, delta, isNew(c));
 }
 
 static int
-update_col_execute(void *incoming_delta, void *incoming_tids, void 
*incoming_values, bool is_bat)
+update_col_execute(void *incoming_cookie, void *incoming_tids, void 
*incoming_values, bool is_bat)
 {
-       sql_delta *delta = incoming_delta;
+       struct prep_exec_cookie *cookie = incoming_cookie;
 
        if (is_bat) {
                BAT *tids = incoming_tids;
                BAT *values = incoming_values;
                if (BATcount(tids) == 0)
                        return LOG_OK;
-               return delta_update_bat(delta, tids, values, delta->is_new);
+               return delta_update_bat(cookie->delta, tids, values, 
cookie->is_new);
        }
        else
-               return delta_update_val(delta, *(oid*)incoming_tids, 
incoming_values);
+               return delta_update_val(cookie->delta, *(oid*)incoming_tids, 
incoming_values);
 }
 
 static int
 update_col(sql_trans *tr, sql_column *c, void *tids, void *upd, int tpe)
 {
-       sql_delta *delta = update_col_prepare(tr, c);
-       if (delta == NULL)
+       void *cookie = update_col_prepare(tr, c);
+       if (cookie == NULL)
                return LOG_ERR;
 
-       int ok = update_col_execute(delta, tids, upd, tpe == TYPE_bat);
+       int ok = update_col_execute(cookie, tids, upd, tpe == TYPE_bat);
 
        return ok;
 }
@@ -683,19 +702,17 @@ update_idx_prepare(sql_trans *tr, sql_id
        assert(tr != gtrans);
        i->base.rtime = i->t->base.rtime = i->t->s->base.rtime = tr->stime;
 
-       delta->is_new = isNew(i);
-
-       return delta;
+       return make_cookie(tr, delta, isNew(i));
 }
 
 static int
 update_idx(sql_trans *tr, sql_idx * i, void *tids, void *upd, int tpe)
 {
-       sql_delta *delta = update_idx_prepare(tr, i);
-       if (delta == NULL)
+       void *cookie = update_idx_prepare(tr, i);
+       if (cookie == NULL)
                return LOG_ERR;
 
-       int ok = update_col_execute(delta, tids, upd, tpe == TYPE_bat);
+       int ok = update_col_execute(cookie, tids, upd, tpe == TYPE_bat);
        return ok;
 }
 
@@ -888,13 +905,13 @@ append_col_prepare(sql_trans *tr, sql_co
        assert(tr != gtrans);
        c->t->s->base.rtime = c->t->base.rtime = tr->stime;
 
-       return delta;
+       return make_cookie(tr, delta, false);
 }
 
 static int
-append_col_execute(void *incoming_delta, void *incoming_data, bool is_bat)
+append_col_execute(void *incoming_cookie, void *incoming_data, bool is_bat)
 {
-       sql_delta *delta = incoming_delta;
+       struct prep_exec_cookie *cookie = incoming_cookie;
        int ok;
 
        if (is_bat) {
@@ -902,9 +919,9 @@ append_col_execute(void *incoming_delta,
 
                if (!BATcount(bat))
                        return LOG_OK;
-               ok = delta_append_bat(delta, bat);
+               ok = delta_append_bat(cookie->delta, bat);
        } else {
-               ok = delta_append_val(delta, incoming_data);
+               ok = delta_append_val(cookie->delta, incoming_data);
        }
 
        return ok;
@@ -913,11 +930,11 @@ append_col_execute(void *incoming_delta,
 static int
 append_col(sql_trans *tr, sql_column *c, void *i, int tpe)
 {
-       sql_delta *delta = append_col_prepare(tr, c);
-       if (delta == NULL)
+       void *cookie = append_col_prepare(tr, c);
+       if (cookie == NULL)
                return LOG_ERR;
 
-       int ok = append_col_execute(delta, i, tpe == TYPE_bat);
+       int ok = append_col_execute(cookie, i, tpe == TYPE_bat);
 
        return ok;
 }
@@ -933,17 +950,17 @@ append_idx_prepare(sql_trans *tr, sql_id
        /* appends only write */
        delta->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime = 
tr->wtime = tr->wstime;
 
-       return delta;
+       return make_cookie(tr, delta, false);
 }
 
 static int
 append_idx(sql_trans *tr, sql_idx * i, void *data, int tpe)
 {
-       sql_delta *delta = append_idx_prepare(tr, i);
-       if (delta == NULL)
+       void *cookie = append_idx_prepare(tr, i);
+       if (cookie == NULL)
                return LOG_ERR;
 
-       int ok = append_col_execute(delta, data, tpe == TYPE_bat);
+       int ok = append_col_execute(cookie, data, tpe == TYPE_bat);
 
        return ok;
 }
diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h
--- a/sql/storage/bat/bat_storage.h
+++ b/sql/storage/bat/bat_storage.h
@@ -20,7 +20,6 @@ typedef struct sql_delta {
        int uibid;              /* bat with positions of updates */
        int uvbid;              /* bat with values of updates */
        int cleared;
-       bool is_new;
        size_t cnt;             /* number of tuples (excluding the deletes) */
        size_t ucnt;            /* number of updates */
        BAT *cached;            /* cached copy, used for schema bats only */
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -143,8 +143,8 @@ typedef int (*update_idx_fptr) (sql_tran
 typedef void *(*modify_col_prep_fptr) (sql_trans *tr, sql_column *c);
 typedef void *(*modify_idx_prep_fptr) (sql_trans *tr, sql_idx *i);
 
-typedef int (*append_col_exec_fptr) (void *dlt, void *b, bool is_bat);
-typedef int (*update_col_exec_fptr) (void *incoming_delta, void 
*incoming_tids, void *incoming_values, bool is_bat);
+typedef int (*append_col_exec_fptr) (void *cookie, void *b, bool is_bat);
+typedef int (*update_col_exec_fptr) (void *cookie, void *tids, void *values, 
bool is_bat);
 
 typedef int (*delete_tab_fptr) (sql_trans *tr, sql_table *t, void *d, int tpe);
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to