Changeset: 58780b0f82e5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/58780b0f82e5
Branch: default
Log Message:
merged
diffs (223 lines):
diff --git a/sql/common/sql_changeset.c b/sql/common/sql_changeset.c
--- a/sql/common/sql_changeset.c
+++ b/sql/common/sql_changeset.c
@@ -10,11 +10,12 @@
#include "sql_catalog.h"
void
-cs_new(changeset * cs, sql_allocator *sa, fdestroy destroy)
+cs_new(changeset * cs, sql_allocator *sa, fdestroy destroy, fkeyvalue hfunc)
{
*cs = (changeset) {
.sa = sa,
.destroy = destroy,
+ .fkeyvalue = hfunc,
};
}
@@ -31,28 +32,49 @@ cs_destroy(changeset * cs, void *data)
}
}
-void
+changeset *
cs_add(changeset * cs, void *elm, bool isnew)
{
- if (!cs->set)
- cs->set = list_new(cs->sa, cs->destroy);
- list_append(cs->set, elm);
+ if (!cs->set && !(cs->set = list_new(cs->sa, cs->destroy)))
+ return NULL;
+
+ int sz = list_length(cs->set);
+ /* re-hash or create hash table before inserting */
+ if ((!cs->set->ht || cs->set->ht->size * 16 < sz) && sz >
HASH_MIN_SIZE) {
+ hash_destroy(cs->set->ht);
+ if (!(cs->set->ht = hash_new(cs->sa, MAX(sz, 1) * 16,
cs->fkeyvalue)))
+ return NULL;
+ for (node *n = cs->set->h; n; n = n->next) {
+ if (!hash_add(cs->set->ht, cs->set->ht->key(n->data),
n->data))
+ return NULL;
+ }
+ }
+ if (!list_append(cs->set, elm))
+ return NULL;
if (isnew && !cs->nelm)
cs->nelm = cs->set->t;
+ return cs;
}
-void
-cs_del(changeset * cs, void *gdata, node *elm, bool isnew)
+changeset *
+cs_del(changeset * cs, void *gdata, node *n, bool force)
{
- if (cs->nelm == elm)
- cs->nelm = elm->next;
- if (isnew) { /* remove just added */
- list_remove_node(cs->set, gdata, elm);
+ if (!force && !cs->dset && !(cs->dset = list_new(cs->sa, cs->destroy)))
+ return NULL;
+
+ if (cs->nelm == n) /* update nelm pointer */
+ cs->nelm = n->next;
+ if (cs->set->ht) /* delete hashed value */
+ hash_del(cs->set->ht, cs->set->ht->key(n->data), n->data);
+
+ if (force) { /* remove just added */
+ if (!list_remove_node(cs->set, gdata, n))
+ return NULL;
} else {
- if (!cs->dset)
- cs->dset = list_new(cs->sa, cs->destroy);
- list_move_data(cs->set, cs->dset, elm->data);
+ if (!list_move_data(cs->set, cs->dset, n->data))
+ return NULL;
}
+ return cs;
}
int
diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
--- a/sql/common/sql_list.c
+++ b/sql/common/sql_list.c
@@ -385,7 +385,7 @@ list_remove_list(list *l, void *gdata, l
list_remove_data(l, gdata, n->data);
}
-void
+list *
list_move_data(list *s, list *d, void *data)
{
node *n = NULL;
@@ -401,10 +401,10 @@ list_move_data(list *s, list *d, void *d
}
}
if (!n) {
- list_append(d, data);
+ return list_append(d, data);
} else {
n->next = NULL;
- list_append_node(d, n);
+ return list_append_node(d, n);
}
}
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -207,6 +207,7 @@ extern void base_init(sql_allocator *sa,
typedef struct changeset {
sql_allocator *sa;
fdestroy destroy;
+ fkeyvalue fkeyvalue;
struct list *set;
struct list *dset;
node *nelm;
@@ -266,10 +267,10 @@ extern node *ol_rehash(objlist *ol, cons
#define ol_last_node(ol) (ol->l->t)
#define ol_fetch(ol,nr) (list_fetch(ol->l, nr))
-extern void cs_new(changeset * cs, sql_allocator *sa, fdestroy destroy);
+extern void cs_new(changeset * cs, sql_allocator *sa, fdestroy destroy,
fkeyvalue hfunc);
extern void cs_destroy(changeset * cs, void *data);
-extern void cs_add(changeset * cs, void *elm, bool isnew);
-extern void cs_del(changeset * cs, void *gdata, node *elm, bool isnew);
+extern changeset *cs_add(changeset * cs, void *elm, bool isnew);
+extern changeset *cs_del(changeset * cs, void *gdata, node *n, bool force);
extern int cs_size(changeset * cs);
extern node *cs_find_id(changeset * cs, sqlid id);
diff --git a/sql/include/sql_list.h b/sql/include/sql_list.h
--- a/sql/include/sql_list.h
+++ b/sql/include/sql_list.h
@@ -52,7 +52,7 @@ extern list *list_prepend(list *l, void
extern node *list_remove_node(list *l, void *gdata, node *n);
extern void list_remove_data(list *l, void *gdata, void *data);
extern void list_remove_list(list *l, void *gdata, list *data);
-extern void list_move_data(list *l, list *d, void *data);
+extern list *list_move_data(list *l, list *d, void *data);
extern int list_traverse(list *l, traverse_func f, void *clientdata);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3593,7 +3593,7 @@ sql_trans_rollback(sql_trans *tr, bool c
for(node *n=tr->localtmps.dset->h; n; ) {
node *next = n->next;
sql_table *tt = n->data;
- if (!isNew(tt))
+ if (!isNew(tt)) /* TODO this is prepending without
re-hashing? */
list_prepend(tr->localtmps.set,
dup_base(&tt->base));
n = next;
}
@@ -3654,7 +3654,7 @@ sql_trans_rollback(sql_trans *tr, bool c
if (tr->localtmps.nelm) {
for(node *n=tr->localtmps.nelm; n; ) {
node *next = n->next;
- list_remove_node(tr->localtmps.set, store, n);
+ (void) cs_del(&tr->localtmps, store, n, true);
n = next;
}
tr->localtmps.nelm = NULL;
@@ -3717,7 +3717,7 @@ sql_trans_create_(sqlstore *store, sql_t
if (!tr)
return NULL;
- cs_new(&tr->localtmps, tr->sa, (fdestroy) &table_destroy);
+ cs_new(&tr->localtmps, NULL, (fdestroy) &table_destroy,
(fkeyvalue)&base_key);
MT_lock_init(&tr->lock, "trans_lock");
tr->parent = parent;
if (name) {
@@ -5537,20 +5537,15 @@ sql_trans_rename_table(sql_trans *tr, sq
return res;
} else {
node *n = cs_find_id(&tr->localtmps, t->base.id);
- if (n)
- cs_del(&tr->localtmps, tr->store, n, t->base.new);
+ if (n && !cs_del(&tr->localtmps, tr->store, n, t->base.new))
+ return -1;
}
if ((res = table_dup(tr, t, t->s, new_name, &dup)))
return res;
t = dup;
- if (!isGlobal(t)) {
- if (tr->localtmps.set == NULL)
- tr->localtmps.set = list_new(tr->localtmps.sa,
tr->localtmps.destroy);
- if (tr->localtmps.set->ht == NULL ||
tr->localtmps.set->ht->size * 16 < list_length(tr->localtmps.set))
- tr->localtmps.set->ht = hash_new(tr->localtmps.sa, 16,
(fkeyvalue)&base_key);
- cs_add(&tr->localtmps, t, true);
- }
+ if (!isGlobal(t) && !cs_add(&tr->localtmps, t, true))
+ return -1;
return res;
}
@@ -5633,12 +5628,8 @@ sql_trans_create_table(sql_table **tres,
if (isGlobal(t)) {
if ((res = os_add(s->tables, tr, t->base.name, &t->base)))
return res;
- } else {
- if (tr->localtmps.set == NULL)
- tr->localtmps.set = list_new(tr->localtmps.sa,
tr->localtmps.destroy);
- if (tr->localtmps.sa && (tr->localtmps.set->ht == NULL ||
tr->localtmps.set->ht->size * 16 < list_length(tr->localtmps.set)))
- tr->localtmps.set->ht = hash_new(tr->localtmps.sa, 16,
(fkeyvalue)&base_key);
- cs_add(&tr->localtmps, t, true);
+ } else if (!cs_add(&tr->localtmps, t, true)) {
+ return -1;
}
if (isRemote(t))
t->persistence = SQL_REMOTE;
@@ -5866,8 +5857,8 @@ sql_trans_drop_table(sql_trans *tr, sql_
if (is_global) {
if ((res = os_del(s->tables, tr, t->base.name,
dup_base(&t->base))))
return res;
- } else if (n)
- cs_del(&tr->localtmps, tr->store, n, 0);
+ } else if (n && !cs_del(&tr->localtmps, tr->store, n, 0))
+ return -1;
sqlstore *store = tr->store;
if (isTable(t) && !isNew(t))
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]