null+****@clear*****
null+****@clear*****
2012年 2月 27日 (月) 00:27:03 JST
Kouhei Sutou 2012-02-27 00:27:03 +0900 (Mon, 27 Feb 2012)
New Revision: b575f6f3097e965d70e1e2736b68dcdc53c796a9
Log:
function -> method.
mrn_multiple_column_key_encode() ->
ha_mroonga::storage_encode_multiple_column_key()
Modified files:
ha_mroonga.cc
ha_mroonga.h
Modified: ha_mroonga.cc (+317 -312)
===================================================================
--- ha_mroonga.cc 2012-02-26 23:55:40 +0900 (64294e6)
+++ ha_mroonga.cc 2012-02-27 00:27:03 +0900 (b91bfa1)
@@ -1138,232 +1138,6 @@ static int mrn_set_geometry(grn_ctx *ctx, grn_obj *buf,
}
#endif /* WORDS_BIGENDIAN */
-static uchar *mrn_multiple_column_key_encode(KEY *key_info,
- const uchar *key, uint key_length,
- uchar *buffer,
- uint *encoded_length,
- bool decode)
-{
- const uchar *current_key = key;
- const uchar *key_end = key + key_length;
- uchar *current_buffer = buffer;
-
- int n_key_parts = key_info->key_parts;
- *encoded_length = 0;
- for (int i = 0; i < n_key_parts && current_key < key_end; i++) {
- KEY_PART_INFO key_part = key_info->key_part[i];
- Field *field = key_part.field;
-
- if (field->null_bit) {
- *current_buffer = *current_key;
- current_key += 1;
- current_buffer += 1;
- (*encoded_length)++;
- }
-
- enum {
- TYPE_LONG_LONG_NUMBER,
- TYPE_NUMBER,
- TYPE_FLOAT,
- TYPE_DOUBLE,
- TYPE_BYTE_SEQUENCE
- } data_type;
- uint32 data_size;
- int int_value;
- long long int long_long_value;
- float float_value;
- double double_value;
- switch (field->real_type()) {
- case MYSQL_TYPE_DECIMAL:
- data_type = TYPE_BYTE_SEQUENCE;
- data_size = key_part.length;
- break;
- case MYSQL_TYPE_TINY:
- data_type = TYPE_NUMBER;
- data_size = 1;
- break;
- case MYSQL_TYPE_SHORT:
- data_type = TYPE_NUMBER;
- data_size = 2;
- break;
- case MYSQL_TYPE_LONG:
- data_type = TYPE_NUMBER;
- data_size = 4;
- break;
- case MYSQL_TYPE_FLOAT:
- data_type = TYPE_FLOAT;
- data_size = 4;
- float4get(float_value, current_key);
- break;
- case MYSQL_TYPE_DOUBLE:
- data_type = TYPE_DOUBLE;
- data_size = 8;
- float8get(double_value, current_key);
- break;
- case MYSQL_TYPE_NULL:
- data_type = TYPE_NUMBER;
- data_size = 1;
- break;
- case MYSQL_TYPE_TIMESTAMP:
- // TODO
- data_type = TYPE_BYTE_SEQUENCE;
- data_size = key_part.length;
- break;
- case MYSQL_TYPE_LONGLONG:
- data_type = TYPE_NUMBER;
- data_size = 8;
- break;
- case MYSQL_TYPE_INT24:
- data_type = TYPE_NUMBER;
- data_size = 3;
- break;
- case MYSQL_TYPE_DATE:
- case MYSQL_TYPE_TIME:
- case MYSQL_TYPE_DATETIME:
- case MYSQL_TYPE_YEAR:
- case MYSQL_TYPE_NEWDATE:
- data_type = TYPE_LONG_LONG_NUMBER;
- long_long_value = (long long int)sint8korr(current_key);
- data_size = 8;
- break;
- case MYSQL_TYPE_VARCHAR:
- data_type = TYPE_BYTE_SEQUENCE;
- data_size = HA_KEY_BLOB_LENGTH + key_part.length;
- break;
- case MYSQL_TYPE_BIT:
- // TODO
- data_type = TYPE_NUMBER;
- data_size = 1;
- break;
-#ifdef MRN_HAVE_MYSQL_TYPE_TIMESTAMP2
- case MYSQL_TYPE_TIMESTAMP2:
- // TODO
- data_type = TYPE_LONG_LONG_NUMBER;
- long_long_value = (long long int)sint8korr(current_key);
- data_size = 8;
- break;
-#endif
-#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
- case MYSQL_TYPE_DATETIME2:
- // TODO
- data_type = TYPE_LONG_LONG_NUMBER;
- long_long_value = (long long int)sint8korr(current_key);
- data_size = 8;
- break;
-#endif
-#ifdef MRN_HAVE_MYSQL_TYPE_TIME2
- case MYSQL_TYPE_TIME2:
- // TODO
- data_type = TYPE_LONG_LONG_NUMBER;
- long_long_value = (long long int)sint8korr(current_key);
- data_size = 8;
- break;
-#endif
- case MYSQL_TYPE_NEWDECIMAL:
- data_type = TYPE_BYTE_SEQUENCE;
- data_size = key_part.length;
- break;
- case MYSQL_TYPE_ENUM:
- // TODO
- data_type = TYPE_NUMBER;
- data_size = 1;
- break;
- case MYSQL_TYPE_SET:
- // TODO
- data_type = TYPE_NUMBER;
- data_size = 1;
- break;
- case MYSQL_TYPE_TINY_BLOB:
- case MYSQL_TYPE_MEDIUM_BLOB:
- case MYSQL_TYPE_LONG_BLOB:
- case MYSQL_TYPE_BLOB:
- // TODO
- data_type = TYPE_BYTE_SEQUENCE;
- data_size = HA_KEY_BLOB_LENGTH + key_part.length;
- break;
- case MYSQL_TYPE_VAR_STRING:
- case MYSQL_TYPE_STRING:
- // TODO
- data_type = TYPE_BYTE_SEQUENCE;
- data_size = key_part.length;
- break;
- case MYSQL_TYPE_GEOMETRY:
- // TODO
- data_type = TYPE_BYTE_SEQUENCE;
- data_size = key_part.length;
- break;
- }
-
- switch (data_type) {
- case TYPE_LONG_LONG_NUMBER:
- if (decode)
- *((uint8_t *)(&long_long_value)) ^= 0x80;
- mrn_byte_order_host_to_network(current_buffer, &long_long_value,
- data_size);
- if (!decode)
- *((uint8_t *)(current_buffer)) ^= 0x80;
- break;
- case TYPE_NUMBER:
- if (decode)
- {
- Field_num *number_field = (Field_num *)field;
- if (!number_field->unsigned_flag) {
- *((uint8_t *)(current_key)) ^= 0x80;
- }
- }
- mrn_byte_order_host_to_network(current_buffer, current_key, data_size);
- if (!decode)
- {
- Field_num *number_field = (Field_num *)field;
- if (!number_field->unsigned_flag) {
- *((uint8_t *)(current_buffer)) ^= 0x80;
- }
- }
- break;
- case TYPE_FLOAT:
- {
- int n_bits = (data_size * 8 - 1);
- int_value = *((int *)(&float_value));
- if (!decode)
- int_value ^= ((int_value >> n_bits) | (1 << n_bits));
- mrn_byte_order_host_to_network(current_buffer, &int_value, data_size);
- if (decode) {
- int_value = *((int *)current_buffer);
- *((int *)current_buffer) =
- int_value ^ (((int_value ^ (1 << n_bits)) >> n_bits) |
- (1 << n_bits));
- }
- }
- break;
- case TYPE_DOUBLE:
- {
- int n_bits = (data_size * 8 - 1);
- long_long_value = *((long long int *)(&double_value));
- if (!decode)
- long_long_value ^= ((long_long_value >> n_bits) | (1LL << n_bits));
- mrn_byte_order_host_to_network(current_buffer, &long_long_value,
- data_size);
- if (decode) {
- long_long_value = *((long long int *)current_buffer);
- *((long long int *)current_buffer) =
- long_long_value ^ (((long_long_value ^ (1LL << n_bits)) >> n_bits) |
- (1LL << n_bits));
- }
- }
- break;
- case TYPE_BYTE_SEQUENCE:
- memcpy(current_buffer, current_key, data_size);
- break;
- }
-
- current_key += data_size;
- current_buffer += data_size;
- *encoded_length += data_size;
- }
-
- return buffer;
-}
-
static long long int mrn_tm_to_grn_time(struct tm *time, int usec)
{
MRN_DBUG_ENTER_FUNCTION();
@@ -4322,7 +4096,7 @@ int ha_mroonga::storage_write_row(uchar *buf)
}
}
- void *pkey = NULL;
+ uchar *pkey = NULL;
int pkey_size = 0;
uint pkey_nr = table->s->primary_key;
GRN_BULK_REWIND(&key_buffer);
@@ -4338,18 +4112,18 @@ int ha_mroonga::storage_write_row(uchar *buf)
DBUG_RETURN(error);
}
generic_store_bulk(pkey_field, &key_buffer);
- pkey = GRN_TEXT_VALUE(&key_buffer);
+ pkey = (uchar *)(GRN_TEXT_VALUE(&key_buffer));
pkey_size = GRN_TEXT_LEN(&key_buffer);
} else {
mrn_change_encoding(ctx, NULL);
uchar key[MRN_MAX_KEY_SIZE];
key_copy(key, buf, &key_info, key_info.key_length);
grn_bulk_space(ctx, &key_buffer, key_info.key_length);
- pkey = mrn_multiple_column_key_encode(&key_info,
- key,
- key_info.key_length,
- (uchar *)(GRN_TEXT_VALUE(&key_buffer)),
- (uint *)&pkey_size, FALSE);
+ pkey = (uchar *)(GRN_TEXT_VALUE(&key_buffer));
+ storage_encode_multiple_column_key(&key_info,
+ key, key_info.key_length,
+ pkey, (uint *)&pkey_size,
+ FALSE);
}
}
@@ -4483,11 +4257,11 @@ int ha_mroonga::storage_write_row_index(uchar *buf, grn_id record_id,
GRN_BULK_REWIND(&encoded_key_buffer);
grn_bulk_space(ctx, &encoded_key_buffer, key_info->key_length);
uint encoded_key_length;
- mrn_multiple_column_key_encode(key_info,
- (uchar *)(GRN_TEXT_VALUE(&key_buffer)),
- key_info->key_length,
- (uchar *)(GRN_TEXT_VALUE(&encoded_key_buffer)),
- &encoded_key_length, FALSE);
+ storage_encode_multiple_column_key(key_info,
+ (uchar *)(GRN_TEXT_VALUE(&key_buffer)),
+ key_info->key_length,
+ (uchar *)(GRN_TEXT_VALUE(&encoded_key_buffer)),
+ &encoded_key_length, FALSE);
grn_rc rc;
rc = grn_column_index_update(ctx, index_column, record_id, 1, NULL,
@@ -4561,12 +4335,11 @@ int ha_mroonga::storage_write_row_unique_index(uchar *buf, grn_id record_id,
uchar key[MRN_MAX_KEY_SIZE];
key_copy(key, buf, key_info, key_info->key_length);
grn_bulk_space(ctx, &key_buffer, key_info->key_length);
- ukey = mrn_multiple_column_key_encode(key_info,
- key,
- key_info->key_length,
- (uchar *)(GRN_TEXT_VALUE(
- &key_buffer)),
- (uint *)&ukey_size, FALSE);
+ ukey = GRN_TEXT_VALUE(&key_buffer);
+ storage_encode_multiple_column_key(key_info,
+ key, key_info->key_length,
+ (uchar *)(ukey), (uint *)&ukey_size,
+ FALSE);
}
int added;
@@ -5028,11 +4801,12 @@ int ha_mroonga::storage_update_row_index(const uchar *old_data, uchar *new_data)
GRN_BULK_REWIND(&old_encoded_key);
grn_bulk_space(ctx, &old_encoded_key, key_info.key_length);
uint old_encoded_key_length;
- mrn_multiple_column_key_encode(&key_info,
- (uchar *)(GRN_TEXT_VALUE(&old_key)),
- key_info.key_length,
- (uchar *)(GRN_TEXT_VALUE(&old_encoded_key)),
- &old_encoded_key_length, FALSE);
+ storage_encode_multiple_column_key(&key_info,
+ (uchar *)(GRN_TEXT_VALUE(&old_key)),
+ key_info.key_length,
+ (uchar *)(GRN_TEXT_VALUE(&old_encoded_key)),
+ &old_encoded_key_length,
+ FALSE);
GRN_BULK_REWIND(&new_key);
grn_bulk_space(ctx, &new_key, key_info.key_length);
@@ -5043,11 +4817,12 @@ int ha_mroonga::storage_update_row_index(const uchar *old_data, uchar *new_data)
GRN_BULK_REWIND(&new_encoded_key);
grn_bulk_space(ctx, &new_encoded_key, key_info.key_length);
uint new_encoded_key_length;
- mrn_multiple_column_key_encode(&key_info,
- (uchar *)(GRN_TEXT_VALUE(&new_key)),
- key_info.key_length,
- (uchar *)(GRN_TEXT_VALUE(&new_encoded_key)),
- &new_encoded_key_length, FALSE);
+ storage_encode_multiple_column_key(&key_info,
+ (uchar *)(GRN_TEXT_VALUE(&new_key)),
+ key_info.key_length,
+ (uchar *)(GRN_TEXT_VALUE(&new_encoded_key)),
+ &new_encoded_key_length,
+ FALSE);
grn_obj *index_column = grn_index_columns[i];
grn_rc rc;
@@ -5305,11 +5080,12 @@ int ha_mroonga::storage_delete_row_index(const uchar *buf)
GRN_BULK_REWIND(&encoded_key);
grn_bulk_space(ctx, &encoded_key, key_info.key_length);
uint encoded_key_length;
- mrn_multiple_column_key_encode(&key_info,
- (uchar *)(GRN_TEXT_VALUE(&key)),
- key_info.key_length,
- (uchar *)(GRN_TEXT_VALUE(&encoded_key)),
- &encoded_key_length, FALSE);
+ storage_encode_multiple_column_key(&key_info,
+ (uchar *)(GRN_TEXT_VALUE(&key)),
+ key_info.key_length,
+ (uchar *)(GRN_TEXT_VALUE(&encoded_key)),
+ &encoded_key_length,
+ FALSE);
grn_obj *index_column = grn_index_columns[i];
grn_rc rc;
@@ -5387,12 +5163,11 @@ int ha_mroonga::storage_prepare_delete_row_unique_index(const uchar *buf,
uchar key[MRN_MAX_KEY_SIZE];
key_copy(key, (uchar *) buf, key_info, key_info->key_length);
grn_bulk_space(ctx, &key_buffer, key_info->key_length);
- ukey = mrn_multiple_column_key_encode(key_info,
- key,
- key_info->key_length,
- (uchar *)(GRN_TEXT_VALUE(
- &key_buffer)),
- (uint *)&ukey_size, FALSE);
+ ukey = GRN_TEXT_VALUE(&key_buffer);
+ storage_encode_multiple_column_key(key_info,
+ key, key_info->key_length,
+ (uchar *)ukey, (uint *)&ukey_size,
+ FALSE);
}
*del_key_id = grn_table_get(ctx, index_table, ukey, ukey_size);
DBUG_RETURN(0);
@@ -5503,7 +5278,7 @@ ha_rows ha_mroonga::storage_records_in_range(uint key_nr, key_range *range_min,
int flags = 0;
uint size_min = 0, size_max = 0;
ha_rows row_count = 0;
- const void *val_min = NULL, *val_max = NULL;
+ uchar *val_min = NULL, *val_max = NULL;
KEY key_info = table->s->key_info[key_nr];
bool is_multiple_column_index = key_info.key_parts > 1;
@@ -5513,25 +5288,25 @@ ha_rows ha_mroonga::storage_records_in_range(uint key_nr, key_range *range_min,
range_min->length == range_max->length &&
memcmp(range_min->key, range_max->key, range_min->length) == 0) {
flags |= GRN_CURSOR_PREFIX;
- val_min = mrn_multiple_column_key_encode(&key_info,
- range_min->key,
- range_min->length,
- key_min[key_nr],
- &size_min, FALSE);
+ val_min = key_min[key_nr];
+ storage_encode_multiple_column_key(&key_info,
+ range_min->key, range_min->length,
+ val_min, &size_min,
+ FALSE);
} else {
if (range_min) {
- val_min = mrn_multiple_column_key_encode(&key_info,
- range_min->key,
- range_min->length,
- key_min[key_nr],
- &size_min, FALSE);
+ val_min = key_min[key_nr];
+ storage_encode_multiple_column_key(&key_info,
+ range_min->key, range_min->length,
+ val_min, &size_min,
+ FALSE);
}
if (range_max) {
- val_max = mrn_multiple_column_key_encode(&key_info,
- range_max->key,
- range_max->length,
- key_max[key_nr],
- &size_max, FALSE);
+ val_max = key_max[key_nr];
+ storage_encode_multiple_column_key(&key_info,
+ range_max->key, range_max->length,
+ val_max, &size_max,
+ FALSE);
}
}
} else if (mrn_is_geo_key(&key_info)) {
@@ -5773,7 +5548,7 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key,
KEY key_info = table->key_info[key_nr];
int flags = 0;
uint size_min = 0, size_max = 0;
- const void *val_min = NULL, *val_max = NULL;
+ uchar *val_min = NULL, *val_max = NULL;
clear_cursor();
clear_cursor_geo();
@@ -5783,10 +5558,11 @@ int ha_mroonga::storage_index_read_map(uchar *buf, const uchar *key,
mrn_change_encoding(ctx, NULL);
flags |= GRN_CURSOR_PREFIX;
uint key_length = calculate_key_len(table, active_index, key, keypart_map);
- val_min = mrn_multiple_column_key_encode(&key_info,
- key, key_length,
- key_min[active_index], &size_min,
- FALSE);
+ val_min = key_min[active_index];
+ storage_encode_multiple_column_key(&key_info,
+ key, key_length,
+ val_min, &size_min,
+ FALSE);
} else if (mrn_is_geo_key(&key_info)) {
error = mrn_change_encoding(ctx, key_info.key_part->field->charset());
if (error)
@@ -5917,7 +5693,7 @@ int ha_mroonga::storage_index_read_last_map(uchar *buf, const uchar *key,
int flags = GRN_CURSOR_DESCENDING, error;
uint size_min = 0, size_max = 0;
- const void *val_min = NULL, *val_max = NULL;
+ uchar *val_min = NULL, *val_max = NULL;
clear_cursor();
@@ -5926,10 +5702,11 @@ int ha_mroonga::storage_index_read_last_map(uchar *buf, const uchar *key,
mrn_change_encoding(ctx, NULL);
flags |= GRN_CURSOR_PREFIX;
uint key_length = calculate_key_len(table, active_index, key, keypart_map);
- val_min = mrn_multiple_column_key_encode(&key_info,
- key, key_length,
- key_min[key_nr], &size_min,
- FALSE);
+ val_min = key_min[key_nr];
+ storage_encode_multiple_column_key(&key_info,
+ key, key_length,
+ val_min, &size_min,
+ FALSE);
} else {
KEY_PART_INFO key_part = key_info.key_part[0];
Field *field = key_part.field;
@@ -6283,7 +6060,7 @@ int ha_mroonga::storage_read_range_first(const key_range *start_key,
end_key ? end_key->keypart_map : 0, FALSE);
int flags = 0, error;
uint size_min = 0, size_max = 0;
- const void *val_min = NULL, *val_max = NULL;
+ uchar *val_min = NULL, *val_max = NULL;
KEY key_info = table->s->key_info[active_index];
clear_cursor();
@@ -6295,25 +6072,25 @@ int ha_mroonga::storage_read_range_first(const key_range *start_key,
start_key->length == end_key->length &&
memcmp(start_key->key, end_key->key, start_key->length) == 0) {
flags |= GRN_CURSOR_PREFIX;
- val_min = mrn_multiple_column_key_encode(&key_info,
- start_key->key,
- start_key->length,
- key_min[active_index],
- &size_min, FALSE);
+ val_min = key_min[active_index];
+ storage_encode_multiple_column_key(&key_info,
+ start_key->key, start_key->length,
+ val_min, &size_min,
+ FALSE);
} else {
if (start_key) {
- val_min = mrn_multiple_column_key_encode(&key_info,
- start_key->key,
- start_key->length,
- key_min[active_index],
- &size_min, FALSE);
+ val_min = key_min[active_index];
+ storage_encode_multiple_column_key(&key_info,
+ start_key->key, start_key->length,
+ val_min, &size_min,
+ FALSE);
}
if (end_key) {
- val_max = mrn_multiple_column_key_encode(&key_info,
- end_key->key,
- end_key->length,
- key_max[active_index],
- &size_max, FALSE);
+ val_max = key_max[active_index];
+ storage_encode_multiple_column_key(&key_info,
+ end_key->key, end_key->length,
+ val_max, &size_max,
+ FALSE);
}
}
} else {
@@ -8564,11 +8341,10 @@ void ha_mroonga::storage_store_fields_by_index(uchar *buf)
} else {
uchar enc_buf[MAX_KEY_LENGTH];
uint enc_len;
- mrn_multiple_column_key_encode(key_info,
- (uchar *)key,
- key_length,
- enc_buf,
- &enc_len, TRUE);
+ storage_encode_multiple_column_key(key_info,
+ (uchar *)key, key_length,
+ enc_buf, &enc_len,
+ TRUE);
key_restore(buf, enc_buf, key_info, enc_len);
}
DBUG_VOID_RETURN;
@@ -8803,6 +8579,235 @@ int ha_mroonga::storage_encode_key(Field *field, const uchar *key,
DBUG_RETURN(error);
}
+int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info,
+ const uchar *key,
+ uint key_length,
+ uchar *buffer,
+ uint *encoded_length,
+ bool decode)
+{
+ MRN_DBUG_ENTER_METHOD();
+ int error = 0;
+ const uchar *current_key = key;
+ const uchar *key_end = key + key_length;
+ uchar *current_buffer = buffer;
+
+ int n_key_parts = key_info->key_parts;
+ *encoded_length = 0;
+ for (int i = 0; i < n_key_parts && current_key < key_end; i++) {
+ KEY_PART_INFO key_part = key_info->key_part[i];
+ Field *field = key_part.field;
+
+ if (field->null_bit) {
+ *current_buffer = *current_key;
+ current_key += 1;
+ current_buffer += 1;
+ (*encoded_length)++;
+ }
+
+ enum {
+ TYPE_LONG_LONG_NUMBER,
+ TYPE_NUMBER,
+ TYPE_FLOAT,
+ TYPE_DOUBLE,
+ TYPE_BYTE_SEQUENCE
+ } data_type;
+ uint32 data_size;
+ int int_value;
+ long long int long_long_value;
+ float float_value;
+ double double_value;
+ switch (field->real_type()) {
+ case MYSQL_TYPE_DECIMAL:
+ data_type = TYPE_BYTE_SEQUENCE;
+ data_size = key_part.length;
+ break;
+ case MYSQL_TYPE_TINY:
+ data_type = TYPE_NUMBER;
+ data_size = 1;
+ break;
+ case MYSQL_TYPE_SHORT:
+ data_type = TYPE_NUMBER;
+ data_size = 2;
+ break;
+ case MYSQL_TYPE_LONG:
+ data_type = TYPE_NUMBER;
+ data_size = 4;
+ break;
+ case MYSQL_TYPE_FLOAT:
+ data_type = TYPE_FLOAT;
+ data_size = 4;
+ float4get(float_value, current_key);
+ break;
+ case MYSQL_TYPE_DOUBLE:
+ data_type = TYPE_DOUBLE;
+ data_size = 8;
+ float8get(double_value, current_key);
+ break;
+ case MYSQL_TYPE_NULL:
+ data_type = TYPE_NUMBER;
+ data_size = 1;
+ break;
+ case MYSQL_TYPE_TIMESTAMP:
+ // TODO
+ data_type = TYPE_BYTE_SEQUENCE;
+ data_size = key_part.length;
+ break;
+ case MYSQL_TYPE_LONGLONG:
+ data_type = TYPE_NUMBER;
+ data_size = 8;
+ break;
+ case MYSQL_TYPE_INT24:
+ data_type = TYPE_NUMBER;
+ data_size = 3;
+ break;
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_TIME:
+ case MYSQL_TYPE_DATETIME:
+ case MYSQL_TYPE_YEAR:
+ case MYSQL_TYPE_NEWDATE:
+ data_type = TYPE_LONG_LONG_NUMBER;
+ long_long_value = (long long int)sint8korr(current_key);
+ data_size = 8;
+ break;
+ case MYSQL_TYPE_VARCHAR:
+ data_type = TYPE_BYTE_SEQUENCE;
+ data_size = HA_KEY_BLOB_LENGTH + key_part.length;
+ break;
+ case MYSQL_TYPE_BIT:
+ // TODO
+ data_type = TYPE_NUMBER;
+ data_size = 1;
+ break;
+#ifdef MRN_HAVE_MYSQL_TYPE_TIMESTAMP2
+ case MYSQL_TYPE_TIMESTAMP2:
+ // TODO
+ data_type = TYPE_LONG_LONG_NUMBER;
+ long_long_value = (long long int)sint8korr(current_key);
+ data_size = 8;
+ break;
+#endif
+#ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2
+ case MYSQL_TYPE_DATETIME2:
+ // TODO
+ data_type = TYPE_LONG_LONG_NUMBER;
+ long_long_value = (long long int)sint8korr(current_key);
+ data_size = 8;
+ break;
+#endif
+#ifdef MRN_HAVE_MYSQL_TYPE_TIME2
+ case MYSQL_TYPE_TIME2:
+ // TODO
+ data_type = TYPE_LONG_LONG_NUMBER;
+ long_long_value = (long long int)sint8korr(current_key);
+ data_size = 8;
+ break;
+#endif
+ case MYSQL_TYPE_NEWDECIMAL:
+ data_type = TYPE_BYTE_SEQUENCE;
+ data_size = key_part.length;
+ break;
+ case MYSQL_TYPE_ENUM:
+ // TODO
+ data_type = TYPE_NUMBER;
+ data_size = 1;
+ break;
+ case MYSQL_TYPE_SET:
+ // TODO
+ data_type = TYPE_NUMBER;
+ data_size = 1;
+ break;
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ // TODO
+ data_type = TYPE_BYTE_SEQUENCE;
+ data_size = HA_KEY_BLOB_LENGTH + key_part.length;
+ break;
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_STRING:
+ // TODO
+ data_type = TYPE_BYTE_SEQUENCE;
+ data_size = key_part.length;
+ break;
+ case MYSQL_TYPE_GEOMETRY:
+ // TODO
+ data_type = TYPE_BYTE_SEQUENCE;
+ data_size = key_part.length;
+ break;
+ }
+
+ switch (data_type) {
+ case TYPE_LONG_LONG_NUMBER:
+ if (decode)
+ *((uint8_t *)(&long_long_value)) ^= 0x80;
+ mrn_byte_order_host_to_network(current_buffer, &long_long_value,
+ data_size);
+ if (!decode)
+ *((uint8_t *)(current_buffer)) ^= 0x80;
+ break;
+ case TYPE_NUMBER:
+ if (decode)
+ {
+ Field_num *number_field = (Field_num *)field;
+ if (!number_field->unsigned_flag) {
+ *((uint8_t *)(current_key)) ^= 0x80;
+ }
+ }
+ mrn_byte_order_host_to_network(current_buffer, current_key, data_size);
+ if (!decode)
+ {
+ Field_num *number_field = (Field_num *)field;
+ if (!number_field->unsigned_flag) {
+ *((uint8_t *)(current_buffer)) ^= 0x80;
+ }
+ }
+ break;
+ case TYPE_FLOAT:
+ {
+ int n_bits = (data_size * 8 - 1);
+ int_value = *((int *)(&float_value));
+ if (!decode)
+ int_value ^= ((int_value >> n_bits) | (1 << n_bits));
+ mrn_byte_order_host_to_network(current_buffer, &int_value, data_size);
+ if (decode) {
+ int_value = *((int *)current_buffer);
+ *((int *)current_buffer) =
+ int_value ^ (((int_value ^ (1 << n_bits)) >> n_bits) |
+ (1 << n_bits));
+ }
+ }
+ break;
+ case TYPE_DOUBLE:
+ {
+ int n_bits = (data_size * 8 - 1);
+ long_long_value = *((long long int *)(&double_value));
+ if (!decode)
+ long_long_value ^= ((long_long_value >> n_bits) | (1LL << n_bits));
+ mrn_byte_order_host_to_network(current_buffer, &long_long_value,
+ data_size);
+ if (decode) {
+ long_long_value = *((long long int *)current_buffer);
+ *((long long int *)current_buffer) =
+ long_long_value ^ (((long_long_value ^ (1LL << n_bits)) >> n_bits) |
+ (1LL << n_bits));
+ }
+ }
+ break;
+ case TYPE_BYTE_SEQUENCE:
+ memcpy(current_buffer, current_key, data_size);
+ break;
+ }
+
+ current_key += data_size;
+ current_buffer += data_size;
+ *encoded_length += data_size;
+ }
+
+ DBUG_RETURN(error);
+}
+
int ha_mroonga::wrapper_reset()
{
int error = 0;
Modified: ha_mroonga.h (+4 -0)
===================================================================
--- ha_mroonga.h 2012-02-26 23:55:40 +0900 (a0b06ee)
+++ ha_mroonga.h 2012-02-27 00:27:03 +0900 (6a4fd3f)
@@ -516,6 +516,10 @@ private:
uchar *buf, uint *size);
#endif
int storage_encode_key(Field *field, const uchar *key, uchar *buf, uint *size);
+ int storage_encode_multiple_column_key(KEY *key_info,
+ const uchar *key, uint key_length,
+ uchar *buffer, uint *encoded_length,
+ bool decode);
void set_pk_bitmap();
int wrapper_create(const char *name, TABLE *table,