[Groonga-mysql-commit] mroonga/mroonga [master] fixes #927 add wrapper drop table

Back to archive index

null+****@clear***** null+****@clear*****
2011年 6月 9日 (木) 03:21:43 JST


Kentoku	2011-06-08 18:21:43 +0000 (Wed, 08 Jun 2011)

  New Revision: c3f12668ae7b89f45322ce5ee1fe352008f952b3

  Log:
    fixes #927 add wrapper drop table

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h
    mrn_table.cc
    mrn_table.h

  Modified: ha_mroonga.cc (+34 -1)
===================================================================
--- ha_mroonga.cc    2011-06-08 13:45:21 +0000 (2ee8f8e)
+++ ha_mroonga.cc    2011-06-08 18:21:43 +0000 (cb22fd5)
@@ -942,12 +942,38 @@ int ha_mroonga::wrapper_create(const char *name, TABLE *table,
   DBUG_ENTER("ha_mroonga::wrapper_create");
   /* TODO: create groonga index */
 
+  wrap_key_info = mrn_create_key_info_for_table(tmp_share, table, &error);
+  if (error)
+    DBUG_RETURN(error);
+  base_key_info = table->key_info;
+
+  MRN_SET_WRAP_SHARE_KEY(tmp_share, table->s);
+  MRN_SET_WRAP_TABLE_KEY(this, table);
   if (!(hnd =
       tmp_share->hton->create(tmp_share->hton, table->s,
         current_thd->mem_root)))
+  {
+    MRN_SET_BASE_SHARE_KEY(tmp_share, table->s);
+    MRN_SET_BASE_TABLE_KEY(this, table);
+    if (wrap_key_info)
+    {
+      my_free(wrap_key_info, MYF(0));
+      wrap_key_info = NULL;
+    }
+    base_key_info = NULL;
     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+  }
   error = hnd->ha_create(name, table, info);
+  MRN_SET_BASE_SHARE_KEY(tmp_share, table->s);
+  MRN_SET_BASE_TABLE_KEY(this, table);
   delete hnd;
+
+  if (wrap_key_info)
+  {
+    my_free(wrap_key_info, MYF(0));
+    wrap_key_info = NULL;
+  }
+  base_key_info = NULL;
   DBUG_RETURN(error);
 }
 
@@ -1393,10 +1419,15 @@ int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share)
   int error;
   handler *hnd;
   DBUG_ENTER("ha_mroonga::wrapper_delete_table");
+  MRN_SET_WRAP_SHARE_KEY(tmp_share, tmp_share->table_share);
   if (!(hnd =
-      tmp_share->hton->create(tmp_share->hton, table->s,
+      tmp_share->hton->create(tmp_share->hton, tmp_share->table_share,
       current_thd->mem_root)))
+  {
+    MRN_SET_BASE_SHARE_KEY(tmp_share, tmp_share->table_share);
     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+  }
+  MRN_SET_BASE_SHARE_KEY(tmp_share, tmp_share->table_share);
 
   if ((error = hnd->ha_delete_table(name)))
   {
@@ -1473,6 +1504,8 @@ int ha_mroonga::delete_table(const char *name)
     DBUG_RETURN(error);
   }
   mysql_mutex_unlock(&LOCK_open);
+  /* This is previous version */
+  tmp_table_share->version--;
   tmp_table.s = tmp_table_share;
   tmp_table.part_info = NULL;
   if (!(tmp_share = mrn_get_share(name, &tmp_table, &error)))

  Modified: ha_mroonga.h (+4 -0)
===================================================================
--- ha_mroonga.h    2011-06-08 13:45:21 +0000 (9601ead)
+++ ha_mroonga.h    2011-06-08 18:21:43 +0000 (ce4536b)
@@ -69,6 +69,10 @@ class ha_mroonga: public handler
   THR_LOCK thr_lock;
   THR_LOCK_DATA thr_lock_data;
 
+  MRN_SHARE *share;
+  KEY       *wrap_key_info;
+  KEY       *base_key_info;
+
   grn_ctx *ctx;
 
   grn_obj *db;

  Modified: mrn_table.cc (+69 -1)
===================================================================
--- mrn_table.cc    2011-06-08 13:45:21 +0000 (91c4dff)
+++ mrn_table.cc    2011-06-08 18:21:43 +0000 (d53a282)
@@ -440,7 +440,8 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
 {
   MRN_SHARE *share;
   char *tmp_name;
-  uint length;
+  uint length, *wrap_keynr, i, j;
+  KEY *wrap_key_info;
   DBUG_ENTER("mrn_get_share");
   length = (uint) strlen(table_name);
   pthread_mutex_lock(&mrn_open_tables_mutex);
@@ -451,6 +452,8 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
       my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
         &share, sizeof(*share),
         &tmp_name, length + 1,
+        &wrap_keynr, sizeof(*wrap_keynr) * table->s->keys,
+        &wrap_key_info, sizeof(*wrap_key_info) * table->s->keys,
         NullS))
     ) {
       *error = HA_ERR_OUT_OF_MEM;
@@ -464,6 +467,41 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
 
     if ((*error = mrn_parse_table_param(share, table)))
       goto error_parse_table_param;
+
+    if (share->wrapper_mode)
+    {
+      j = 0;
+      for (i = 0; i < table->s->keys; i++)
+      {
+        if (table->s->key_info[i].algorithm != HA_KEY_ALG_FULLTEXT)
+        {
+          wrap_keynr[i] = j;
+          memcpy(&wrap_key_info[j], &table->s->key_info[i],
+                 sizeof(*wrap_key_info));
+          j++;
+        } else {
+          wrap_keynr[i] = MAX_KEY;
+        }
+      }
+      share->wrap_keys = j;
+      share->base_keys = table->s->keys;
+      share->base_key_info = table->s->key_info;
+      share->base_primary_key = table->s->primary_key;
+      if (i)
+      {
+        share->wrap_keynr = wrap_keynr;
+        share->wrap_key_info = wrap_key_info;
+        if (table->s->primary_key == MAX_KEY)
+          share->wrap_primary_key = MAX_KEY;
+        else
+          share->wrap_primary_key = wrap_keynr[table->s->primary_key];
+      } else {
+        share->wrap_keynr = NULL;
+        share->wrap_key_info = NULL;
+        share->wrap_primary_key = MAX_KEY;
+      }
+    }
+
     if (pthread_mutex_init(&share->mutex, MY_MUTEX_INIT_FAST))
     {
       *error = HA_ERR_OUT_OF_MEM;
@@ -540,3 +578,33 @@ void mrn_free_table_share(TABLE_SHARE *share)
 #endif
   DBUG_VOID_RETURN;
 }
+
+KEY *mrn_create_key_info_for_table(MRN_SHARE *share, TABLE *table, int *error)
+{
+  uint *wrap_keynr = share->wrap_keynr, i, j;
+  KEY *wrap_key_info;
+  DBUG_ENTER("mrn_create_key_info_for_table");
+  if (share->wrap_keys)
+  {
+    if (!(wrap_key_info = (KEY *)
+      my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
+        &wrap_key_info, sizeof(*wrap_key_info) * share->wrap_keys,
+        NullS))
+    ) {
+      *error = HA_ERR_OUT_OF_MEM;
+      DBUG_RETURN(NULL);
+    }
+    for (i = 0; i < table->s->keys; i++)
+    {
+      j = wrap_keynr[i];
+      if (j < MAX_KEY)
+      {
+        memcpy(&wrap_key_info[j], &table->key_info[i],
+               sizeof(*wrap_key_info));
+      }
+    }
+  } else
+    wrap_key_info = NULL;
+  *error = 0;
+  DBUG_RETURN(wrap_key_info);
+}

  Modified: mrn_table.h (+24 -0)
===================================================================
--- mrn_table.h    2011-06-08 13:45:21 +0000 (d668246)
+++ mrn_table.h    2011-06-08 18:21:43 +0000 (1582240)
@@ -35,9 +35,32 @@ typedef struct st_mroonga_share
   int                engine_length;
   plugin_ref         plugin;
   handlerton         *hton;
+  uint               *wrap_keynr;
+  uint               wrap_keys;
+  uint               base_keys;
+  KEY                *wrap_key_info;
+  KEY                *base_key_info;
+  uint               wrap_primary_key;
+  uint               base_primary_key;
   bool               wrapper_mode;
 } MRN_SHARE;
 
+#define MRN_SET_WRAP_SHARE_KEY(share, table_share) \
+  table_share->keys = share->wrap_keys; \
+  table_share->key_info = share->wrap_key_info; \
+  table_share->primary_key = share->wrap_primary_key;
+
+#define MRN_SET_BASE_SHARE_KEY(share, table_share) \
+  table_share->keys = share->base_keys; \
+  table_share->key_info = share->base_key_info; \
+  table_share->primary_key = share->base_primary_key;
+
+#define MRN_SET_WRAP_TABLE_KEY(file, table) \
+  table->key_info = file->wrap_key_info;
+
+#define MRN_SET_BASE_TABLE_KEY(file, table) \
+  table->key_info = file->base_key_info;
+
 char *mrn_create_string(const char *str, uint length);
 char *mrn_get_string_between_quote(char *ptr, bool alloc);
 #ifdef WITH_PARTITION_STORAGE_ENGINE
@@ -50,5 +73,6 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error);
 int mrn_free_share(MRN_SHARE *share);
 TABLE_SHARE *mrn_get_table_share(TABLE_LIST *table_list, int *error);
 void mrn_free_table_share(TABLE_SHARE *share);
+KEY *mrn_create_key_info_for_table(MRN_SHARE *share, TABLE *table, int *error);
 
 #endif /* _mrn_table_h */




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