[Groonga-commit] groonga/groonga at 723a77f [master] Fix a bug that database that has reference column can't be removed

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index