null+****@clear*****
null+****@clear*****
2011年 6月 14日 (火) 17:03:44 JST
Kouhei Sutou 2011-06-14 08:03:44 +0000 (Tue, 14 Jun 2011) New Revision: 3263344528d39a9757a2dfcf31607deb9024a32e Log: [default] split indexes open code. Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+91 -45) =================================================================== --- ha_mroonga.cc 2011-06-14 07:31:52 +0000 (6a06788) +++ ha_mroonga.cc 2011-06-14 08:03:44 +0000 (31f2455) @@ -1589,56 +1589,18 @@ int ha_mroonga::default_open(const char *name, int mode, uint test_if_locked) error = default_open_columns(); if (error) { grn_obj_unlink(ctx, grn_table); + grn_table = NULL; DBUG_RETURN(error); } - /* open indexes */ - char idx_name[MRN_MAX_PATH_SIZE]; - uint n_keys = table->s->keys; - uint pkey_nr = table->s->primary_key; - if (n_keys > 0) { - grn_index_tables = (grn_obj**) malloc(sizeof(grn_obj*) * n_keys); - grn_index_columns = (grn_obj**) malloc(sizeof(grn_obj*) * n_keys); - key_min = (char**) malloc(sizeof(char*) * n_keys); - key_max = (char**) malloc(sizeof(char*) * n_keys); - } else { - grn_index_tables = grn_index_columns = NULL; - key_min = key_max = NULL; + error = default_open_indexes(name); + if (error) { + // TODO: free grn_columns and set NULL; + grn_obj_unlink(ctx, grn_table); + grn_table = NULL; + DBUG_RETURN(error); } - char table_name[MRN_MAX_PATH_SIZE]; - mrn_table_name_gen(name, table_name); - int i; - for (i = 0; i < n_keys; i++) { - key_min[i] = (char*) malloc(MRN_MAX_KEY_SIZE); - key_max[i] = (char*) malloc(MRN_MAX_KEY_SIZE); - - if (i == pkey_nr) { - grn_index_tables[i] = grn_index_columns[i] = NULL; - continue; - } - - mrn_index_name_gen(table_name, i, idx_name); - grn_index_tables[i] = grn_ctx_get(ctx, idx_name, strlen(idx_name)); - if (ctx->rc) { - grn_obj_unlink(ctx, grn_table); - my_message(ER_CANT_OPEN_FILE, ctx->errbuf, MYF(0)); - DBUG_RETURN(ER_CANT_OPEN_FILE); - } - - KEY key_info = table->s->key_info[i]; - Field *field = key_info.key_part[0].field; - const char *col_name = field->field_name; - int col_name_size = strlen(col_name); - grn_index_columns[i] = grn_obj_column(ctx, grn_index_tables[i], - col_name, col_name_size); - if (ctx->rc) { - grn_obj_unlink(ctx, grn_index_tables[i]); - grn_obj_unlink(ctx, grn_table); - my_message(ER_CANT_OPEN_FILE, ctx->errbuf, MYF(0)); - DBUG_RETURN(ER_CANT_OPEN_FILE); - } - } ref_length = sizeof(my_off_t); DBUG_RETURN(0); } @@ -1684,6 +1646,7 @@ int ha_mroonga::default_open_columns(void) grn_columns[i] = grn_obj_column(ctx, grn_table, column_name, column_name_size); if (ctx->rc) { + // TODO: free grn_columns and set NULL; int error = ER_CANT_OPEN_FILE; my_message(error, ctx->errbuf, MYF(0)); DBUG_RETURN(error); @@ -1693,6 +1656,89 @@ int ha_mroonga::default_open_columns(void) DBUG_RETURN(0); } +int ha_mroonga::default_open_indexes(const char *name) +{ + int error = 0; + + MRN_DBUG_ENTER_METHOD(); + + char index_name[MRN_MAX_PATH_SIZE]; + uint n_keys = table->s->keys; + uint pkey_nr = table->s->primary_key; + if (n_keys > 0) { + grn_index_tables = (grn_obj **)malloc(sizeof(grn_obj *) * n_keys); + grn_index_columns = (grn_obj **)malloc(sizeof(grn_obj *) * n_keys); + key_min = (char **)malloc(sizeof(char *) * n_keys); + key_max = (char **)malloc(sizeof(char *) * n_keys); + } else { + grn_index_tables = grn_index_columns = NULL; + key_min = key_max = NULL; + } + + char table_name[MRN_MAX_PATH_SIZE]; + mrn_table_name_gen(name, table_name); + int i = 0; + for (i = 0; i < n_keys; i++) { + key_min[i] = (char *)malloc(MRN_MAX_KEY_SIZE); + key_max[i] = (char *)malloc(MRN_MAX_KEY_SIZE); + + if (i == pkey_nr) { + grn_index_tables[i] = grn_index_columns[i] = NULL; + continue; + } + + mrn_index_name_gen(table_name, i, index_name); + grn_index_tables[i] = grn_ctx_get(ctx, index_name, strlen(index_name)); + if (ctx->rc) { + error = ER_CANT_OPEN_FILE; + my_message(error, ctx->errbuf, MYF(0)); + goto error; + } + + KEY key_info = table->s->key_info[i]; + Field *field = key_info.key_part[0].field; + const char *column_name = field->field_name; + int column_name_size = strlen(column_name); + grn_index_columns[i] = grn_obj_column(ctx, grn_index_tables[i], + column_name, column_name_size); + if (ctx->rc) { + error = ER_CANT_OPEN_FILE; + my_message(error, ctx->errbuf, MYF(0)); + goto error; + } + } + +error: + if (error) { + for (; i >= 0; i--) { + if (key_min[i]) { + free(key_min[i]); + } + if (key_max[i]) { + free(key_max[i]); + } + grn_obj *index_column = grn_index_columns[i]; + if (index_column) { + grn_obj_unlink(ctx, index_column); + } + grn_obj *index_table = grn_index_tables[i]; + if (index_table) { + grn_obj_unlink(ctx, index_table); + } + } + free(key_min); + free(key_max); + free(grn_index_columns); + free(grn_index_tables); + key_min = NULL; + key_max = NULL; + grn_index_columns = NULL; + grn_index_tables = NULL; + } + + DBUG_RETURN(error); +} + int ha_mroonga::open(const char *name, int mode, uint test_if_locked) { int error; Modified: ha_mroonga.h (+1 -0) =================================================================== --- ha_mroonga.h 2011-06-14 07:31:52 +0000 (18f74c1) +++ ha_mroonga.h 2011-06-14 08:03:44 +0000 (423e638) @@ -229,6 +229,7 @@ private: int default_open(const char *name, int mode, uint test_if_locked); int open_table(const char *name); int default_open_columns(void); + int default_open_indexes(const char *name); int wrapper_close(); int default_close(); int mrn_extra(enum ha_extra_function operation);