[Groonga-mysql-commit] mroonga/mroonga [master] [wrapper][index] support drop table. fixes #928

Back to archive index

null+****@clear***** null+****@clear*****
2011年 6月 13日 (月) 18:25:33 JST


Kouhei Sutou	2011-06-13 09:25:33 +0000 (Mon, 13 Jun 2011)

  New Revision: 1a9255931612dfa47de1cc1a926a365c7e52175a

  Log:
    [wrapper][index] support drop table. fixes #928

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+37 -4)
===================================================================
--- ha_mroonga.cc    2011-06-13 09:14:41 +0000 (d6ce151)
+++ ha_mroonga.cc    2011-06-13 09:25:33 +0000 (7481e0b)
@@ -1756,7 +1756,8 @@ int ha_mroonga::close()
   DBUG_RETURN(0);
 }
 
-int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share)
+int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share,
+                                     const char *table_name)
 {
   int error;
   handler *hnd;
@@ -1777,10 +1778,42 @@ int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share)
     DBUG_RETURN(error);
   }
 
-  /* TODO: create groonga index */
+  error = wrapper_delete_index(name, tmp_share, table_name);
 
   delete hnd;
-  DBUG_RETURN(0);
+  DBUG_RETURN(error);
+}
+
+int ha_mroonga::wrapper_delete_index(const char *name, MRN_SHARE *tmp_share,
+                                     const char *table_name)
+{
+  int error;
+  MRN_DBUG_ENTER_METHOD();
+
+  error = ensure_database_open(name);
+  if (error)
+    DBUG_RETURN(error);
+
+  TABLE_SHARE *tmp_table_share = tmp_share->table_share;
+
+  int i;
+  for (i = 0; i < tmp_table_share->keys; i++) {
+    char index_name[MRN_MAX_PATH_SIZE];
+    mrn_index_name_gen(table_name, i, index_name);
+    grn_obj *index_table = grn_ctx_get(ctx, index_name, strlen(index_name));
+    if (index_table != NULL) {
+      grn_obj_remove(ctx, index_table);
+    }
+  }
+
+  grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name));
+  if (ctx->rc) {
+    error = ER_CANT_OPEN_FILE;
+    my_message(error, ctx->errbuf, MYF(0));
+    DBUG_RETURN(error);
+  }
+  error = grn_obj_remove(ctx, table);
+  DBUG_RETURN(error);
 }
 
 int ha_mroonga::default_delete_table(const char *name, MRN_SHARE *tmp_share,
@@ -1859,7 +1892,7 @@ int ha_mroonga::delete_table(const char *name)
 
   if (tmp_share->wrapper_mode)
   {
-    error = wrapper_delete_table(name, tmp_share);
+    error = wrapper_delete_table(name, tmp_share, tbl_name);
   } else {
     error = default_delete_table(name, tmp_share, tbl_name);
   }

  Modified: ha_mroonga.h (+4 -1)
===================================================================
--- ha_mroonga.h    2011-06-13 09:14:41 +0000 (c8acaa4)
+++ ha_mroonga.h    2011-06-13 09:25:33 +0000 (b8888fe)
@@ -220,7 +220,10 @@ private:
   int default_create_validate_index(TABLE *table);
   int ensure_database_create(const char *name);
   int ensure_database_open(const char *name);
-  int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share);
+  int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share,
+                           const char *table_name);
+  int wrapper_delete_index(const char *name, MRN_SHARE *tmp_share,
+                           const char *table_name);
   int default_delete_table(const char *name, MRN_SHARE *tmp_share,
                            const char *tbl_name);
   int wrapper_open(const char *name, int mode, uint test_if_locked);




Groonga-mysql-commit メーリングリストの案内
Back to archive index