null+****@clear*****
null+****@clear*****
2011年 9月 23日 (金) 22:28:32 JST
Kouhei Sutou 2011-09-23 13:28:32 +0000 (Fri, 23 Sep 2011)
New Revision: 9a2971dec8d046de9795c278fbdc5f530a44c34c
Log:
[storage] splict index creation.
Modified files:
ha_mroonga.cc
ha_mroonga.h
Modified: ha_mroonga.cc (+109 -90)
===================================================================
--- ha_mroonga.cc 2011-09-23 13:05:30 +0000 (6a37f01)
+++ ha_mroonga.cc 2011-09-23 13:28:32 +0000 (41d20ff)
@@ -1625,99 +1625,17 @@ int ha_mroonga::storage_create(const char *name, TABLE *table,
}
}
- /* create indexes */
- char index_name[MRN_MAX_PATH_SIZE];
-
- uint n_keys = table->s->keys;
- for (i = 0; i < n_keys; i++) {
- if (i == pkey_nr) {
- continue; // pkey is already handled
- }
-
- grn_obj *idx_tbl_obj, *idx_col_obj;
- grn_obj *column = NULL;
- grn_obj *index_type = NULL;
- KEY key_info = table->s->key_info[i];
-
- int key_parts = key_info.key_parts;
- grn_obj_flags index_table_flags = GRN_OBJ_PERSISTENT;
- if (key_parts == 1) {
- Field *field = key_info.key_part[0].field;
- const char *column_name = field->field_name;
- int column_name_size = strlen(column_name);
-
- if (strncmp(MRN_COLUMN_NAME_ID, column_name, column_name_size) == 0) {
- // skipping _id virtual column
- continue;
- }
-
- column = grn_obj_column(ctx, tbl_obj, column_name, column_name_size);
- int mysql_field_type = field->type();
- grn_builtin_type groonga_type = mrn_get_type(ctx, mysql_field_type);
- index_type = grn_ctx_at(ctx, groonga_type);
- index_table_flags |= GRN_OBJ_KEY_NORMALIZE;
- } else {
- index_type = grn_ctx_at(ctx, GRN_DB_SHORT_TEXT);
- }
-
- mrn_index_table_name_gen(tbl_name, key_info.name, index_name);
-
- grn_obj_flags idx_col_flags =
- GRN_OBJ_COLUMN_INDEX | GRN_OBJ_WITH_POSITION | GRN_OBJ_PERSISTENT;
-
- int key_alg = key_info.algorithm;
- if (key_alg == HA_KEY_ALG_FULLTEXT) {
- index_table_flags |= GRN_OBJ_TABLE_PAT_KEY;
- } else if (key_alg == HA_KEY_ALG_HASH) {
- index_table_flags |= GRN_OBJ_TABLE_HASH_KEY;
- } else {
- index_table_flags |= GRN_OBJ_TABLE_PAT_KEY;
- }
-
- idx_tbl_obj = grn_table_create(ctx, index_name, strlen(index_name), NULL,
- index_table_flags, index_type, 0);
- if (ctx->rc) {
- grn_obj_remove(ctx, tbl_obj);
- error = ER_CANT_CREATE_TABLE;
- my_message(ER_CANT_CREATE_TABLE, ctx->errbuf, MYF(0));
- DBUG_RETURN(error);
- }
-
- if (key_alg == HA_KEY_ALG_FULLTEXT) {
- grn_info_type info_type = GRN_INFO_DEFAULT_TOKENIZER;
- grn_obj *token_type = grn_ctx_at(ctx, GRN_DB_BIGRAM);
- grn_obj_set_info(ctx, idx_tbl_obj, info_type, token_type);
- }
-
- idx_col_obj = grn_column_create(ctx,
- idx_tbl_obj,
- index_column_name,
- strlen(index_column_name),
- NULL,
- idx_col_flags,
- tbl_obj);
-
- if (ctx->rc) {
- grn_obj_remove(ctx, idx_tbl_obj);
- grn_obj_remove(ctx, tbl_obj);
- error = ER_CANT_CREATE_TABLE;
- my_message(error, ctx->errbuf, MYF(0));
- DBUG_RETURN(error);
- }
+ error = storage_create_index(table, tbl_name, tbl_obj);
+ if (error) {
+ grn_obj_remove(ctx, tbl_obj);
+ tbl_obj = NULL;
+ }
- if (column) {
- grn_obj source_ids;
- grn_id source_id = grn_obj_id(ctx, column);
- GRN_UINT32_INIT(&source_ids, GRN_OBJ_VECTOR);
- GRN_UINT32_PUT(ctx, &source_ids, source_id);
- grn_obj_set_info(ctx, idx_col_obj, GRN_INFO_SOURCE, &source_ids);
- grn_obj_unlink(ctx, &source_ids);
- }
+ if (tbl_obj) {
+ grn_obj_unlink(ctx, tbl_obj);
}
- /* clean up */
- grn_obj_unlink(ctx, tbl_obj);
- DBUG_RETURN(0);
+ DBUG_RETURN(error);
}
int ha_mroonga::storage_create_validate_pseudo_column(TABLE *table)
@@ -1800,6 +1718,107 @@ int ha_mroonga::storage_create_validate_index(TABLE *table)
DBUG_RETURN(error);
}
+int ha_mroonga::storage_create_index(TABLE *table, const char *grn_table_name,
+ grn_obj *grn_table)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+
+ char index_table_name[MRN_MAX_KEY_SIZE];
+
+ uint n_keys = table->s->keys;
+ for (int i = 0; i < n_keys; i++) {
+ if (i == table->s->primary_key) {
+ continue; // pkey is already handled
+ }
+
+ grn_obj *index_table, *index_column;
+ grn_obj *column = NULL;
+ grn_obj *index_type = NULL;
+ KEY key_info = table->s->key_info[i];
+
+ mrn_index_table_name_gen(grn_table_name, key_info.name, index_table_name);
+
+ int key_parts = key_info.key_parts;
+ grn_obj_flags index_table_flags = GRN_OBJ_PERSISTENT;
+ if (key_parts == 1) {
+ Field *field = key_info.key_part[0].field;
+ const char *column_name = field->field_name;
+ int column_name_size = strlen(column_name);
+
+ if (strncmp(MRN_COLUMN_NAME_ID, column_name, column_name_size) == 0) {
+ // skipping _id virtual column
+ continue;
+ }
+
+ column = grn_obj_column(ctx, grn_table, column_name, column_name_size);
+ int mysql_field_type = field->type();
+ grn_builtin_type groonga_type = mrn_get_type(ctx, mysql_field_type);
+ index_type = grn_ctx_at(ctx, groonga_type);
+ index_table_flags |= GRN_OBJ_KEY_NORMALIZE;
+ } else {
+ index_type = grn_ctx_at(ctx, GRN_DB_SHORT_TEXT);
+ }
+
+ int key_alg = key_info.algorithm;
+ if (key_alg == HA_KEY_ALG_FULLTEXT) {
+ index_table_flags |= GRN_OBJ_TABLE_PAT_KEY;
+ } else if (key_alg == HA_KEY_ALG_HASH) {
+ index_table_flags |= GRN_OBJ_TABLE_HASH_KEY;
+ } else {
+ index_table_flags |= GRN_OBJ_TABLE_PAT_KEY;
+ }
+
+ index_table = grn_table_create(ctx,
+ index_table_name,
+ strlen(index_table_name),
+ NULL,
+ index_table_flags,
+ index_type,
+ 0);
+ if (ctx->rc) {
+ grn_obj_remove(ctx, grn_table);
+ error = ER_CANT_CREATE_TABLE;
+ my_message(ER_CANT_CREATE_TABLE, ctx->errbuf, MYF(0));
+ DBUG_RETURN(error);
+ }
+
+ if (key_alg == HA_KEY_ALG_FULLTEXT) {
+ grn_info_type info_type = GRN_INFO_DEFAULT_TOKENIZER;
+ grn_obj *token_type = grn_ctx_at(ctx, GRN_DB_BIGRAM);
+ grn_obj_set_info(ctx, index_table, info_type, token_type);
+ }
+
+ grn_obj_flags index_column_flags =
+ GRN_OBJ_COLUMN_INDEX | GRN_OBJ_WITH_POSITION | GRN_OBJ_PERSISTENT;
+ index_column = grn_column_create(ctx,
+ index_table,
+ index_column_name,
+ strlen(index_column_name),
+ NULL,
+ index_column_flags,
+ grn_table);
+
+ if (ctx->rc) {
+ grn_obj_remove(ctx, index_table);
+ error = ER_CANT_CREATE_TABLE;
+ my_message(error, ctx->errbuf, MYF(0));
+ DBUG_RETURN(error);
+ }
+
+ if (column) {
+ grn_obj source_ids;
+ grn_id source_id = grn_obj_id(ctx, column);
+ GRN_UINT32_INIT(&source_ids, GRN_OBJ_VECTOR);
+ GRN_UINT32_PUT(ctx, &source_ids, source_id);
+ grn_obj_set_info(ctx, index_column, GRN_INFO_SOURCE, &source_ids);
+ grn_obj_unlink(ctx, &source_ids);
+ }
+ }
+
+ DBUG_RETURN(error);
+}
+
int ha_mroonga::ensure_database_create(const char *name)
{
int error = 0;
Modified: ha_mroonga.h (+2 -0)
===================================================================
--- ha_mroonga.h 2011-09-23 13:05:30 +0000 (18210d9)
+++ ha_mroonga.h 2011-09-23 13:28:32 +0000 (ba8dcff)
@@ -345,6 +345,8 @@ private:
HA_CREATE_INFO *info, MRN_SHARE *tmp_share);
int storage_create_validate_pseudo_column(TABLE *table);
int storage_create_validate_index(TABLE *table);
+ int storage_create_index(TABLE *table, const char *grn_table_name,
+ grn_obj *grn_table);
int ensure_database_create(const char *name);
int ensure_database_open(const char *name);
int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share,