Changeset: 748048dae64e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=748048dae64e
Modified Files:
sql/include/sql_catalog.h
sql/storage/store.c
Branch: nospare
Log Message:
handle schema drops
diffs (110 lines):
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
@@ -724,7 +724,7 @@ typedef struct sql_session {
backend_stack stk;
} sql_session;
-extern void schema_destroy(sql_schema *s);
+//extern void schema_destroy(sql_schema *s);
//extern void table_destroy(sql_table *t);
extern void column_destroy(sql_column *c);
extern void key_destroy(sql_key *k);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -233,21 +233,66 @@ tc_log_table(sql_trans *tr, sql_change *
return ok;
}
-void
-schema_destroy(sql_schema *s)
-{
- cs_destroy(&s->parts);
- cs_destroy(&s->tables);
- cs_destroy(&s->funcs);
- cs_destroy(&s->types);
- list_destroy(s->keys);
- list_destroy(s->idxs);
- list_destroy(s->triggers);
+static void
+schema_destroy(sqlstore *store, sql_schema *s)
+{
+ sql_schema *older = (sql_schema*)s->base.older;
+ sql_schema *newer = (sql_schema*)s->base.newer;
+
+ assert(s->base.refcnt == 1);
+ if (--(s->base.refcnt) > 0)
+ return;
+
+ if (older)
+ schema_destroy(store, older);
+ s->base.older = NULL;
+
+ if (newer)
+ newer->base.older = NULL;
+
+ node *sn = list_find(store->cat->schemas.set, s, NULL);
+ if (sn)
+ list_remove_node(store->cat->schemas.set, sn);
+
+ if (!newer || newer->parts.set != s->parts.set)
+ cs_destroy(&s->parts);
+ if (!newer || newer->tables.set != s->tables.set)
+ cs_destroy(&s->tables);
+ if (!newer || newer->funcs.set != s->funcs.set)
+ cs_destroy(&s->funcs);
+ if (!newer || newer->types.set != s->types.set)
+ cs_destroy(&s->types);
+ if (!newer || newer->keys != s->keys)
+ list_destroy(s->keys);
+ if (!newer || newer->idxs != s->idxs)
+ list_destroy(s->idxs);
+ if (!newer || newer->triggers != s->triggers)
+ list_destroy(s->triggers);
s->keys = NULL;
s->idxs = NULL;
s->triggers = NULL;
}
+static int
+tc_gc_schema(sqlstore *store, sql_change *change, ulng commit_ts, ulng oldest)
+{
+ sql_schema *s = (sql_schema*)change->obj;
+
+ (void)store;
+ if (s->base.deleted) {
+ if (s->base.ts < oldest || (s->base.ts == commit_ts &&
commit_ts == oldest)) {
+ int ok = LOG_OK;
+ schema_destroy(store, s);
+ if (ok == LOG_OK)
+ return 1; /* handled */
+ else
+ return LOG_ERR;
+ }
+ }
+ return 0;
+}
+
+
sql_trans *
sql_trans_destroy(sql_trans *tr)
{
@@ -4141,7 +4186,16 @@ sql_trans_drop_schema(sql_trans *tr, sql
sys_drop_sequences(tr, s, drop_action);
sql_trans_drop_any_comment(tr, s->base.id);
sql_trans_drop_obj_priv(tr, s->base.id);
- cs_del(&tr->cat->schemas, n, s->base.flags);
+
+ sql_schema *ds = SA_ZNEW(tr->sa, sql_schema);
+ *ds = *s;
+ ds->base.ts = tr->tid;
+ ds->base.deleted = 1;
+ ds->base.older = &s->base;
+ s->base.newer = &ds->base;
+ trans_add(tr, &s->base, NULL, &tc_gc_schema, NULL);
+ list_update_data(tr->cat->schemas.set, n, ds);
+ //cs_del(&tr->cat->schemas, n, s->base.flags);
if (drop_action == DROP_CASCADE_START && tr->dropped) {
list_destroy(tr->dropped);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list