null+****@clear*****
null+****@clear*****
2011年 9月 22日 (木) 18:59:33 JST
Kouhei Sutou 2011-09-22 09:59:33 +0000 (Thu, 22 Sep 2011) New Revision: 30ceba93d7ec2fa23f410698113e6cca2b4828e4 Log: [storage] support multicolumn index writing. refs #455 Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+59 -2) =================================================================== --- ha_mroonga.cc 2011-09-22 03:49:04 +0000 (357ea5c) +++ ha_mroonga.cc 2011-09-22 09:59:33 +0000 (0bffb63) @@ -3038,10 +3038,15 @@ int ha_mroonga::storage_write_row(uchar *buf) DBUG_RETURN(ER_ERROR_ON_WRITE); } } + grn_obj_unlink(ctx, &colbuf); + + error = storage_write_row_index(buf, record_id); + if (error) { #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, &colbuf); + DBUG_RETURN(error); + } // for UDF last_insert_grn_id() st_mrn_slot_data *slot_data = (st_mrn_slot_data*) *thd_ha_data(thd, mrn_hton_ptr); @@ -3060,6 +3065,58 @@ int ha_mroonga::storage_write_row(uchar *buf) } slot_data->last_insert_record_id = record_id; +#ifndef DBUG_OFF + dbug_tmp_restore_column_map(table->read_set, tmp_map); +#endif + DBUG_RETURN(error); +} + +int ha_mroonga::storage_write_row_index(uchar *buf, grn_id record_id) +{ + MRN_DBUG_ENTER_METHOD(); + + int error = 0; + +#ifndef DBUG_OFF + my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, table->read_set); +#endif + + grn_obj key; + GRN_TEXT_INIT(&key, 0); + + uint i; + uint n_keys = table->s->keys; + for (i = 0; i < n_keys; i++) { + KEY key_info = table->key_info[i]; + + if (key_info.key_parts == 1) { + continue; + } + + grn_obj *index_column = grn_index_columns[i]; + + GRN_BULK_REWIND(&key); + grn_bulk_space(ctx, &key, key_info.key_length); + key_copy((uchar *)(GRN_TEXT_VALUE(&key)), + buf, + &key_info, + key_info.key_length); + + grn_rc rc; + rc = grn_column_index_update(ctx, index_column, record_id, 0, NULL, &key); + 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); +#endif + grn_obj_unlink(ctx, &key); + DBUG_RETURN(error); } Modified: ha_mroonga.h (+1 -0) =================================================================== --- ha_mroonga.h 2011-09-22 03:49:04 +0000 (add9e71) +++ ha_mroonga.h 2011-09-22 09:59:33 +0000 (eb3cb5d) @@ -384,6 +384,7 @@ private: int wrapper_write_row(uchar *buf); int wrapper_write_row_index(uchar *buf); int storage_write_row(uchar *buf); + int storage_write_row_index(uchar *buf, grn_id record_id); int wrapper_get_record_id(uchar *data, grn_id *record_id, const char *context); int wrapper_update_row(const uchar *old_data, uchar *new_data); int wrapper_update_row_index(const uchar *old_data, uchar *new_data);