[Groonga-mysql-commit] mroonga/mroonga [master] fix for temporary table. refs #1267

Zurück zum Archiv-Index

null+****@clear***** null+****@clear*****
2012年 2月 14日 (火) 04:24:11 JST


Kentoku	2012-02-14 04:24:11 +0900 (Tue, 14 Feb 2012)

  New Revision: a5667cb7e289c16c3ae875b59eec34ce7bf988f1

  Log:
    fix for temporary table. refs #1267

  Modified files:
    ha_mroonga.cc
    mrn_sys.c

  Modified: ha_mroonga.cc (+65 -21)
===================================================================
--- ha_mroonga.cc    2012-02-11 21:50:53 +0900 (dacf30f)
+++ ha_mroonga.cc    2012-02-14 04:24:11 +0900 (73161df)
@@ -1431,6 +1431,32 @@ static uint mrn_alter_table_flags(uint flags) {
   return ret_flags;
 }
 
+static int mrn_add_alter_share(const char *path, TABLE_SHARE *tmp_table_share)
+{
+  THD *thd = current_thd;
+  MRN_DBUG_ENTER_FUNCTION();
+  st_mrn_slot_data *slot_data = mrn_get_slot_data(thd, TRUE);
+  if (!slot_data)
+    DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+  st_mrn_alter_share *alter_share =
+    (st_mrn_alter_share *) malloc(sizeof(st_mrn_alter_share));
+  if (!alter_share)
+    DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+  alter_share->next = NULL;
+  strcpy(alter_share->path, path);
+  alter_share->alter_share = tmp_table_share;
+  if (slot_data->first_alter_share)
+  {
+    st_mrn_alter_share *tmp_alter_share = slot_data->first_alter_share;
+    while (tmp_alter_share->next)
+      tmp_alter_share = tmp_alter_share->next;
+    tmp_alter_share->next = alter_share;
+  } else {
+    slot_data->first_alter_share = alter_share;
+  }
+  DBUG_RETURN(0);
+}
+
 static void mrn_init_time(void)
 {
   struct tm now_tm;
@@ -3357,6 +3383,41 @@ int ha_mroonga::close()
     error = storage_close();
   }
 
+  if (share->table_name[0] != '.') {
+    /* temporary table */
+    char db_name[MRN_MAX_PATH_SIZE];
+    char table_name[MRN_MAX_PATH_SIZE];
+    char decode_name[MRN_MAX_PATH_SIZE];
+    TABLE_LIST table_list;
+    TABLE_SHARE *tmp_table_share;
+    int tmp_error;
+    mrn_decode((uchar *) decode_name,
+               (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+               (const uchar *) share->table_name,
+               (const uchar *) share->table_name + strlen(share->table_name));
+    mrn_db_name_gen(decode_name, db_name);
+    mrn_table_name_gen(decode_name, table_name);
+#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS
+    table_list.init_one_table(db_name, strlen(db_name),
+                              table_name, strlen(table_name), table_name,
+                              TL_WRITE);
+#else
+    table_list.init_one_table(db_name, table_name, TL_WRITE);
+#endif
+    mrn_open_mutex_lock();
+    tmp_table_share =
+      mrn_create_tmp_table_share(&table_list, share->table_name, &tmp_error);
+    mrn_open_mutex_unlock();
+    if (!tmp_table_share) {
+      error = tmp_error;
+    } else if ((tmp_error = mrn_add_alter_share(share->table_name,
+                                                tmp_table_share))) {
+      error = tmp_error;
+      mrn_open_mutex_lock();
+      mrn_free_tmp_table_share(tmp_table_share);
+      mrn_open_mutex_unlock();
+    }
+  }
   mrn_free_share(share);
   share = NULL;
   is_clone = FALSE;
@@ -3524,7 +3585,8 @@ int ha_mroonga::delete_table(const char *name)
   {
 #ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS
     table_list.init_one_table(db_name, strlen(db_name),
-                              table_name, strlen(table_name), table_name, TL_WRITE);
+                              table_name, strlen(table_name), table_name,
+                              TL_WRITE);
 #else
     table_list.init_one_table(db_name, table_name, TL_WRITE);
 #endif
@@ -9190,7 +9252,6 @@ int ha_mroonga::storage_rename_table(const char *from, const char *to,
 int ha_mroonga::rename_table(const char *from, const char *to)
 {
   int error = 0;
-  THD *thd = ha_thd();
   char from_db_name[MRN_MAX_PATH_SIZE];
   char to_db_name[MRN_MAX_PATH_SIZE];
   char from_table_name[MRN_MAX_PATH_SIZE];
@@ -9239,25 +9300,8 @@ int ha_mroonga::rename_table(const char *from, const char *to)
 
   if (to_table_name[0] == '#')
   {
-    st_mrn_slot_data *slot_data = mrn_get_slot_data(thd, TRUE);
-    if (!slot_data)
-      DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-    st_mrn_alter_share *alter_share =
-      (st_mrn_alter_share *) malloc(sizeof(st_mrn_alter_share));
-    if (!alter_share)
-      DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-    alter_share->next = NULL;
-    strcpy(alter_share->path, to);
-    alter_share->alter_share = tmp_table_share;
-    if (slot_data->first_alter_share)
-    {
-      st_mrn_alter_share *tmp_alter_share = slot_data->first_alter_share;
-      while (tmp_alter_share->next)
-        tmp_alter_share = tmp_alter_share->next;
-      tmp_alter_share->next = alter_share;
-    } else {
-      slot_data->first_alter_share = alter_share;
-    }
+    if ((error = mrn_add_alter_share(to, tmp_table_share)))
+      DBUG_RETURN(error);
   }
 
   if (tmp_share->wrapper_mode)

  Modified: mrn_sys.c (+13 -7)
===================================================================
--- mrn_sys.c    2012-02-11 21:50:53 +0900 (b7e7a1f)
+++ mrn_sys.c    2012-02-14 04:24:11 +0900 (b66e0d2)
@@ -1,6 +1,6 @@
 /*
   Copyright(C) 2010 Tetsuro IKEDA
-  Copyright(C) 2011 Kentoku SHIBA
+  Copyright(C) 2011-2012 Kentoku SHIBA
   Copyright(C) 2011 Kouhei Sutou <kou****@clear*****>
 
   This library is free software; you can redistribute it and/or
@@ -88,9 +88,12 @@ int mrn_hash_remove(grn_ctx *ctx, grn_hash *hash, const char *key)
  */
 char *mrn_db_path_gen(const char *arg, char *dest)
 {
-  int i=2, j=0, len = strlen(arg);
-  while (arg[i] != '/' && i < len) {
-    dest[j++] = arg[i++];
+  int i=2, j=0, len;
+  if (arg[0] == '.') {
+    len = strlen(arg);
+    while (arg[i] != '/' && i < len) {
+      dest[j++] = arg[i++];
+    }
   }
   dest[j] = '\0';
   strcat(dest, MRN_DB_FILE_SUFFIX);
@@ -103,9 +106,12 @@ char *mrn_db_path_gen(const char *arg, char *dest)
  */
 char *mrn_db_name_gen(const char *arg, char *dest)
 {
-  int i=2, j=0, len = strlen(arg);
-  while (arg[i] != '/' && i < len) {
-    dest[j++] = arg[i++];
+  int i=2, j=0, len;
+  if (arg[0] == '.') {
+    len = strlen(arg);
+    while (arg[i] != '/' && i < len) {
+      dest[j++] = arg[i++];
+    }
   }
   dest[j] = '\0';
   return dest;




Groonga-mysql-commit メーリングリストの案内
Zurück zum Archiv-Index