Kouhei Sutou
null+****@clear*****
Sun Oct 13 15:41:03 JST 2013
Kouhei Sutou 2013-10-13 15:41:03 +0900 (Sun, 13 Oct 2013) New Revision: 723a77f5a96bd87d774c19a04c0f93576d48b9fb https://github.com/groonga/groonga/commit/723a77f5a96bd87d774c19a04c0f93576d48b9fb Message: Fix a bug that database that has reference column can't be removed We need to remove index columns and reference columns before removing indexed tables/columns and referenced tables. If we don't remove them first, remove checks that block inconsistency relationship fails remove operations. Modified files: lib/db.c Modified: lib/db.c (+130 -16) =================================================================== --- lib/db.c 2013-10-12 13:23:44 +0900 (d373f69) +++ lib/db.c 2013-10-13 15:41:03 +0900 (6c8d6b8) @@ -6709,12 +6709,136 @@ remove_columns(grn_ctx *ctx, grn_obj *obj) } static void +_grn_obj_remove_db_index_columns(grn_ctx *ctx, grn_obj *db) +{ + grn_table_cursor *cur; + if ((cur = grn_table_cursor_open(ctx, db, NULL, 0, NULL, 0, 0, -1, 0))) { + grn_id id; + while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { + grn_obj *obj = grn_ctx_at(ctx, id); + if (obj && obj->header.type == GRN_COLUMN_INDEX) { + _grn_obj_remove(ctx, obj); + } + } + grn_table_cursor_close(ctx, cur); + } +} + +static void +_grn_obj_remove_db_reference_columns(grn_ctx *ctx, grn_obj *db) +{ + grn_table_cursor *cur; + if ((cur = grn_table_cursor_open(ctx, db, NULL, 0, NULL, 0, 0, -1, 0))) { + grn_id id; + while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { + grn_obj *obj = grn_ctx_at(ctx, id); + grn_obj *range = NULL; + + if (!obj) { + continue; + } + + switch (obj->header.type) { + case GRN_COLUMN_FIX_SIZE : + case GRN_COLUMN_VAR_SIZE : + if (!DB_OBJ(obj)->range) { + break; + } + + range = grn_ctx_at(ctx, DB_OBJ(obj)->range); + if (!range) { + break; + } + + switch (range->header.type) { + case GRN_TABLE_NO_KEY : + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY : + case GRN_TABLE_DAT_KEY : + _grn_obj_remove(ctx, obj); + break; + } + break; + } + } + grn_table_cursor_close(ctx, cur); + } +} + +static void +_grn_obj_remove_db_reference_tables(grn_ctx *ctx, grn_obj *db) +{ + grn_table_cursor *cur; + if ((cur = grn_table_cursor_open(ctx, db, NULL, 0, NULL, 0, 0, -1, 0))) { + grn_id id; + while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { + grn_obj *obj = grn_ctx_at(ctx, id); + grn_obj *domain = NULL; + + if (!obj) { + continue; + } + + switch (obj->header.type) { + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY : + case GRN_TABLE_DAT_KEY : + if (!obj->header.domain) { + break; + } + + domain = grn_ctx_at(ctx, obj->header.domain); + if (!domain) { + break; + } + + switch (domain->header.type) { + case GRN_TABLE_NO_KEY : + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY : + case GRN_TABLE_DAT_KEY : + _grn_obj_remove(ctx, obj); + break; + } + break; + } + } + grn_table_cursor_close(ctx, cur); + } +} + +static void +_grn_obj_remove_db_all_tables(grn_ctx *ctx, grn_obj *db) +{ + grn_table_cursor *cur; + if ((cur = grn_table_cursor_open(ctx, db, NULL, 0, NULL, 0, 0, -1, 0))) { + grn_id id; + while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { + grn_obj *obj = grn_ctx_at(ctx, id); + + if (!obj) { + continue; + } + + switch (obj->header.type) { + case GRN_TABLE_NO_KEY : + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY : + case GRN_TABLE_DAT_KEY : + _grn_obj_remove(ctx, obj); + break; + } + } + grn_table_cursor_close(ctx, cur); + } +} + +static void _grn_obj_remove_db(grn_ctx *ctx, grn_obj *obj, grn_obj *db, grn_id id, const char *path) { const char *io_spath; char *spath; - grn_table_cursor *cur; grn_db *s = (grn_db *)db; if (s->specs && @@ -6727,21 +6851,11 @@ _grn_obj_remove_db(grn_ctx *ctx, grn_obj *obj, grn_obj *db, grn_id id, spath = NULL; } - if ((cur = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, 0, -1, 0))) { - while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { - grn_obj *tbl = grn_ctx_at(ctx, id); - if (tbl) { - switch (tbl->header.type) { - case GRN_TABLE_HASH_KEY : - case GRN_TABLE_PAT_KEY: - case GRN_TABLE_DAT_KEY: - case GRN_TABLE_NO_KEY: - _grn_obj_remove(ctx, tbl); - } - } - } - grn_table_cursor_close(ctx, cur); - } + _grn_obj_remove_db_index_columns(ctx, db); + _grn_obj_remove_db_reference_columns(ctx, db); + _grn_obj_remove_db_reference_tables(ctx, db); + _grn_obj_remove_db_all_tables(ctx, db); + grn_obj_close(ctx, obj); if (spath) { -------------- next part -------------- HTML����������������������������...Download