[Groonga-mysql-commit] mroonga/mroonga [master] [storage] cleanup field store. refs #1212

Back to archive index

null+****@clear***** null+****@clear*****
2012年 1月 23日 (月) 19:13:02 JST


Kouhei Sutou	2012-01-23 19:13:02 +0900 (Mon, 23 Jan 2012)

  New Revision: ed2fabb35778d0b60a39de508d65ddd5a166653b

  Log:
    [storage] cleanup field store. refs #1212

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+33 -91)
===================================================================
--- ha_mroonga.cc    2012-01-23 19:12:26 +0900 (111b9f1)
+++ ha_mroonga.cc    2012-01-23 19:13:02 +0900 (7cc93c6)
@@ -7011,97 +7011,53 @@ void ha_mroonga::check_fast_order_limit(grn_table_sort_key **sort_keys,
   DBUG_VOID_RETURN;
 }
 
-void ha_mroonga::storage_store_field(grn_obj *col, grn_id id, Field *field,
-                                        void *key, int key_length)
+void ha_mroonga::storage_store_field(Field *field,
+                                     const char *value, uint value_length)
 {
-  grn_obj buf;
-  mrn_change_encoding(ctx, field->charset());
   field->set_notnull();
   switch (field->type()) {
   case MYSQL_TYPE_DECIMAL:
   case MYSQL_TYPE_NEWDECIMAL:
-    {
-      GRN_TEXT_INIT(&buf, 0);
-      if (key)
-        GRN_TEXT_SET(ctx, &buf, key, key_length);
-      else
-        grn_obj_get_value(ctx, col, id, &buf);
-      field->store(GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf), field->charset());
-    }
+    field->store(value, value_length, field->charset());
     break;
   case MYSQL_TYPE_BIT :
   case MYSQL_TYPE_ENUM :
   case MYSQL_TYPE_SET :
   case MYSQL_TYPE_TINY :
     {
-      int val;
-      if (key) {
-        GRN_VOID_INIT(&buf);
-        val = *((int *) key);
-      } else {
-        GRN_INT8_INIT(&buf,0);
-        grn_obj_get_value(ctx, col, id, &buf);
-        val = GRN_INT8_VALUE(&buf);
-      }
-      field->store(val);
+      signed char field_value;
+      field_value = *((signed char *)value);
+      field->store(field_value);
       break;
     }
   case MYSQL_TYPE_SHORT :
     {
-      int val;
-      if (key) {
-        GRN_VOID_INIT(&buf);
-        val = *((int *) key);
-      } else {
-        GRN_INT16_INIT(&buf,0);
-        grn_obj_get_value(ctx, col, id, &buf);
-        val = GRN_INT16_VALUE(&buf);
-      }
-      field->store(val);
+      signed short field_value;
+      field_value = *((signed short *)value);
+      field->store(field_value);
       break;
     }
   case MYSQL_TYPE_INT24 :
   case MYSQL_TYPE_LONG :
     {
-      int val;
-      if (key) {
-        GRN_VOID_INIT(&buf);
-        val = *((int *) key);
-      } else {
-        GRN_INT32_INIT(&buf,0);
-        grn_obj_get_value(ctx, col, id, &buf);
-        val = GRN_INT32_VALUE(&buf);
-      }
-      field->store(val);
+      int field_value;
+      field_value = *((int *)value);
+      field->store(field_value);
       break;
     }
   case MYSQL_TYPE_LONGLONG :
     {
-      long long int val;
-      if (key) {
-        GRN_VOID_INIT(&buf);
-        val = *((int *) key);
-      } else {
-        GRN_INT64_INIT(&buf,0);
-        grn_obj_get_value(ctx, col, id, &buf);
-        val = GRN_INT64_VALUE(&buf);
-      }
-      field->store(val);
+      long long int field_value;
+      field_value = *((long long int *)value);
+      field->store(field_value);
       break;
     }
   case MYSQL_TYPE_FLOAT :
   case MYSQL_TYPE_DOUBLE :
     {
-      double val;
-      if (key) {
-        GRN_VOID_INIT(&buf);
-        val = *((int *) key);
-      } else {
-        GRN_FLOAT_INIT(&buf,0);
-        grn_obj_get_value(ctx, col, id, &buf);
-        val = GRN_FLOAT_VALUE(&buf);
-      }
-      field->store(val);
+      double field_value;
+      field_value = *((double *)value);
+      field->store(field_value);
       break;
     }
   case MYSQL_TYPE_TIME :
@@ -7109,25 +7065,18 @@ void ha_mroonga::storage_store_field(grn_obj *col, grn_id id, Field *field,
   case MYSQL_TYPE_YEAR :
   case MYSQL_TYPE_DATETIME :
     {
-      long long int val;
-      if (key) {
-        GRN_VOID_INIT(&buf);
-        val = *((int *) key);
-      } else {
-        GRN_TIME_INIT(&buf,0);
-        grn_obj_get_value(ctx, col, id, &buf);
-        val = GRN_TIME_VALUE(&buf);
-      }
-      field->store(val);
+      long long int field_value;
+      field_value = *((long long int *)value);
+      field->store(field_value);
       break;
     }
   case MYSQL_TYPE_GEOMETRY :
     {
-      GRN_WGS84_GEO_POINT_INIT(&buf, 0);
-      grn_obj_get_value(ctx, col, id, &buf);
       uchar wkb[SRID_SIZE + WKB_HEADER_SIZE + POINT_DATA_SIZE];
+      grn_geo_point *field_value = (grn_geo_point *)value;
       int latitude, longitude;
-      GRN_GEO_POINT_VALUE(&buf, latitude, longitude);
+      latitude = field_value->latitude;
+      longitude = field_value->longitude;
       if (grn_source_column_geo) {
         GRN_GEO_POINT_SET(ctx, &source_point, latitude, longitude);
       }
@@ -7148,27 +7097,16 @@ void ha_mroonga::storage_store_field(grn_obj *col, grn_id id, Field *field,
     }
   case MYSQL_TYPE_BLOB:
     {
-      GRN_VOID_INIT(&buf);
-      uint32 len;
-      const char *val = grn_obj_get_value_(ctx, col, id, &len);
       Field_blob *blob = (Field_blob *)field;
-      blob->set_ptr((uchar *)&len, (uchar *)val);
+      blob->set_ptr((uchar *)&value_length, (uchar *)value);
       break;
     }
   default: //strings etc..
     {
-      GRN_TEXT_INIT(&buf,0);
-      if (key)
-        GRN_TEXT_SET(ctx, &buf, key, key_length);
-      else
-        grn_obj_get_value(ctx, col, id, &buf);
-      char *val = GRN_TEXT_VALUE(&buf);
-      int len = GRN_TEXT_LEN(&buf);
-      field->store(val, len, field->charset());
+      field->store(value, value_length, field->charset());
       break;
     }
   }
-  grn_obj_unlink(ctx, &buf);
 }
 
 void ha_mroonga::storage_store_fields(uchar *buf, grn_id record_id)
@@ -7205,7 +7143,11 @@ void ha_mroonga::storage_store_fields(uchar *buf, grn_id record_id)
         field->store((int)record_id);
       } else {
         // actual column
-        storage_store_field(grn_columns[i], record_id, field, NULL, 0);
+        const char *value;
+        uint32 value_length;
+        value = grn_obj_get_value_(ctx, grn_columns[i], record_id,
+                                   &value_length);
+        storage_store_field(field, value, value_length);
       }
       field->move_field_offset(-ptr_diff);
 #ifndef DBUG_OFF
@@ -7220,7 +7162,7 @@ void ha_mroonga::storage_store_fields(uchar *buf, grn_id record_id)
 void ha_mroonga::storage_store_fields_by_index(uchar *buf)
 {
   MRN_DBUG_ENTER_METHOD();
-  int key_length;
+  uint key_length;
   void *key;
   KEY *key_info = &table->key_info[active_index];
   if (table->s->primary_key == active_index)
@@ -7236,7 +7178,7 @@ void ha_mroonga::storage_store_fields_by_index(uchar *buf)
                                                       table->write_set);
 #endif
     field->move_field_offset(ptr_diff);
-    storage_store_field(NULL, 0, field, key, key_length);
+    storage_store_field(field, (const char *)key, key_length);
     field->move_field_offset(-ptr_diff);
 #ifndef DBUG_OFF
     dbug_tmp_restore_column_map(table->write_set, tmp_map);

  Modified: ha_mroonga.h (+1 -2)
===================================================================
--- ha_mroonga.h    2012-01-23 19:12:26 +0900 (74e80f1)
+++ ha_mroonga.h    2012-01-23 19:13:02 +0900 (afd5f3e)
@@ -400,8 +400,7 @@ private:
   void check_fast_order_limit(grn_table_sort_key **sort_keys, int *n_sort_keys,
                               longlong *limit,
                               grn_obj *target_table, grn_obj *score_column);
-  void storage_store_field(grn_obj *col, grn_id id, Field *field,
-                           void *key, int key_length);
+  void storage_store_field(Field *field, const char *value, uint value_length);
   void storage_store_fields(uchar *buf, grn_id record_id);
   void storage_store_fields_by_index(uchar *buf);
   void set_pk_bitmap();




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