null+****@clear*****
null+****@clear*****
2012年 1月 19日 (木) 10:38:19 JST
Kentoku 2012-01-19 10:38:19 +0900 (Thu, 19 Jan 2012) New Revision: a6985d4da03ff8445c3f406603c4a7786fec22db Log: temporary commit for reviewing. refs #1191 Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+149 -18) =================================================================== --- ha_mroonga.cc 2012-01-16 12:25:17 +0900 (bcc2802) +++ ha_mroonga.cc 2012-01-19 10:38:19 +0900 (f92b4a7) @@ -2970,12 +2970,6 @@ int ha_mroonga::wrapper_open_indexes(const char *name) if (ctx->rc) { DBUG_PRINT("info", ("mroonga: sql_command=%u", thd_sql_command(ha_thd()))); - if (thd_sql_command(ha_thd()) == SQLCOM_REPAIR) - { - DBUG_PRINT("info", ("mroonga: continue")); - grn_index_tables[i] = NULL; - continue; - } error = ER_CANT_OPEN_FILE; my_message(error, ctx->errbuf, MYF(0)); free(key_min[i]); @@ -2997,12 +2991,6 @@ int ha_mroonga::wrapper_open_indexes(const char *name) if (ctx->rc) { DBUG_PRINT("info", ("mroonga: sql_command=%u", thd_sql_command(ha_thd()))); - if (thd_sql_command(ha_thd()) == SQLCOM_REPAIR) - { - DBUG_PRINT("info", ("mroonga: continue")); - grn_index_columns[i] = NULL; - continue; - } error = ER_CANT_OPEN_FILE; my_message(error, ctx->errbuf, MYF(0)); free(key_min[i]); @@ -8074,11 +8062,6 @@ int ha_mroonga::wrapper_rename_index(const char *from, const char *to, rc = grn_table_rename(ctx, index_table, to_index_name, strlen(to_index_name)); if (rc != GRN_SUCCESS) { - if (thd_sql_command(ha_thd()) == SQLCOM_REPAIR) - { - DBUG_PRINT("info", ("mroonga: continue")); - continue; - } error = ER_CANT_OPEN_FILE; my_message(error, ctx->errbuf, MYF(0)); DBUG_RETURN(error); @@ -8407,10 +8390,158 @@ int ha_mroonga::check(THD* thd, HA_CHECK_OPT* check_opt) DBUG_RETURN(error); } +int ha_mroonga::wrapper_recreate_indexes(THD *thd) +{ + int res; + uint i, n_keys = table_share->keys; + KEY *p_key_info = &table->key_info[table_share->primary_key], *tmp_key_info, + *key_info = table->key_info; + char db_name[MRN_MAX_PATH_SIZE]; + char table_name[MRN_MAX_PATH_SIZE]; + char decode_name[MRN_MAX_PATH_SIZE]; + grn_obj *db, *grn_table; + MRN_DBUG_ENTER_METHOD(); + mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE, + (const uchar *) table_share->normalized_path.str, + (const uchar *) table_share->normalized_path.str + + table_share->normalized_path.length); + mrn_db_name_gen(decode_name, db_name); + mrn_table_name_gen(decode_name, table_name); + mrn_hash_get(&mrn_ctx, mrn_hash, db_name, &db); + bitmap_clear_all(table->read_set); + clear_indexes(); + grn_table = grn_ctx_get(ctx, table_name, strlen(table_name)); + if (grn_table != NULL) { + grn_obj_remove(ctx, grn_table); + } else { + record_id = grn_table_get(ctx, db, + table_name, + strlen(table_name)); + if (record_id != GRN_ID_NIL) { + grn_obj_delete_by_id(ctx, db, record_id, GRN_TRUE); + } + } + mrn_set_bitmap_by_key(table->read_set, p_key_info); + for (i = 0; i < n_keys; i++) { + if (!(key_info[i].flags & HA_FULLTEXT) && !mrn_is_geo_key(&key_info[i])) { + continue; + } + char index_name[MRN_MAX_PATH_SIZE]; + mrn_index_table_name_gen(table_name, table_share->key_info[i].name, + index_name); + grn_table = grn_ctx_get(ctx, index_name, strlen(index_name)); + if (grn_table != NULL) { + grn_obj_remove(ctx, grn_table); + } else { + record_id = grn_table_get(ctx, db, + index_name, + strlen(index_name)); + if (record_id != GRN_ID_NIL) { + grn_obj_delete_by_id(ctx, db, record_id, GRN_TRUE); + } + } + mrn_set_bitmap_by_key(table->read_set, &key_info[i]); + } + if ( + (res = wrapper_create_index(table_share->normalized_path.str, table, + NULL, share)) || + (res = wrapper_open_indexes(table_share->normalized_path.str)) + ) + DBUG_RETURN(res); + if ( + (mrn_lock_type != F_UNLCK || !(res = wrapper_external_lock(thd, F_WRLCK))) + ) { + if ( + !(res = wrapper_start_stmt(thd, thr_lock_data.type)) && + !(res = wrapper_rnd_init(TRUE)) + ) { + grn_obj key; + GRN_TEXT_INIT(&key, 0); + grn_bulk_space(ctx, &key, p_key_info->key_length); + while (!(res = wrapper_rnd_next(table->record[0]))) + { + key_copy((uchar *) (GRN_TEXT_VALUE(&key)), table->record[0], + p_key_info, p_key_info->key_length); + int added; + grn_id record_id; + mrn_change_encoding(ctx, NULL); + record_id = grn_table_add(ctx, grn_table, + GRN_TEXT_VALUE(&key), GRN_TEXT_LEN(&key), &added); + if (record_id == GRN_ID_NIL) + { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to add a new record into groonga: key=<%.*s>", + (int) GRN_TEXT_LEN(&key), GRN_TEXT_VALUE(&key)); + res = ER_ERROR_ON_WRITE; + my_message(res, error_message, MYF(0)); + } + grn_obj_unlink(ctx, &key); + if (res) + break; + + uint k; + for (k = 0; k < n_keys; k++) { + tmp_key_info = &key_info[k]; + if (!(tmp_key_info->flags & HA_FULLTEXT) && + !mrn_is_geo_key(tmp_key_info)) { + continue; + } + + uint l; + for (l = 0; l < tmp_key_info->key_parts; l++) { + Field *field = tmp_key_info->key_part[l].field; + + if (field->is_null()) + continue; + res = mrn_change_encoding(ctx, field->charset()); + if (res) + break; + + int new_column_size; + mrn_set_buf(ctx, field, &new_value_buffer, &new_column_size); + + grn_obj *index_column = grn_index_columns[k]; + grn_rc rc; + rc = grn_column_index_update(ctx, index_column, record_id, l + 1, + NULL, &new_value_buffer); + grn_obj_unlink(ctx, index_column); + if (rc) { + res = ER_ERROR_ON_WRITE; + my_message(res, ctx->errbuf, MYF(0)); + break; + } + } + if (res) + break; + } + if (res) + break; + } + if (res != HA_ERR_END_OF_FILE) + wrapper_rnd_end(); + else + res = wrapper_rnd_end(); + } + if (mrn_lock_type == F_UNLCK) + wrapper_external_lock(thd, F_UNLCK); + } + bitmap_set_all(table->read_set); + DBUG_RETURN(res); +} + int ha_mroonga::wrapper_repair(THD* thd, HA_CHECK_OPT* check_opt) { + int error; MRN_DBUG_ENTER_METHOD(); - DBUG_RETURN(HA_ADMIN_TRY_ALTER); + MRN_SET_WRAP_SHARE_KEY(share, table->s); + MRN_SET_WRAP_TABLE_KEY(this, table); + error = wrap_handler->ha_repair(thd, check_opt); + MRN_SET_BASE_SHARE_KEY(share, table->s); + MRN_SET_BASE_TABLE_KEY(this, table); + if (error && error != HA_ADMIN_NOT_IMPLEMENTED) + DBUG_RETURN(error); + DBUG_RETURN(wrapper_recreate_indexes(thd)); } int ha_mroonga::storage_repair(THD* thd, HA_CHECK_OPT* check_opt) Modified: ha_mroonga.h (+1 -0) =================================================================== --- ha_mroonga.h 2012-01-16 12:25:17 +0900 (fbdc0ce) +++ ha_mroonga.h 2012-01-19 10:38:19 +0900 (3ad36a1) @@ -657,6 +657,7 @@ private: int storage_enable_indexes(uint mode); int wrapper_check(THD* thd, HA_CHECK_OPT* check_opt); int storage_check(THD* thd, HA_CHECK_OPT* check_opt); + int wrapper_recreate_indexes(THD *thd); int wrapper_repair(THD* thd, HA_CHECK_OPT* check_opt); int storage_repair(THD* thd, HA_CHECK_OPT* check_opt); bool wrapper_check_and_repair(THD *thd);