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;