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,