null+****@clear*****
null+****@clear*****
2010年 10月 13日 (水) 04:02:56 JST
Kentoku SHIBA 2010-10-12 19:02:56 +0000 (Tue, 12 Oct 2010) New Revision: 0f2a10f9eeb59b76f6058b6599c5b0eeae8a78aa Log: #525 use more read_set and write_set Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+60 -47) =================================================================== --- ha_mroonga.cc 2010-10-08 03:23:01 +0000 (30f98ee) +++ ha_mroonga.cc 2010-10-12 19:02:56 +0000 (be32253) @@ -1049,13 +1049,8 @@ int ha_mroonga::rnd_next(uchar *buf) grn_table_cursor_close(ctx, cur); DBUG_RETURN(HA_ERR_END_OF_FILE); } - int i; - int n_columns = table->s->fields; - for (i = 0; i < n_columns; i++) { - Field *field = table->field[i]; - bitmap_set_bit(table->write_set, field->field_index); - mrn_store_field(ctx, field, col[i], row_id); - } + store_fields_from_primary_table(row_id); + table->status = 0; DBUG_RETURN(0); } @@ -1063,13 +1058,7 @@ int ha_mroonga::rnd_pos(uchar *buf, uchar *pos) { DBUG_ENTER("ha_mroonga::rnd_pos"); row_id = *((grn_id*) pos); - int i; - int n_columns = table->s->fields; - for (i = 0; i < n_columns; i++) { - Field *field = table->field[i]; - bitmap_set_bit(table->write_set, field->field_index); - mrn_store_field(ctx, field, col[i], row_id); - } + store_fields_from_primary_table(row_id); DBUG_RETURN(0); } @@ -1088,12 +1077,14 @@ int ha_mroonga::write_row(uchar *buf) int pkey_size = 0; uint pkeynr = table->s->primary_key; GRN_VOID_INIT(&wrapper); +#ifndef DBUG_OFF + my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, table->read_set); +#endif if (pkeynr != MAX_INDEXES) { KEY key_info = table->s->key_info[pkeynr]; // surpose simgle column key int field_no = key_info.key_part[0].field->field_index; Field *pkey_field = table->field[field_no]; - bitmap_set_bit(table->read_set, pkey_field->field_index); mrn_set_buf(ctx, pkey_field, &wrapper, &pkey_size); pkey = GRN_TEXT_VALUE(&wrapper); } @@ -1103,6 +1094,9 @@ int ha_mroonga::write_row(uchar *buf) grn_obj_unlink(ctx, &wrapper); if (added == 0) { // duplicated error +#ifndef DBUG_OFF + dbug_tmp_restore_column_map(table->read_set, tmp_map); +#endif DBUG_RETURN(-1); } @@ -1112,14 +1106,19 @@ int ha_mroonga::write_row(uchar *buf) GRN_VOID_INIT(&colbuf); for (i = 0; i < n_columns; i++) { Field *field = table->field[i]; - bitmap_set_bit(table->read_set, field->field_index); mrn_set_buf(ctx, field, &colbuf, &col_size); if (grn_obj_set_value(ctx, col[i], row_id, &colbuf, GRN_OBJ_SET) != GRN_SUCCESS) { +#ifndef DBUG_OFF + dbug_tmp_restore_column_map(table->read_set, tmp_map); +#endif grn_obj_unlink(ctx, &colbuf); DBUG_RETURN(-1); } } +#ifndef DBUG_OFF + dbug_tmp_restore_column_map(table->read_set, tmp_map); +#endif grn_obj_unlink(ctx, &colbuf); DBUG_RETURN(0); } @@ -1133,12 +1132,23 @@ int ha_mroonga::update_row(const uchar *old_data, uchar *new_data) GRN_VOID_INIT(&colbuf); for (i = 0; i < n_columns; i++) { Field *field = table->field[i]; - bitmap_set_bit(table->read_set, field->field_index); - mrn_set_buf(ctx, field, &colbuf, &col_size); - if (grn_obj_set_value(ctx, col[i], row_id, &colbuf, GRN_OBJ_SET) - != GRN_SUCCESS) { - grn_obj_unlink(ctx, &colbuf); - DBUG_RETURN(-1); + if (bitmap_is_set(table->write_set, field->field_index)) { +#ifndef DBUG_OFF + my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, + table->read_set); +#endif + mrn_set_buf(ctx, field, &colbuf, &col_size); + if (grn_obj_set_value(ctx, col[i], row_id, &colbuf, GRN_OBJ_SET) + != GRN_SUCCESS) { +#ifndef DBUG_OFF + dbug_tmp_restore_column_map(table->read_set, tmp_map); +#endif + grn_obj_unlink(ctx, &colbuf); + DBUG_RETURN(-1); + } +#ifndef DBUG_OFF + dbug_tmp_restore_column_map(table->read_set, tmp_map); +#endif } } grn_obj_unlink(ctx, &colbuf); @@ -1213,16 +1223,9 @@ int ha_mroonga::index_read(uchar * record_buffer, const uchar * key, uint key_le KEY_PART_INFO key_part = key_info.key_part[0]; if (keynr == pkeynr) { row_id = grn_table_get(ctx, tbl, key, key_len); - int i; - int n_columns = table->s->fields; - for (i = 0; i < n_columns; i++) { - Field *field = table->field[i]; - if (bitmap_is_set(table->read_set, field->field_index)) { - bitmap_set_bit(table->write_set, field->field_index); - mrn_store_field(ctx, field, col[i], row_id); - } - } + store_fields_from_primary_table(row_id); } + table->status = 0; DBUG_RETURN(0); } @@ -1247,13 +1250,8 @@ int ha_mroonga::index_next(uchar *buf) grn_table_cursor_close(ctx, cur); DBUG_RETURN(HA_ERR_END_OF_FILE); } - int i; - int n_columns = table->s->fields; - for (i = 0; i < n_columns; i++) { - Field *field = table->field[i]; - bitmap_set_bit(table->write_set, field->field_index); - mrn_store_field(ctx, field, col[i], row_id); - } + store_fields_from_primary_table(row_id); + table->status = 0; DBUG_RETURN(0); } @@ -1325,15 +1323,8 @@ int ha_mroonga::ft_read(uchar *buf) grn_table_get_key(ctx, res, rid, &row_id, sizeof(grn_id)); - int i; - int n_columns = table->s->fields; - for (i = 0; i < n_columns; i++) { - Field *field = table->field[i]; - if (bitmap_is_set(table->read_set, field->field_index)) { - bitmap_set_bit(table->write_set, field->field_index); - mrn_store_field(ctx, field, col[i], row_id); - } - } + store_fields_from_primary_table(row_id); + table->status = 0; DBUG_RETURN(0); } @@ -1357,6 +1348,28 @@ bool ha_mroonga::get_error_message(int error, String *buf) DBUG_RETURN(FALSE); } +void ha_mroonga::store_fields_from_primary_table(grn_id rid) +{ + DBUG_ENTER("ha_mroonga::records_in_range"); + int i; + int n_columns = table->s->fields; + for (i = 0; i < n_columns; i++) { + Field *field = table->field[i]; + if (bitmap_is_set(table->read_set, field->field_index) || + bitmap_is_set(table->write_set, field->field_index)) { +#ifndef DBUG_OFF + my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, + table->write_set); +#endif + mrn_store_field(ctx, field, col[i], rid); +#ifndef DBUG_OFF + dbug_tmp_restore_column_map(table->write_set, tmp_map); +#endif + } + } + DBUG_VOID_RETURN; +} + #ifdef __cplusplus } #endif Modified: ha_mroonga.h (+3 -0) =================================================================== --- ha_mroonga.h 2010-10-08 03:23:01 +0000 (d0586f6) +++ ha_mroonga.h 2010-10-12 19:02:56 +0000 (b0895d9) @@ -114,6 +114,9 @@ public: void cond_pop(); bool get_error_message(int error, String *buf); + +private: + void store_fields_from_primary_table(grn_id rid); }; #ifdef __cplusplus