null+****@clear*****
null+****@clear*****
2012年 1月 29日 (日) 21:13:11 JST
Kouhei Sutou 2012-01-29 21:13:11 +0900 (Sun, 29 Jan 2012)
New Revision: cdbf36baab0d2875aff5959dce473425db82147e
Log:
cleanup field -> bulk converter.
Modified files:
ha_mroonga.cc
ha_mroonga.h
Modified: ha_mroonga.cc (+248 -131)
===================================================================
--- ha_mroonga.cc 2012-01-29 21:12:39 +0900 (895a5de)
+++ ha_mroonga.cc 2012-01-29 21:13:11 +0900 (6989aef)
@@ -1067,128 +1067,6 @@ static int mrn_set_geometry(grn_ctx *ctx, grn_obj *buf,
return error;
}
-static int mrn_set_buf(grn_ctx *ctx, Field *field, grn_obj *buf, int *size)
-{
- int error;
- error = mrn_change_encoding(ctx, field->charset());
- if (error)
- return error;
- switch (field->type()) {
- case MYSQL_TYPE_DECIMAL:
- {
- String val;
- field->val_str(NULL, &val);
- grn_obj_reinit(ctx, buf, GRN_DB_SHORT_TEXT, 0);
- GRN_TEXT_SET(ctx, buf, val.ptr(), val.length());
- *size = val.length();
- }
- break;
- case MYSQL_TYPE_NEWDECIMAL:
- {
- String val;
- Field_new_decimal *new_decimal_field = (Field_new_decimal *)field;
- new_decimal_field->val_str(&val, NULL);
- grn_obj_reinit(ctx, buf, GRN_DB_SHORT_TEXT, 0);
- GRN_TEXT_SET(ctx, buf, val.ptr(), val.length());
- *size = val.length();
- }
- break;
- case MYSQL_TYPE_BIT:
- case MYSQL_TYPE_ENUM:
- case MYSQL_TYPE_SET:
- case MYSQL_TYPE_TINY:
- {
- int val = field->val_int();
- grn_obj_reinit(ctx, buf, GRN_DB_INT8, 0);
- GRN_INT8_SET(ctx, buf, val);
- *size = 1;
- break;
- }
- case MYSQL_TYPE_SHORT:
- {
- int val = field->val_int();
- grn_obj_reinit(ctx, buf, GRN_DB_INT16, 0);
- GRN_INT16_SET(ctx, buf, val);
- *size = 2;
- break;
- }
- case MYSQL_TYPE_INT24:
- case MYSQL_TYPE_LONG:
- {
- int val = field->val_int();
- grn_obj_reinit(ctx, buf, GRN_DB_INT32, 0);
- GRN_INT32_SET(ctx, buf, val);
- *size = 4;
- break;
- }
- case MYSQL_TYPE_LONGLONG:
- {
- long long int val = field->val_int();
- grn_obj_reinit(ctx, buf, GRN_DB_INT64, 0);
- GRN_INT64_SET(ctx, buf, val);
- *size = 8;
- break;
- }
- case MYSQL_TYPE_FLOAT:
- case MYSQL_TYPE_DOUBLE:
- {
- double val = field->val_real();
- grn_obj_reinit(ctx, buf, GRN_DB_FLOAT, 0);
- GRN_FLOAT_SET(ctx, buf, val);
- *size = 8;
- break;
- }
- case MYSQL_TYPE_TIME:
- case MYSQL_TYPE_YEAR:
- case MYSQL_TYPE_DATE:
- case MYSQL_TYPE_DATETIME:
- {
- long long int val = field->val_int();
- grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0);
- GRN_TIME_SET(ctx, buf, val);
- *size = 8;
- break;
- }
- case MYSQL_TYPE_STRING:
- case MYSQL_TYPE_VARCHAR:
- {
- String tmp;
- const char *val = field->val_str(&tmp)->ptr();
- int len = field->data_length();
- grn_obj_reinit(ctx, buf, GRN_DB_TEXT, 0);
- GRN_TEXT_SET(ctx, buf, val, len);
- *size = len;
- break;
- }
- case MYSQL_TYPE_BLOB:
- {
- String tmp;
- Field_blob *blob = (Field_blob*) field;
- const char *val = blob->val_str(0,&tmp)->ptr();
- int len = blob->get_length();
- grn_obj_reinit(ctx, buf, GRN_DB_TEXT, 0);
- GRN_TEXT_SET(ctx, buf, val, len);
- *size = len;
- break;
- }
- case MYSQL_TYPE_GEOMETRY:
- {
- String tmp;
- Field_geom *geometry = (Field_geom *)field;
- const char *wkb = geometry->val_str(0, &tmp)->ptr();
- int len = geometry->get_length();
- error = mrn_set_geometry(ctx, buf, wkb, len);
- if (!error) {
- *size = len;
- }
- break;
- }
- default:
- return HA_ERR_UNSUPPORTED;
- }
- return error;
-}
-
#ifdef WORDS_BIGENDIAN
#define mrn_byte_order_host_to_network(buf, key, size) \
{ \
@@ -4139,7 +4017,7 @@ int ha_mroonga::wrapper_write_row_index(uchar *buf)
if (error)
goto err;
int new_column_size;
- error = mrn_set_buf(ctx, field, &new_value_buffer, &new_column_size);
+ error = generic_store_bulk(field, &new_value_buffer, &new_column_size);
if (error) {
my_message(error,
"mroonga: wrapper: "
@@ -4229,7 +4107,7 @@ int ha_mroonga::storage_write_row(uchar *buf)
#endif
DBUG_RETURN(error);
}
- mrn_set_buf(ctx, pkey_field, &key_buffer, &pkey_size);
+ generic_store_bulk(pkey_field, &key_buffer, &pkey_size);
pkey = GRN_TEXT_VALUE(&key_buffer);
} else {
mrn_change_encoding(ctx, NULL);
@@ -4296,7 +4174,7 @@ int ha_mroonga::storage_write_row(uchar *buf)
grn_obj_unlink(ctx, &colbuf);
DBUG_RETURN(error);
}
- mrn_set_buf(ctx, field, &colbuf, &col_size);
+ generic_store_bulk(field, &colbuf, &col_size);
grn_obj_set_value(ctx, grn_columns[i], record_id, &colbuf, GRN_OBJ_SET);
if (ctx->rc) {
#ifndef DBUG_OFF
@@ -4541,11 +4419,11 @@ int ha_mroonga::wrapper_update_row_index(const uchar *old_data, uchar *new_data)
Field *field = key_info.key_part[j].field;
int new_column_size;
- mrn_set_buf(ctx, field, &new_value_buffer, &new_column_size);
+ generic_store_bulk(field, &new_value_buffer, &new_column_size);
field->move_field_offset(ptr_diff);
int old_column_size;
- mrn_set_buf(ctx, field, &old_value_buffer, &old_column_size);
+ generic_store_bulk(field, &old_value_buffer, &old_column_size);
field->move_field_offset(-ptr_diff);
grn_rc rc;
@@ -4681,7 +4559,7 @@ int ha_mroonga::storage_update_row(const uchar *old_data, uchar *new_data)
}
}
- mrn_set_buf(ctx, field, &colbuf, &col_size);
+ generic_store_bulk(field, &colbuf, &col_size);
grn_obj_set_value(ctx, grn_columns[i], record_id, &colbuf, GRN_OBJ_SET);
if (ctx->rc) {
#ifndef DBUG_OFF
@@ -4869,7 +4747,7 @@ int ha_mroonga::wrapper_delete_row_index(const uchar *buf)
continue;
int old_column_size;
- mrn_set_buf(ctx, field, &old_value_buffer, &old_column_size);
+ generic_store_bulk(field, &old_value_buffer, &old_column_size);
grn_rc rc;
rc = grn_column_index_update(ctx, index_column, record_id, j + 1,
&old_value_buffer, NULL);
@@ -7056,6 +6934,242 @@ void ha_mroonga::check_fast_order_limit(grn_table_sort_key **sort_keys,
DBUG_VOID_RETURN;
}
+int ha_mroonga::generic_store_bulk_string(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ String value;
+ field->val_str(NULL, &value);
+ grn_obj_reinit(ctx, buf, GRN_DB_SHORT_TEXT, 0);
+ GRN_TEXT_SET(ctx, buf, value.ptr(), value.length());
+ *size = value.length();
+ DBUG_RETURN(error);
+}
+
+int ha_mroonga::generic_store_bulk_integer(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ long long value = field->val_int();
+ *size = field->pack_length();
+ switch (*size) {
+ case 1:
+ grn_obj_reinit(ctx, buf, GRN_DB_INT8, 0);
+ GRN_INT8_SET(ctx, buf, value);
+ break;
+ case 2:
+ grn_obj_reinit(ctx, buf, GRN_DB_INT16, 0);
+ GRN_INT16_SET(ctx, buf, value);
+ break;
+ case 3:
+ case 4:
+ grn_obj_reinit(ctx, buf, GRN_DB_INT32, 0);
+ GRN_INT32_SET(ctx, buf, value);
+ break;
+ case 8:
+ grn_obj_reinit(ctx, buf, GRN_DB_INT64, 0);
+ GRN_INT64_SET(ctx, buf, value);
+ break;
+ default:
+ // Why!?
+ error = HA_ERR_UNSUPPORTED;
+ char error_message[MRN_MESSAGE_BUFFER_SIZE];
+ snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE,
+ "unknown integer value size: <%d>: "
+ "available sizes: [1, 2, 3, 4, 8]",
+ *size);
+ push_warning(ha_thd(), Sql_condition::WARN_LEVEL_WARN,
+ error, error_message);
+ break;
+ }
+ DBUG_RETURN(error);
+}
+
+int ha_mroonga::generic_store_bulk_float(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ double value = field->val_real();
+ *size = field->pack_length();
+ switch (*size) {
+ case 4:
+ case 8:
+ grn_obj_reinit(ctx, buf, GRN_DB_FLOAT, 0);
+ GRN_FLOAT_SET(ctx, buf, value);
+ break;
+ default:
+ // Why!?
+ error = HA_ERR_UNSUPPORTED;
+ char error_message[MRN_MESSAGE_BUFFER_SIZE];
+ snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE,
+ "unknown float value size: <%d>: "
+ "available sizes: [4, 8]",
+ *size);
+ push_warning(ha_thd(), Sql_condition::WARN_LEVEL_WARN,
+ error, error_message);
+ break;
+ }
+ DBUG_RETURN(error);
+}
+
+int ha_mroonga::generic_store_bulk_time(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ long long value = field->val_int();
+ // FIXME: value isn't epoch time. We should store epoch
+ // time to bulk.
+ grn_obj_reinit(ctx, buf, GRN_DB_TIME, 0);
+ *size = field->pack_length();
+ switch (*size) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 8:
+ GRN_TIME_SET(ctx, buf, value);
+ break;
+ default:
+ // Why!?
+ error = HA_ERR_UNSUPPORTED;
+ char error_message[MRN_MESSAGE_BUFFER_SIZE];
+ snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE,
+ "unknown integer value size: <%d>: "
+ "available sizes: [1, 2, 3, 4, 8]",
+ *size);
+ push_warning(ha_thd(), Sql_condition::WARN_LEVEL_WARN,
+ error, error_message);
+ break;
+ }
+ DBUG_RETURN(error);
+}
+
+int ha_mroonga::generic_store_bulk_new_decimal(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ String value;
+ Field_new_decimal *new_decimal_field = (Field_new_decimal *)field;
+ new_decimal_field->val_str(&value, NULL);
+ grn_obj_reinit(ctx, buf, GRN_DB_SHORT_TEXT, 0);
+ GRN_TEXT_SET(ctx, buf, value.ptr(), value.length());
+ *size = value.length();
+ DBUG_RETURN(error);
+}
+
+int ha_mroonga::generic_store_bulk_blob(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ String buffer;
+ Field_blob *blob = (Field_blob *)field;
+ const char *value = blob->val_str(0, &buffer)->ptr();
+ *size = blob->get_length();
+ grn_obj_reinit(ctx, buf, GRN_DB_TEXT, 0);
+ GRN_TEXT_SET(ctx, buf, value, *size);
+ DBUG_RETURN(error);
+}
+
+int ha_mroonga::generic_store_bulk_geometry(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ String buffer;
+ Field_geom *geometry = (Field_geom *)field;
+ const char *wkb = geometry->val_str(0, &buffer)->ptr();
+ int len = geometry->get_length();
+ error = mrn_set_geometry(ctx, buf, wkb, len);
+ if (!error) {
+ *size = len;
+ }
+ DBUG_RETURN(error);
+}
+
+int ha_mroonga::generic_store_bulk(Field *field, grn_obj *buf, int *size)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error;
+ error = mrn_change_encoding(ctx, field->charset());
+ if (error)
+ return error;
+ switch (field->type()) {
+ case MYSQL_TYPE_DECIMAL:
+ error = generic_store_bulk_string(field, buf, size);
+ break;
+ case MYSQL_TYPE_TINY:
+ case MYSQL_TYPE_SHORT:
+ case MYSQL_TYPE_LONG:
+ error = generic_store_bulk_integer(field, buf, size);
+ break;
+ case MYSQL_TYPE_FLOAT:
+ case MYSQL_TYPE_DOUBLE:
+ error = generic_store_bulk_float(field, buf, size);
+ break;
+ case MYSQL_TYPE_NULL:
+ error = generic_store_bulk_integer(field, buf, size);
+ break;
+ case MYSQL_TYPE_TIMESTAMP:
+ error = generic_store_bulk_time(field, buf, size);
+ break;
+ case MYSQL_TYPE_LONGLONG:
+ case MYSQL_TYPE_INT24:
+ error = generic_store_bulk_integer(field, buf, size);
+ break;
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_TIME:
+ case MYSQL_TYPE_DATETIME:
+ case MYSQL_TYPE_YEAR:
+ case MYSQL_TYPE_NEWDATE:
+ error = generic_store_bulk_time(field, buf, size);
+ break;
+ case MYSQL_TYPE_VARCHAR:
+ error = generic_store_bulk_string(field, buf, size);
+ break;
+ case MYSQL_TYPE_BIT:
+ error = generic_store_bulk_integer(field, buf, size);
+ break;
+#ifdef MRN_HAVE_MYSQL_TYPE_TIMESTAMP2
+ case MYSQL_TYPE_TIMESTAMP2:
+ error = generic_store_bulk_time(field, buf, size);
+ break;
+#endif
+#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
+ case MYSQL_TYPE_DATETIME2:
+ error = generic_store_bulk_time(field, buf, size);
+ break;
+#endif
+#ifdef MRN_HAVE_MYSQL_TYPE_TIME2
+ case MYSQL_TYPE_TIME2:
+ error = generic_store_bulk_time(field, buf, size);
+ break;
+#endif
+ case MYSQL_TYPE_NEWDECIMAL:
+ error = generic_store_bulk_new_decimal(field, buf, size);
+ break;
+ case MYSQL_TYPE_ENUM:
+ case MYSQL_TYPE_SET:
+ error = generic_store_bulk_integer(field, buf, size);
+ break;
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ error = generic_store_bulk_blob(field, buf, size);
+ break;
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_STRING:
+ error = generic_store_bulk_string(field, buf, size);
+ break;
+ case MYSQL_TYPE_GEOMETRY:
+ error = generic_store_bulk_geometry(field, buf, size);
+ break;
+ default:
+ error = HA_ERR_UNSUPPORTED;
+ break;
+ }
+ DBUG_RETURN(error);
+}
+
void ha_mroonga::storage_store_field_string(Field *field,
const char *value,
uint value_length)
@@ -7117,6 +7231,9 @@ void ha_mroonga::storage_store_field_time(Field *field,
{
long long int field_value;
field_value = *((long long int *)value);
+ // FIXME: field_value should be epoch time and convert
+ // epoch time to MySQL time. See also
+ // ha_mroonga::generic_store_bulk_time().
field->store(field_value);
}
@@ -8671,7 +8788,7 @@ int ha_mroonga::wrapper_recreate_indexes(THD *thd)
break;
int new_column_size;
- mrn_set_buf(ctx, field, &new_value_buffer, &new_column_size);
+ generic_store_bulk(field, &new_value_buffer, &new_column_size);
grn_obj *index_column = grn_index_columns[k];
grn_rc rc;
@@ -9053,7 +9170,7 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
break;
int new_column_size;
- mrn_set_buf(ctx, field, &new_value_buffer, &new_column_size);
+ generic_store_bulk(field, &new_value_buffer, &new_column_size);
grn_obj *index_column = grn_obj_column(ctx,
index_tables[k + n_keys],
Modified: ha_mroonga.h (+10 -0)
===================================================================
--- ha_mroonga.h 2012-01-29 21:12:39 +0900 (cc02f4d)
+++ ha_mroonga.h 2012-01-29 21:13:11 +0900 (0cd0a5b)
@@ -401,6 +401,16 @@ 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);
+
+ int generic_store_bulk_string(Field *field, grn_obj *buf, int *size);
+ int generic_store_bulk_integer(Field *field, grn_obj *buf, int *size);
+ int generic_store_bulk_float(Field *field, grn_obj *buf, int *size);
+ int generic_store_bulk_time(Field *field, grn_obj *buf, int *size);
+ int generic_store_bulk_new_decimal(Field *field, grn_obj *buf, int *size);
+ int generic_store_bulk_blob(Field *field, grn_obj *buf, int *size);
+ int generic_store_bulk_geometry(Field *field, grn_obj *buf, int *size);
+ int generic_store_bulk(Field *field, grn_obj *buf, int *size);
+
void storage_store_field_string(Field *field,
const char *value, uint value_length);
void storage_store_field_integer(Field *field,