null+****@clear*****
null+****@clear*****
2012年 2月 3日 (金) 13:33:04 JST
Kouhei Sutou 2012-02-03 13:33:04 +0900 (Fri, 03 Feb 2012)
New Revision: 331d62518afc8358f89f72f6a3c5a16c816e1656
Log:
[mysql56] support MYSQL_TYPE_DATETIME2.
Modified files:
ha_mroonga.cc
ha_mroonga.h
Modified: ha_mroonga.cc (+51 -2)
===================================================================
--- ha_mroonga.cc 2012-02-02 18:13:04 +0900 (8b460f5)
+++ ha_mroonga.cc 2012-02-03 13:33:04 +0900 (cf476d3)
@@ -7190,6 +7190,30 @@ int ha_mroonga::generic_store_bulk_datetime(Field *field, grn_obj *buf)
DBUG_RETURN(error);
}
+#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
+int ha_mroonga::generic_store_bulk_datetime2(Field *field, grn_obj *buf)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ Field_datetimef *datetimef_field = (Field_datetimef *)field;
+ MYSQL_TIME mysql_time;
+ datetimef_field->get_time(&mysql_time);
+ struct tm date;
+ memset(&date, 0, sizeof(struct tm));
+ date.tm_year = mysql_time.year - 1900;
+ date.tm_mon = mysql_time.month - 1;
+ date.tm_mday = mysql_time.day;
+ date.tm_hour = mysql_time.hour;
+ date.tm_min = mysql_time.minute;
+ date.tm_sec = mysql_time.second;
+ int32 seconds = mktime(&date) + mrn_utc_diff_in_seconds;
+ long long int time = GRN_TIME_PACK(seconds, 0);
+ grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0);
+ GRN_TIME_SET(ctx, buf, time);
+ DBUG_RETURN(error);
+}
+#endif
+
int ha_mroonga::generic_store_bulk_new_date(Field *field, grn_obj *buf)
{
MRN_DBUG_ENTER_METHOD();
@@ -7303,7 +7327,7 @@ int ha_mroonga::generic_store_bulk(Field *field, grn_obj *buf)
#endif
#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
case MYSQL_TYPE_DATETIME2:
- error = generic_store_bulk_time(field, buf);
+ error = generic_store_bulk_datetime2(field, buf);
break;
#endif
#ifdef MRN_HAVE_MYSQL_TYPE_TIME2
@@ -7505,6 +7529,31 @@ void ha_mroonga::storage_store_field_new_date(Field *field,
#endif
}
+#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
+void ha_mroonga::storage_store_field_datetime2(Field *field,
+ const char *value,
+ uint value_length)
+{
+ long long int time = *((long long int *)value);
+ int32 sec, usec;
+ GRN_TIME_UNPACK(time, sec, usec);
+ struct tm date;
+ time_t sec_t = sec;
+ gmtime_r(&sec_t, &date);
+ MYSQL_TIME mysql_date;
+ memset(&mysql_date, 0, sizeof(MYSQL_TIME));
+ mysql_date.time_type = MYSQL_TIMESTAMP_DATETIME;
+ mysql_date.year = date.tm_year + 1900;
+ mysql_date.month = date.tm_mon + 1;
+ mysql_date.day = date.tm_mday;
+ mysql_date.hour = date.tm_hour;
+ mysql_date.minute = date.tm_min;
+ mysql_date.second = date.tm_sec;
+ mysql_date.second_part = usec;
+ field->store_time(&mysql_date);
+}
+#endif
+
void ha_mroonga::storage_store_field_blob(Field *field,
const char *value,
uint value_length)
@@ -7595,7 +7644,7 @@ void ha_mroonga::storage_store_field(Field *field,
#endif
#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
case MYSQL_TYPE_DATETIME2:
- storage_store_field_time(field, value, value_length);
+ storage_store_field_datetime2(field, value, value_length);
break;
#endif
#ifdef MRN_HAVE_MYSQL_TYPE_TIME2
Modified: ha_mroonga.h (+7 -0)
===================================================================
--- ha_mroonga.h 2012-02-02 18:13:04 +0900 (d236696)
+++ ha_mroonga.h 2012-02-03 13:33:04 +0900 (8d8855d)
@@ -428,6 +428,9 @@ private:
int generic_store_bulk_time(Field *field, grn_obj *buf);
int generic_store_bulk_datetime(Field *field, grn_obj *buf);
int generic_store_bulk_new_date(Field *field, grn_obj *buf);
+#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
+ int generic_store_bulk_datetime2(Field *field, grn_obj *buf);
+#endif
int generic_store_bulk_new_decimal(Field *field, grn_obj *buf);
int generic_store_bulk_blob(Field *field, grn_obj *buf);
int generic_store_bulk_geometry(Field *field, grn_obj *buf);
@@ -449,6 +452,10 @@ private:
const char *value, uint value_length);
void storage_store_field_new_date(Field *field,
const char *value, uint value_length);
+#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
+ void storage_store_field_datetime2(Field *field,
+ const char *value, uint value_length);
+#endif
void storage_store_field_blob(Field *field,
const char *value, uint value_length);
void storage_store_field_geometry(Field *field,