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