null+****@clear*****
null+****@clear*****
2011年 6月 20日 (月) 16:54:42 JST
Kouhei Sutou 2011-06-20 07:54:42 +0000 (Mon, 20 Jun 2011) New Revision: cf3cfb56d1cd3cf6cdce591bd60b6f8eb278e9b1 Log: [wrapper][update] extrace groonga related method. Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+71 -45) =================================================================== --- ha_mroonga.cc 2011-06-20 07:27:38 +0000 (d4498bd) +++ ha_mroonga.cc 2011-06-20 07:54:42 +0000 (57b86c7) @@ -2615,7 +2615,7 @@ int ha_mroonga::wrapper_write_row_index(uchar *buf) 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 row into groonga: key=<%.*s>", + "failed to add a new record into groonga: key=<%.*s>", GRN_TEXT_LEN(&key), GRN_TEXT_VALUE(&key)); error = ER_ERROR_ON_WRITE; my_message(error, error_message, MYF(0)); @@ -2830,67 +2830,93 @@ int ha_mroonga::wrapper_update_row(const uchar *old_data, uchar *new_data) MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); - if (!error) { - my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(old_data, table->record[0]); + if (!error && wrapper_have_fulltext_index()) { + error = wrapper_update_row_index(old_data, new_data); + } - grn_obj key; - GRN_TEXT_INIT(&key, 0); + DBUG_RETURN(error); +} - grn_bulk_space(ctx, &key, table->key_info->key_length); - key_copy((uchar *)(GRN_TEXT_VALUE(&key)), - (uchar *)old_data, - &(table->key_info[table_share->primary_key]), - table->key_info[table_share->primary_key].key_length); +int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data) +{ + MRN_DBUG_ENTER_METHOD(); - grn_id record_id; - record_id = grn_table_get(ctx, grn_table, - GRN_TEXT_VALUE(&key), GRN_TEXT_LEN(&key)); - // TODO: check record_id == GRN_ID_NIL - grn_obj_unlink(ctx, &key); + int error = 0; - grn_obj old_value, new_value; - GRN_TEXT_INIT(&old_value, 0); - GRN_TEXT_INIT(&new_value, 0); + grn_obj key; + GRN_TEXT_INIT(&key, 0); + + grn_bulk_space(ctx, &key, table->key_info->key_length); + key_copy((uchar *)(GRN_TEXT_VALUE(&key)), + (uchar *)old_data, + &(table->key_info[table_share->primary_key]), + table->key_info[table_share->primary_key].key_length); + + grn_id record_id; + record_id = grn_table_get(ctx, grn_table, + GRN_TEXT_VALUE(&key), GRN_TEXT_LEN(&key)); + if (record_id == GRN_ID_NIL) { + char error_message[MRN_MESSAGE_BUFFER_SIZE]; + snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, + "failed to get record ID for updating from groonga: key=<%.*s>", + GRN_TEXT_LEN(&key), GRN_TEXT_VALUE(&key)); + error = ER_ERROR_ON_WRITE; + my_message(error, error_message, MYF(0)); + } + grn_obj_unlink(ctx, &key); + if (error) { + DBUG_RETURN(error); + } + + grn_obj old_value, new_value; + GRN_TEXT_INIT(&old_value, 0); + GRN_TEXT_INIT(&new_value, 0); + + my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(old_data, table->record[0]); #ifndef DBUG_OFF - my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, table->read_set); + my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, table->read_set); #endif - uint i; - uint n_keys = table->s->keys; - for (i = 0; i < n_keys; i++) { - grn_rc rc; - KEY key_info = table->key_info[i]; + uint i; + uint n_keys = table->s->keys; + for (i = 0; i < n_keys; i++) { + grn_rc rc; + KEY key_info = table->key_info[i]; - if (key_info.algorithm != HA_KEY_ALG_FULLTEXT) { - continue; - } + if (key_info.algorithm != HA_KEY_ALG_FULLTEXT) { + continue; + } - grn_obj *index_column = grn_index_columns[i]; + grn_obj *index_column = grn_index_columns[i]; - uint j; - for (j = 0; j < key_info.key_parts; j++) { - Field *field = key_info.key_part[j].field; - const char *column_name = field->field_name; + uint j; + for (j = 0; j < key_info.key_parts; j++) { + Field *field = key_info.key_part[j].field; + const char *column_name = field->field_name; - int new_column_size; - mrn_set_buf(ctx, field, &new_value, &new_column_size); + int new_column_size; + mrn_set_buf(ctx, field, &new_value, &new_column_size); - field->move_field_offset(ptr_diff); - int old_column_size; - mrn_set_buf(ctx, field, &old_value, &old_column_size); - field->move_field_offset(-ptr_diff); + field->move_field_offset(ptr_diff); + int old_column_size; + mrn_set_buf(ctx, field, &old_value, &old_column_size); + field->move_field_offset(-ptr_diff); - rc = grn_column_index_update(ctx, index_column, record_id, 1, - &old_value, &new_value); - // TODO: check rc; + rc = grn_column_index_update(ctx, index_column, record_id, 1, + &old_value, &new_value); + if (rc) { + error = ER_ERROR_ON_WRITE; + my_message(error, ctx->errbuf, MYF(0)); + goto err; } } + } +err: #ifndef DBUG_OFF - dbug_tmp_restore_column_map(table->read_set, tmp_map); + dbug_tmp_restore_column_map(table->read_set, tmp_map); #endif - grn_obj_unlink(ctx, &old_value); - grn_obj_unlink(ctx, &new_value); - } + grn_obj_unlink(ctx, &old_value); + grn_obj_unlink(ctx, &new_value); DBUG_RETURN(error); } Modified: ha_mroonga.h (+1 -0) =================================================================== --- ha_mroonga.h 2011-06-20 07:27:38 +0000 (3eea1e1) +++ ha_mroonga.h 2011-06-20 07:54:42 +0000 (173abbe) @@ -267,6 +267,7 @@ private: int wrapper_write_row_index(uchar *buf); int default_write_row(uchar *buf); int wrapper_update_row(const uchar *old_data, uchar *new_data); + int wrapper_update_row_index(const uchar *old_data, uchar *new_data); int default_update_row(const uchar *old_data, uchar *new_data); int wrapper_delete_row(const uchar *buf); int default_delete_row(const uchar *buf);