[Groonga-mysql-commit] mroonga/mroonga [master] use suitable type.

Back to archive index

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


Kouhei Sutou	2012-01-23 19:59:57 +0900 (Mon, 23 Jan 2012)

  New Revision: 4c8032e149d74c7785bb88ed20cc7d982be03379

  Log:
    use suitable type.

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+177 -92)
===================================================================
--- ha_mroonga.cc    2012-01-23 19:13:02 +0900 (7cc93c6)
+++ ha_mroonga.cc    2012-01-23 19:59:57 +0900 (fbd43e3)
@@ -984,14 +984,10 @@ static grn_builtin_type mrn_grn_type_from_field(grn_ctx *ctx, Field *field,
     type = GRN_DB_SHORT_TEXT;   // 4Kbytes
     break;
   case MYSQL_TYPE_ENUM:         // ENUM; <= 2bytes
-    type = GRN_DB_INT8;         // 1byte
-    // XXX: We should use INT16
-    // type = GRN_DB_INT16;        // 2bytes
+    type = GRN_DB_INT16;        // 2bytes
     break;
   case MYSQL_TYPE_SET:          // SET; <= 8bytes
-    type = GRN_DB_INT8;         // 1byte
-    // XXX: We should use INT64.
-    // type = GRN_DB_INT64;        // 8bytes
+    type = GRN_DB_INT64;        // 8bytes
     break;
   case MYSQL_TYPE_TINY_BLOB:    // TINYBLOB; <= 256bytes + 1byte
     type = GRN_DB_SHORT_TEXT;   // 4Kbytes
@@ -7011,101 +7007,190 @@ void ha_mroonga::check_fast_order_limit(grn_table_sort_key **sort_keys,
   DBUG_VOID_RETURN;
 }
 
+void ha_mroonga::storage_store_field_string(Field *field,
+                                            const char *value,
+                                            uint value_length)
+{
+  field->store(value, value_length, field->charset());
+}
+
+void ha_mroonga::storage_store_field_integer(Field *field,
+                                             const char *value,
+                                             uint value_length)
+{
+    switch (value_length) {
+    case 1:
+      {
+        char field_value;
+        field_value = *((char *)value);
+        field->store(field_value);
+        break;
+      }
+    case 2:
+      {
+        short field_value;
+        field_value = *((short *)value);
+        field->store(field_value);
+        break;
+      }
+    case 4:
+      {
+        int field_value;
+        field_value = *((int *)value);
+        field->store(field_value);
+        break;
+      }
+    case 8:
+      {
+        long long int field_value;
+        field_value = *((long long int *)value);
+        field->store(field_value);
+        break;
+      }
+    default:
+      {
+        // Why!?
+        char error_message[MRN_MESSAGE_BUFFER_SIZE];
+        snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE,
+                 "unknown integer value size: <%d>: "
+                 "available sizes: [1, 2, 4, 8]",
+                 value_length);
+        push_warning(ha_thd(), Sql_condition::WARN_LEVEL_WARN,
+                     HA_ERR_UNSUPPORTED, error_message);
+      }
+      storage_store_field_string(field, value, value_length);
+      break;
+    }
+}
+
+void ha_mroonga::storage_store_field_float(Field *field,
+                                           const char *value,
+                                           uint value_length)
+{
+  double field_value;
+  field_value = *((double *)value);
+  field->store(field_value);
+}
+
+void ha_mroonga::storage_store_field_time(Field *field,
+                                          const char *value,
+                                          uint value_length)
+{
+  long long int field_value;
+  field_value = *((long long int *)value);
+  field->store(field_value);
+}
+
+void ha_mroonga::storage_store_field_blob(Field *field,
+                                          const char *value,
+                                          uint value_length)
+{
+  Field_blob *blob = (Field_blob *)field;
+  blob->set_ptr((uchar *)&value_length, (uchar *)value);
+}
+
+void ha_mroonga::storage_store_field_geometry(Field *field,
+                                              const char *value,
+                                              uint value_length)
+{
+  uchar wkb[SRID_SIZE + WKB_HEADER_SIZE + POINT_DATA_SIZE];
+  grn_geo_point *field_value = (grn_geo_point *)value;
+  int latitude, longitude;
+  latitude = field_value->latitude;
+  longitude = field_value->longitude;
+  if (grn_source_column_geo) {
+    GRN_GEO_POINT_SET(ctx, &source_point, latitude, longitude);
+  }
+  memset(wkb, 0, SRID_SIZE);
+  memset(wkb + SRID_SIZE, Geometry::wkb_ndr, 1); // wkb_ndr is meaningless.
+  int4store(wkb + SRID_SIZE + 1, Geometry::wkb_point);
+  double latitude_in_degree, longitude_in_degree;
+  latitude_in_degree = GRN_GEO_MSEC2DEGREE(latitude);
+  longitude_in_degree = GRN_GEO_MSEC2DEGREE(longitude);
+  float8store(wkb + SRID_SIZE + WKB_HEADER_SIZE,
+              longitude_in_degree);
+  float8store(wkb + SRID_SIZE + WKB_HEADER_SIZE + SIZEOF_STORED_DOUBLE,
+              latitude_in_degree);
+  field->store((const char *)wkb,
+               (uint)(sizeof(wkb) / sizeof(*wkb)),
+               field->charset());
+}
+
 void ha_mroonga::storage_store_field(Field *field,
                                      const char *value, uint value_length)
 {
   field->set_notnull();
   switch (field->type()) {
   case MYSQL_TYPE_DECIMAL:
+    storage_store_field_string(field, value, value_length);
+    break;
+  case MYSQL_TYPE_TINY:
+  case MYSQL_TYPE_SHORT:
+  case MYSQL_TYPE_LONG:
+    storage_store_field_integer(field, value, value_length);
+    break;
+  case MYSQL_TYPE_FLOAT:
+  case MYSQL_TYPE_DOUBLE:
+    storage_store_field_float(field, value, value_length);
+    break;
+  case MYSQL_TYPE_NULL:
+    storage_store_field_integer(field, value, value_length);
+    break;
+  case MYSQL_TYPE_TIMESTAMP:
+    storage_store_field_time(field, value, value_length);
+    break;
+  case MYSQL_TYPE_LONGLONG:
+  case MYSQL_TYPE_INT24:
+    storage_store_field_integer(field, value, value_length);
+    break;
+  case MYSQL_TYPE_DATE:
+  case MYSQL_TYPE_TIME:
+  case MYSQL_TYPE_DATETIME:
+  case MYSQL_TYPE_YEAR:
+  case MYSQL_TYPE_NEWDATE:
+    storage_store_field_time(field, value, value_length);
+    break;
+  case MYSQL_TYPE_VARCHAR:
+    storage_store_field_string(field, value, value_length);
+    break;
+  case MYSQL_TYPE_BIT:
+    storage_store_field_integer(field, value, value_length);
+    break;
+#ifdef MRN_HAVE_MYSQL_TYPE_TIMESTAMP2
+  case MYSQL_TYPE_TIMESTAMP2:
+    storage_store_field_time(field, value, value_length);
+    break;
+#endif
+#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
+  case MYSQL_TYPE_DATETIME2:
+    storage_store_field_time(field, value, value_length);
+    break;
+#endif
+#ifdef MRN_HAVE_MYSQL_TYPE_TIME2
+  case MYSQL_TYPE_TIME2:
+    storage_store_field_time(field, value, value_length);
+    break;
+#endif
   case MYSQL_TYPE_NEWDECIMAL:
-    field->store(value, value_length, field->charset());
+    storage_store_field_string(field, value, value_length);
     break;
-  case MYSQL_TYPE_BIT :
-  case MYSQL_TYPE_ENUM :
-  case MYSQL_TYPE_SET :
-  case MYSQL_TYPE_TINY :
-    {
-      signed char field_value;
-      field_value = *((signed char *)value);
-      field->store(field_value);
-      break;
-    }
-  case MYSQL_TYPE_SHORT :
-    {
-      signed short field_value;
-      field_value = *((signed short *)value);
-      field->store(field_value);
-      break;
-    }
-  case MYSQL_TYPE_INT24 :
-  case MYSQL_TYPE_LONG :
-    {
-      int field_value;
-      field_value = *((int *)value);
-      field->store(field_value);
-      break;
-    }
-  case MYSQL_TYPE_LONGLONG :
-    {
-      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 field_value;
-      field_value = *((double *)value);
-      field->store(field_value);
-      break;
-    }
-  case MYSQL_TYPE_TIME :
-  case MYSQL_TYPE_DATE :
-  case MYSQL_TYPE_YEAR :
-  case MYSQL_TYPE_DATETIME :
-    {
-      long long int field_value;
-      field_value = *((long long int *)value);
-      field->store(field_value);
-      break;
-    }
-  case MYSQL_TYPE_GEOMETRY :
-    {
-      uchar wkb[SRID_SIZE + WKB_HEADER_SIZE + POINT_DATA_SIZE];
-      grn_geo_point *field_value = (grn_geo_point *)value;
-      int latitude, longitude;
-      latitude = field_value->latitude;
-      longitude = field_value->longitude;
-      if (grn_source_column_geo) {
-        GRN_GEO_POINT_SET(ctx, &source_point, latitude, longitude);
-      }
-      memset(wkb, 0, SRID_SIZE);
-      memset(wkb + SRID_SIZE, Geometry::wkb_ndr, 1); // wkb_ndr is meaningless.
-      int4store(wkb + SRID_SIZE + 1, Geometry::wkb_point);
-      double latitude_in_degree, longitude_in_degree;
-      latitude_in_degree = GRN_GEO_MSEC2DEGREE(latitude);
-      longitude_in_degree = GRN_GEO_MSEC2DEGREE(longitude);
-      float8store(wkb + SRID_SIZE + WKB_HEADER_SIZE,
-                  longitude_in_degree);
-      float8store(wkb + SRID_SIZE + WKB_HEADER_SIZE + SIZEOF_STORED_DOUBLE,
-                  latitude_in_degree);
-      field->store((const char *)wkb,
-                   (uint)(sizeof(wkb) / sizeof(*wkb)),
-                   field->charset());
-      break;
-    }
+  case MYSQL_TYPE_ENUM:
+  case MYSQL_TYPE_SET:
+    storage_store_field_integer(field, value, value_length);
+    break;
+  case MYSQL_TYPE_TINY_BLOB:
+  case MYSQL_TYPE_MEDIUM_BLOB:
+  case MYSQL_TYPE_LONG_BLOB:
   case MYSQL_TYPE_BLOB:
-    {
-      Field_blob *blob = (Field_blob *)field;
-      blob->set_ptr((uchar *)&value_length, (uchar *)value);
-      break;
-    }
-  default: //strings etc..
-    {
-      field->store(value, value_length, field->charset());
-      break;
-    }
+    storage_store_field_blob(field, value, value_length);
+    break;
+  case MYSQL_TYPE_VAR_STRING:
+  case MYSQL_TYPE_STRING:
+    storage_store_field_string(field, value, value_length);
+    break;
+  case MYSQL_TYPE_GEOMETRY:
+    storage_store_field_geometry(field, value, value_length);
+    break;
   }
 }
 

  Modified: ha_mroonga.h (+12 -0)
===================================================================
--- ha_mroonga.h    2012-01-23 19:13:02 +0900 (afd5f3e)
+++ ha_mroonga.h    2012-01-23 19:59:57 +0900 (4de7400)
@@ -400,6 +400,18 @@ 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_string(Field *field,
+                                  const char *value, uint value_length);
+  void storage_store_field_integer(Field *field,
+                                   const char *value, uint value_length);
+  void storage_store_field_float(Field *field,
+                                 const char *value, uint value_length);
+  void storage_store_field_time(Field *field,
+                                const char *value, uint value_length);
+  void storage_store_field_blob(Field *field,
+                                const char *value, uint value_length);
+  void storage_store_field_geometry(Field *field,
+                                    const char *value, uint value_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);




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