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);