[Groonga-mysql-commit] mroonga/mroonga [master] [storage] support multicolumn index writing.

Back to archive index

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




Groonga-mysql-commit メーリングリストの案内
Back to archive index