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