Changeset: 9c7d70442261 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9c7d70442261 Modified Files: sql/storage/store.c Branch: nospare Log Message:
handle some more objects (destructions) keys/idxs and funcs diffs (143 lines): diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -211,6 +211,97 @@ table_destroy(sqlstore *store, sql_table cs_destroy(&t->columns); } +/* todo add destroy callback, to clean the object it self */ +static void +base_destroy(sqlstore *store, sql_base *b, ulng commit_ts, list *l1, list *l2) +{ + sql_base *older = b->older; + sql_base *newer = b->newer; + + assert(b->refcnt == 1); + if (--(b->refcnt) > 0) + return; + + if (older && commit_ts) { + base_destroy(store, older, commit_ts, l1, l2); + older = NULL; + } + b->older = NULL; + + if (newer && commit_ts) + newer->older = NULL; + else if (newer && older) + newer->older = older; + + if (l1) { + node *bn = list_find(l1, b, NULL); + if (bn) + list_remove_node(l1, bn); + } + if (l2) { + node *bn = list_find(l2, b, NULL); + if (bn) + list_remove_node(l2, bn); + } +} + +static int +tc_gc_func(sqlstore *store, sql_change *change, ulng commit_ts, ulng oldest) +{ + sql_func *f = (sql_func*)change->obj; + + (void)store; + if (f->base.deleted || !commit_ts) { + if (f->base.ts < oldest || (f->base.ts == commit_ts && commit_ts == oldest) || !commit_ts) { + int ok = LOG_OK; + base_destroy(store, &f->base, commit_ts, f->s->funcs.set, NULL); + if (ok == LOG_OK) + return 1; /* handled */ + else + return LOG_ERR; + } + } + return 0; +} + +static int +tc_gc_key(sqlstore *store, sql_change *change, ulng commit_ts, ulng oldest) +{ + sql_key *k = (sql_key*)change->obj; + + (void)store; + if (k->base.deleted || !commit_ts) { + if (k->base.ts < oldest || (k->base.ts == commit_ts && commit_ts == oldest) || !commit_ts) { + int ok = LOG_OK; + base_destroy(store, &k->base, commit_ts, k->t->keys.set, k->t->s->keys); + if (ok == LOG_OK) + return 1; /* handled */ + else + return LOG_ERR; + } + } + return 0; +} + +static int +tc_gc_idx(sqlstore *store, sql_change *change, ulng commit_ts, ulng oldest) +{ + sql_idx *i = (sql_idx*)change->obj; + + (void)store; + if (i->base.deleted || !commit_ts) { + if (i->base.ts < oldest || (i->base.ts == commit_ts && commit_ts == oldest) || !commit_ts) { + int ok = LOG_OK; + base_destroy(store, &i->base, commit_ts, i->t->idxs.set, i->t->s->idxs); + if (ok == LOG_OK) + return 1; /* handled */ + else + return LOG_ERR; + } + } + return 0; +} + static int tc_gc_table(sqlstore *store, sql_change *change, ulng commit_ts, ulng oldest) { @@ -3044,6 +3135,7 @@ sql_trans_copy_key( sql_trans *tr, sql_t nk->base.ts = tr->tid; assert( nk->type != fkey || ((sql_fkey*)nk)->rkey); store->table_api.table_insert(tr, syskey, &nk->base.id, &t->base.id, &nk->type, nk->base.name, (nk->type == fkey) ? &((sql_fkey *) nk)->rkey->k.base.id : &neg, &action); + trans_add(tr, &nk->base, NULL, &tc_gc_key, NULL); if (nk->type == fkey) sql_trans_create_dependency(tr, ((sql_fkey *) nk)->rkey->k.base.id, nk->base.id, FKEY_DEPENDENCY); @@ -3100,6 +3192,7 @@ sql_trans_copy_idx( sql_trans *tr, sql_t } list_append(t->s->idxs, ni); cs_add(&t->idxs, ni, TR_NEW); + trans_add(tr, &ni->base, NULL, &tc_gc_idx, NULL); if (isDeclaredTable(i->t)) if (!isDeclaredTable(t) && isTable(ni->t) && idx_has_column(ni->type)) @@ -4198,6 +4291,7 @@ sql_trans_create_func(sql_trans *tr, sql sqlid id = next_oid(tr->store); store->table_api.table_insert(tr, sysarg, &id, &t->base.id, a->name, a->type.type->sqlname, &a->type.digits, &a->type.scale, &a->inout, &number); } + trans_add(tr, &t->base, NULL, NULL, NULL); return t; } @@ -4224,7 +4318,16 @@ sql_trans_drop_func(sql_trans *tr, sql_s } sys_drop_func(tr, func, DROP_CASCADE); - cs_del(&s->funcs, n, func->base.flags); + + sql_func *df = SA_ZNEW(tr->sa, sql_func); + *df = *func; + df->base.ts = tr->tid; + df->base.deleted = 1; + df->base.older = &func->base; + func->base.newer = &df->base; + trans_add(tr, &df->base, NULL, &tc_gc_func, NULL); + list_update_data(s->funcs.set, n, df); + //cs_del(&s->funcs, n, func->base.flags); if (drop_action == DROP_CASCADE_START && tr->dropped) { list_destroy(tr->dropped); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list