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 */