null+****@clear*****
null+****@clear*****
2011年 10月 27日 (木) 17:44:52 JST
Kouhei Sutou 2011-10-27 08:44:52 +0000 (Thu, 27 Oct 2011)
New Revision: b6881cd13b1f513952e89ed99f193a0b92b66101
Log:
reuse common buffer for key.
Modified files:
ha_mroonga.cc
ha_mroonga.h
Modified: ha_mroonga.cc (+21 -37)
===================================================================
--- ha_mroonga.cc 2011-10-27 06:25:11 +0000 (4580568)
+++ ha_mroonga.cc 2011-10-27 08:44:52 +0000 (5a2daae)
@@ -1295,6 +1295,7 @@ ha_mroonga::ha_mroonga(handlerton *hton, TABLE_SHARE *share)
matched_record_keys = NULL;
fulltext_searching = FALSE;
GRN_TEXT_INIT(&key_buffer, 0);
+ GRN_TEXT_INIT(&encoded_key_buffer, 0);
GRN_VOID_INIT(&old_value_buffer);
GRN_VOID_INIT(&new_value_buffer);
DBUG_VOID_RETURN;
@@ -1306,6 +1307,7 @@ ha_mroonga::~ha_mroonga()
grn_obj_unlink(ctx, &top_left_point);
grn_obj_unlink(ctx, &bottom_right_point);
grn_obj_unlink(ctx, &key_buffer);
+ grn_obj_unlink(ctx, &encoded_key_buffer);
grn_obj_unlink(ctx, &old_value_buffer);
grn_obj_unlink(ctx, &new_value_buffer);
grn_ctx_fin(ctx);
@@ -3286,11 +3288,9 @@ int ha_mroonga::wrapper_write_row_index(uchar *buf)
DBUG_RETURN(error);
}
- 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)),
+ GRN_BULK_REWIND(&key_buffer);
+ grn_bulk_space(ctx, &key_buffer, table->key_info->key_length);
+ key_copy((uchar *)(GRN_TEXT_VALUE(&key_buffer)),
buf,
&(table->key_info[table_share->primary_key]),
table->key_info[table_share->primary_key].key_length);
@@ -3298,17 +3298,18 @@ int ha_mroonga::wrapper_write_row_index(uchar *buf)
int added;
grn_id record_id;
record_id = grn_table_add(ctx, grn_table,
- GRN_TEXT_VALUE(&key), GRN_TEXT_LEN(&key),
+ GRN_TEXT_VALUE(&key_buffer),
+ GRN_TEXT_LEN(&key_buffer),
&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));
+ (int)GRN_TEXT_LEN(&key_buffer),
+ GRN_TEXT_VALUE(&key_buffer));
error = ER_ERROR_ON_WRITE;
my_message(error, error_message, MYF(0));
}
- grn_obj_unlink(ctx, &key);
if (error) {
DBUG_RETURN(error);
}
@@ -3521,30 +3522,29 @@ int ha_mroonga::storage_write_row(uchar *buf)
}
int ha_mroonga::storage_write_row_index(uchar *buf, grn_id record_id,
- KEY *key_info, grn_obj *index_column,
- grn_obj *key, grn_obj *encoded_key)
+ KEY *key_info, grn_obj *index_column)
{
MRN_DBUG_ENTER_METHOD();
int error = 0;
- GRN_BULK_REWIND(key);
- grn_bulk_space(ctx, key, key_info->key_length);
- key_copy((uchar *)(GRN_TEXT_VALUE(key)),
+ GRN_BULK_REWIND(&key_buffer);
+ grn_bulk_space(ctx, &key_buffer, key_info->key_length);
+ key_copy((uchar *)(GRN_TEXT_VALUE(&key_buffer)),
buf,
key_info,
key_info->key_length);
- GRN_BULK_REWIND(encoded_key);
- grn_bulk_space(ctx, encoded_key, key_info->key_length);
+ GRN_BULK_REWIND(&encoded_key_buffer);
+ grn_bulk_space(ctx, &encoded_key_buffer, key_info->key_length);
uint encoded_key_length;
mrn_multiple_column_key_encode(key_info,
- (uchar *)(GRN_TEXT_VALUE(key)),
+ (uchar *)(GRN_TEXT_VALUE(&key_buffer)),
key_info->key_length,
- (uchar *)(GRN_TEXT_VALUE(encoded_key)),
+ (uchar *)(GRN_TEXT_VALUE(&encoded_key_buffer)),
&encoded_key_length);
grn_rc rc;
rc = grn_column_index_update(ctx, index_column, record_id, 1, NULL,
- encoded_key);
+ &encoded_key_buffer);
if (rc) {
error = ER_ERROR_ON_WRITE;
my_message(error, ctx->errbuf, MYF(0));
@@ -3562,10 +3562,6 @@ int ha_mroonga::storage_write_row_indexes(uchar *buf, grn_id record_id)
my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table, table->read_set);
#endif
- grn_obj key, encoded_key;
- GRN_TEXT_INIT(&key, 0);
- GRN_TEXT_INIT(&encoded_key, 0);
-
uint i;
uint n_keys = table->s->keys;
for (i = 0; i < n_keys; i++) {
@@ -3582,8 +3578,7 @@ int ha_mroonga::storage_write_row_indexes(uchar *buf, grn_id record_id)
grn_obj *index_column = grn_index_columns[i];
if ((error = storage_write_row_index(buf, record_id, &key_info,
- grn_index_columns[i], &key,
- &encoded_key)))
+ grn_index_columns[i])))
{
goto err;
}
@@ -3593,8 +3588,6 @@ err:
#ifndef DBUG_OFF
dbug_tmp_restore_column_map(table->read_set, tmp_map);
#endif
- grn_obj_unlink(ctx, &encoded_key);
- grn_obj_unlink(ctx, &key);
DBUG_RETURN(error);
}
@@ -7396,10 +7389,6 @@ int ha_mroonga::storage_add_index_multiple_columns(KEY *key_info,
if (!(error = storage_rnd_init(TRUE)))
{
- grn_obj key, encoded_key;
- GRN_TEXT_INIT(&key, 0);
- GRN_TEXT_INIT(&encoded_key, 0);
-
while (!(error = storage_rnd_next(table->record[0])))
{
for (uint i = 0; i < num_of_keys; i++) {
@@ -7424,9 +7413,7 @@ int ha_mroonga::storage_add_index_multiple_columns(KEY *key_info,
if ((error = storage_write_row_index(table->record[0],
record_id,
current_key_info,
- index_columns[i + n_keys],
- &key,
- &encoded_key)))
+ index_columns[i + n_keys])))
{
break;
}
@@ -7439,16 +7426,13 @@ int ha_mroonga::storage_add_index_multiple_columns(KEY *key_info,
} else {
error = storage_rnd_end();
}
-
- grn_obj_unlink(ctx, &encoded_key);
- grn_obj_unlink(ctx, &key);
}
DBUG_RETURN(error);
}
int ha_mroonga::add_index(TABLE *table_arg, KEY *key_info,
- uint num_of_keys, handler_add_index **add)
+ uint num_of_keys, handler_add_index **add)
{
MRN_DBUG_ENTER_METHOD();
int res;
Modified: ha_mroonga.h (+5 -4)
===================================================================
--- ha_mroonga.h 2011-10-27 06:25:11 +0000 (5ef8400)
+++ ha_mroonga.h 2011-10-27 08:44:52 +0000 (6249b40)
@@ -108,13 +108,15 @@ public:
ha_mroonga *parent_for_clone;
MEM_ROOT *mem_root_for_clone;
grn_obj key_buffer;
- grn_obj old_value_buffer;
- grn_obj new_value_buffer;
grn_id record_id;
private:
grn_ctx *ctx;
+ grn_obj encoded_key_buffer;
+ grn_obj old_value_buffer;
+ grn_obj new_value_buffer;
+
grn_obj *grn_table;
grn_obj **grn_columns;
@@ -409,8 +411,7 @@ private:
int wrapper_write_row_index(uchar *buf);
int storage_write_row(uchar *buf);
int storage_write_row_index(uchar *buf, grn_id record_id,
- KEY *key_info, grn_obj *index_column,
- grn_obj *key, grn_obj *encoded_key);
+ KEY *key_info, grn_obj *index_column);
int storage_write_row_indexes(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);