null+****@clear*****
null+****@clear*****
2012年 2月 18日 (土) 08:48:01 JST
Kentoku 2012-02-18 08:48:01 +0900 (Sat, 18 Feb 2012)
New Revision: 449f87a3eb6d0132b79a3790d52bf8750785e78f
Log:
Change encoding rules for table name and index name. refs #1284
Modified files:
ha_mroonga.cc
mrn_sys.c
mrn_sys.h
mrn_table.cc
mrn_table.h
test/unit/test_mrn_sys.c
Modified: ha_mroonga.cc (+68 -110)
===================================================================
--- ha_mroonga.cc 2012-02-17 17:25:39 +0900 (43a49d7)
+++ ha_mroonga.cc 2012-02-18 08:48:01 +0900 (f1f8692)
@@ -314,6 +314,17 @@ static int mrn_change_encoding(grn_ctx *ctx, const CHARSET_INFO *charset)
DBUG_RETURN(ER_MRN_CHARSET_NOT_SUPPORT_NUM);
}
+static char *mrn_index_table_name_create(const char *table_name,
+ const char *index_name,
+ char *dest)
+{
+ char encode_name[MRN_MAX_PATH_SIZE];
+ DBUG_ENTER("mrn_index_table_name_create");
+ mrn_encode(encode_name, encode_name + MRN_MAX_PATH_SIZE,
+ index_name, index_name + strlen(index_name));
+ DBUG_RETURN(mrn_index_table_name_gen(table_name, encode_name, dest));
+}
+
#if !defined(DBUG_OFF) && !defined(_lint)
static const char *mrn_inspect_thr_lock_type(enum thr_lock_type lock_type)
{
@@ -2096,7 +2107,7 @@ int ha_mroonga::wrapper_create_index_fulltext(grn_obj *grn_table,
DBUG_RETURN(error);
char index_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(grn_table_name, key_info->name, index_name);
+ mrn_index_table_name_create(grn_table_name, key_info->name, index_name);
grn_obj_flags index_table_flags =
GRN_OBJ_TABLE_PAT_KEY |
@@ -2168,7 +2179,7 @@ int ha_mroonga::wrapper_create_index_geo(grn_obj *grn_table,
DBUG_RETURN(error);
char index_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(grn_table_name, key_info->name, index_name);
+ mrn_index_table_name_create(grn_table_name, key_info->name, index_name);
grn_obj_flags index_table_flags =
GRN_OBJ_TABLE_PAT_KEY |
@@ -2222,12 +2233,7 @@ int ha_mroonga::wrapper_create_index(const char *name, TABLE *table,
grn_obj *grn_table;
char grn_table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
- mrn_table_name_gen(name, decode_src_name);
- mrn_decode((uchar *) grn_table_name,
- (uchar *) grn_table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(name, grn_table_name);
char *grn_table_path = NULL; // we don't specify path
grn_obj *pkey_type = grn_ctx_at(ctx, GRN_DB_SHORT_TEXT);
grn_obj *pkey_value_type = NULL; // we don't use this
@@ -2345,12 +2351,7 @@ int ha_mroonga::storage_create(const char *name, TABLE *table,
/* create table */
grn_obj *table_obj;
char table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
- mrn_table_name_gen(name, decode_src_name);
- mrn_decode((uchar *) table_name,
- (uchar *) table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(name, table_name);
int table_name_len = strlen(table_name);
char *table_path = NULL; // we don't specify path
@@ -2494,7 +2495,8 @@ int ha_mroonga::storage_create_index(TABLE *table, const char *grn_table_name,
if (error)
DBUG_RETURN(error);
- mrn_index_table_name_gen(grn_table_name, key_info->name, index_table_name);
+ mrn_index_table_name_create(grn_table_name, key_info->name,
+ index_table_name);
int key_parts = key_info->key_parts;
grn_obj_flags index_table_flags = GRN_OBJ_PERSISTENT;
@@ -2912,12 +2914,7 @@ int ha_mroonga::wrapper_open_indexes(const char *name, bool ignore_open_error)
}
char table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
- mrn_table_name_gen(name, decode_src_name);
- mrn_decode((uchar *) table_name,
- (uchar *) table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(name, table_name);
uint i = 0;
for (i = 0; i < n_keys; i++) {
KEY key_info = table->s->key_info[i];
@@ -2939,7 +2936,7 @@ int ha_mroonga::wrapper_open_indexes(const char *name, bool ignore_open_error)
}
char index_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(table_name, key_info.name, index_name);
+ mrn_index_table_name_create(table_name, key_info.name, index_name);
grn_index_tables[i] = grn_ctx_get(ctx, index_name, strlen(index_name));
if (ctx->rc) {
DBUG_PRINT("info",
@@ -3106,12 +3103,7 @@ int ha_mroonga::open_table(const char *name)
DBUG_RETURN(error);
char table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
- mrn_table_name_gen(name, decode_src_name);
- mrn_decode((uchar *) table_name,
- (uchar *) table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(name, table_name);
grn_table = grn_ctx_get(ctx, table_name, strlen(table_name));
if (ctx->rc) {
error = ER_CANT_OPEN_FILE;
@@ -3186,12 +3178,7 @@ int ha_mroonga::storage_open_indexes(const char *name)
}
char table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
- mrn_table_name_gen(name, decode_src_name);
- mrn_decode((uchar *) table_name,
- (uchar *) table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(name, table_name);
uint i;
for (i = 0; i < n_keys; i++) {
key_min[i] = (uchar *)malloc(MRN_MAX_KEY_SIZE);
@@ -3203,7 +3190,7 @@ int ha_mroonga::storage_open_indexes(const char *name)
}
KEY key_info = table->s->key_info[i];
- mrn_index_table_name_gen(table_name, key_info.name, index_name);
+ mrn_index_table_name_create(table_name, key_info.name, index_name);
grn_index_tables[i] = grn_ctx_get(ctx, index_name, strlen(index_name));
if (ctx->rc) {
error = ER_CANT_OPEN_FILE;
@@ -3339,18 +3326,21 @@ int ha_mroonga::close()
if (is_temporary_table_name(share->table_name)) {
char db_name[MRN_MAX_PATH_SIZE];
char table_name[MRN_MAX_PATH_SIZE];
+ char mysql_table_name[MRN_MAX_PATH_SIZE];
TABLE_LIST table_list;
TABLE_SHARE *tmp_table_share;
int tmp_error;
/* no need to decode */
mrn_db_name_gen(share->table_name, db_name);
mrn_table_name_gen(share->table_name, table_name);
+ mrn_table_name_gen_for_mysql(share->table_name, mysql_table_name);
#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS
table_list.init_one_table(db_name, strlen(db_name),
- table_name, strlen(table_name), table_name,
+ mysql_table_name, strlen(mysql_table_name),
+ mysql_table_name,
TL_WRITE);
#else
- table_list.init_one_table(db_name, table_name, TL_WRITE);
+ table_list.init_one_table(db_name, mysql_table_name, TL_WRITE);
#endif
mrn_open_mutex_lock();
tmp_table_share =
@@ -3436,8 +3426,8 @@ int ha_mroonga::wrapper_delete_index(const char *name, MRN_SHARE *tmp_share,
uint i;
for (i = 0; i < tmp_table_share->keys; i++) {
char index_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(table_name, tmp_table_share->key_info[i].name,
- index_name);
+ mrn_index_table_name_create(table_name, tmp_table_share->key_info[i].name,
+ index_name);
grn_obj *index_table = grn_ctx_get(ctx, index_name, strlen(index_name));
if (index_table != NULL) {
grn_obj_remove(ctx, index_table);
@@ -3472,8 +3462,8 @@ int ha_mroonga::storage_delete_table(const char *name, MRN_SHARE *tmp_share,
uint i;
for (i = 0; i < tmp_table_share->keys; i++) {
- mrn_index_table_name_gen(table_name, tmp_table_share->key_info[i].name,
- index_name);
+ mrn_index_table_name_create(table_name, tmp_table_share->key_info[i].name,
+ index_name);
grn_obj *idx_table_obj = grn_ctx_get(ctx, index_name, strlen(index_name));
if (idx_table_obj != NULL) {
grn_obj_remove(ctx, idx_table_obj);
@@ -3496,7 +3486,7 @@ int ha_mroonga::delete_table(const char *name)
THD *thd = ha_thd();
char db_name[MRN_MAX_PATH_SIZE];
char table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
+ char mysql_table_name[MRN_MAX_PATH_SIZE];
TABLE_LIST table_list;
TABLE_SHARE *tmp_table_share = NULL;
TABLE tmp_table;
@@ -3504,11 +3494,8 @@ int ha_mroonga::delete_table(const char *name)
st_mrn_alter_share *alter_share, *tmp_alter_share;
MRN_DBUG_ENTER_METHOD();
mrn_db_name_gen(name, db_name);
- mrn_table_name_gen(name, decode_src_name);
- mrn_decode((uchar *) table_name,
- (uchar *) table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(name, table_name);
+ mrn_table_name_gen_for_mysql(name, mysql_table_name);
st_mrn_slot_data *slot_data = mrn_get_slot_data(thd, FALSE);
if (slot_data && slot_data->first_alter_share)
{
@@ -3535,11 +3522,11 @@ int ha_mroonga::delete_table(const char *name)
{
#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS
table_list.init_one_table(db_name, strlen(db_name),
- decode_src_name, strlen(decode_src_name),
- decode_src_name,
+ mysql_table_name, strlen(mysql_table_name),
+ mysql_table_name,
TL_WRITE);
#else
- table_list.init_one_table(db_name, decode_src_name, TL_WRITE);
+ table_list.init_one_table(db_name, mysql_table_name, TL_WRITE);
#endif
mrn_open_mutex_lock();
tmp_table_share = mrn_create_tmp_table_share(&table_list, name, &error);
@@ -9182,12 +9169,12 @@ int ha_mroonga::wrapper_rename_index(const char *from, const char *to,
for (i = 0; i < tmp_table_share->keys; i++) {
char from_index_name[MRN_MAX_PATH_SIZE];
char to_index_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(from_table_name,
- tmp_table_share->key_info[i].name,
- from_index_name);
- mrn_index_table_name_gen(to_table_name,
- tmp_table_share->key_info[i].name,
- to_index_name);
+ mrn_index_table_name_create(from_table_name,
+ tmp_table_share->key_info[i].name,
+ from_index_name);
+ mrn_index_table_name_create(to_table_name,
+ tmp_table_share->key_info[i].name,
+ to_index_name);
grn_obj *index_table = grn_ctx_get(ctx, from_index_name,
strlen(from_index_name));
if (index_table != NULL) {
@@ -9238,10 +9225,12 @@ int ha_mroonga::storage_rename_table(const char *from, const char *to,
uint i;
for (i = 0; i < tmp_table_share->keys; i++) {
- mrn_index_table_name_gen(from_table_name, tmp_table_share->key_info[i].name,
- from_index_name);
- mrn_index_table_name_gen(to_table_name, tmp_table_share->key_info[i].name,
- to_index_name);
+ mrn_index_table_name_create(from_table_name,
+ tmp_table_share->key_info[i].name,
+ from_index_name);
+ mrn_index_table_name_create(to_table_name,
+ tmp_table_share->key_info[i].name,
+ to_index_name);
grn_obj *idx_table_obj = grn_ctx_get(ctx, from_index_name,
strlen(from_index_name));
if (idx_table_obj != NULL) {
@@ -9278,33 +9267,27 @@ int ha_mroonga::rename_table(const char *from, const char *to)
char to_db_name[MRN_MAX_PATH_SIZE];
char from_table_name[MRN_MAX_PATH_SIZE];
char to_table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
+ char from_mysql_table_name[MRN_MAX_PATH_SIZE];
TABLE_LIST table_list;
TABLE_SHARE *tmp_table_share;
TABLE tmp_table;
MRN_SHARE *tmp_share;
MRN_DBUG_ENTER_METHOD();
mrn_db_name_gen(to, to_db_name);
- mrn_table_name_gen(to, decode_src_name);
- mrn_decode((uchar *) to_table_name,
- (uchar *) to_table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(to, to_table_name);
mrn_db_name_gen(from, from_db_name);
- mrn_table_name_gen(from, decode_src_name);
- mrn_decode((uchar *) from_table_name,
- (uchar *) from_table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(from, from_table_name);
+ mrn_table_name_gen_for_mysql(from, from_mysql_table_name);
if (strcmp(from_db_name, to_db_name))
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
#ifdef MRN_TABLE_LIST_INIT_REQUIRE_ALIAS
table_list.init_one_table(from_db_name, strlen(from_db_name),
- decode_src_name, strlen(decode_src_name),
- decode_src_name, TL_WRITE);
+ from_mysql_table_name,
+ strlen(from_mysql_table_name),
+ from_mysql_table_name, TL_WRITE);
#else
- table_list.init_one_table(from_db_name, decode_src_name, TL_WRITE);
+ table_list.init_one_table(from_db_name, from_mysql_table_name, TL_WRITE);
#endif
mrn_open_mutex_lock();
tmp_table_share = mrn_create_tmp_table_share(&table_list, from, &error);
@@ -9516,14 +9499,9 @@ int ha_mroonga::wrapper_recreate_indexes(THD *thd)
*key_info = table->key_info;
char db_name[MRN_MAX_PATH_SIZE];
char table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
MRN_DBUG_ENTER_METHOD();
mrn_db_name_gen(table_share->normalized_path.str, db_name);
- mrn_table_name_gen(table_share->normalized_path.str, decode_src_name);
- mrn_decode((uchar *) table_name,
- (uchar *) table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(table_share->normalized_path.str, table_name);
bitmap_clear_all(table->read_set);
clear_indexes();
remove_grn_obj_force(table_name);
@@ -9534,8 +9512,8 @@ int ha_mroonga::wrapper_recreate_indexes(THD *thd)
}
char index_name[MRN_MAX_PATH_SIZE];
char index_column_full_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(table_name, table_share->key_info[i].name,
- index_name);
+ mrn_index_table_name_create(table_name, table_share->key_info[i].name,
+ index_name);
snprintf(index_column_full_name, MRN_MAX_PATH_SIZE,
"%s.%s", index_name, index_column_name);
remove_grn_obj_force(index_column_full_name);
@@ -9869,7 +9847,6 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
uint n_keys = table->s->keys;
grn_obj *index_tables[num_of_keys + n_keys];
char grn_table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
THD *thd = ha_thd();
MRN_SHARE *tmp_share;
TABLE_SHARE tmp_table_share;
@@ -9892,11 +9869,7 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
tmp_share->table_share = &tmp_table_share;
tmp_share->key_parser = key_parser;
tmp_share->key_parser_length = key_parser_length;
- mrn_table_name_gen(share->table_name, decode_src_name);
- mrn_decode((uchar *) grn_table_name,
- (uchar *) grn_table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(share->table_name, grn_table_name);
#ifdef MRN_HANDLER_HAVE_FINAL_ADD_INDEX
hnd_add_index = NULL;
#endif
@@ -10061,7 +10034,6 @@ int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info,
grn_obj *index_tables[num_of_keys + n_keys];
grn_obj *index_columns[num_of_keys + n_keys];
char grn_table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
MRN_SHARE *tmp_share;
TABLE_SHARE tmp_table_share;
char **key_parser;
@@ -10083,11 +10055,7 @@ int ha_mroonga::storage_add_index(TABLE *table_arg, KEY *key_info,
tmp_share->table_share = &tmp_table_share;
tmp_share->key_parser = key_parser;
tmp_share->key_parser_length = key_parser_length;
- mrn_table_name_gen(share->table_name, decode_src_name);
- mrn_decode((uchar *) grn_table_name,
- (uchar *) grn_table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(share->table_name, grn_table_name);
bitmap_clear_all(table->read_set);
for (i = 0; i < num_of_keys; i++) {
index_tables[i + n_keys] = NULL;
@@ -10269,17 +10237,12 @@ int ha_mroonga::wrapper_prepare_drop_index(TABLE *table_arg, uint *key_num,
uint wrap_key_num[num_of_keys], i, j;
KEY *key_info = table_share->key_info;
char grn_table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
MRN_DBUG_ENTER_METHOD();
res = mrn_change_encoding(ctx, system_charset_info);
if (res)
DBUG_RETURN(res);
- mrn_table_name_gen(share->table_name, decode_src_name);
- mrn_decode((uchar *) grn_table_name,
- (uchar *) grn_table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(share->table_name, grn_table_name);
for (i = 0, j = 0; i < num_of_keys; i++) {
if (!(key_info[key_num[i]].flags & HA_FULLTEXT) &&
!mrn_is_geo_key(&key_info[key_num[i]])) {
@@ -10289,8 +10252,8 @@ int ha_mroonga::wrapper_prepare_drop_index(TABLE *table_arg, uint *key_num,
}
char index_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(grn_table_name, key_info[key_num[i]].name,
- index_name);
+ mrn_index_table_name_create(grn_table_name, key_info[key_num[i]].name,
+ index_name);
grn_obj *index_table = grn_ctx_get(ctx, index_name, strlen(index_name));
if (index_table != NULL) {
grn_obj_remove(ctx, index_table);
@@ -10316,21 +10279,16 @@ int ha_mroonga::storage_prepare_drop_index(TABLE *table_arg, uint *key_num,
uint i;
KEY *key_info = table_share->key_info;
char grn_table_name[MRN_MAX_PATH_SIZE];
- char decode_src_name[MRN_MAX_PATH_SIZE];
MRN_DBUG_ENTER_METHOD();
error = mrn_change_encoding(ctx, system_charset_info);
if (error)
DBUG_RETURN(error);
- mrn_table_name_gen(share->table_name, decode_src_name);
- mrn_decode((uchar *) grn_table_name,
- (uchar *) grn_table_name + MRN_MAX_PATH_SIZE,
- (const uchar *) decode_src_name,
- (const uchar *) decode_src_name + strlen(decode_src_name));
+ mrn_table_name_gen(share->table_name, grn_table_name);
for (i = 0; i < num_of_keys; i++) {
char index_name[MRN_MAX_PATH_SIZE];
- mrn_index_table_name_gen(grn_table_name, key_info[key_num[i]].name,
- index_name);
+ mrn_index_table_name_create(grn_table_name, key_info[key_num[i]].name,
+ index_name);
grn_obj *index_table = grn_ctx_get(ctx, index_name, strlen(index_name));
if (index_table != NULL) {
grn_obj_remove(ctx, index_table);
Modified: mrn_sys.c (+26 -3)
===================================================================
--- mrn_sys.c 2012-02-17 17:25:39 +0900 (c31b953)
+++ mrn_sys.c 2012-02-18 08:48:01 +0900 (47e193c)
@@ -127,13 +127,36 @@ char *mrn_db_name_gen(const char *db_path_in_mysql, char *dest)
}
/**
- * "./${db}/${table}" ==> "${table}"
+ * "./${db}/${table}" ==> "${table}" (with encoding first '_')
*/
char *mrn_table_name_gen(const char *arg, char *dest)
{
int len = strlen(arg);
int i=len, j=0;
for (; arg[--i] != '/' ;) {}
+ if (arg[i + 1] == '_') {
+ dest[j++] = '@';
+ dest[j++] = '0';
+ dest[j++] = '0';
+ dest[j++] = '5';
+ dest[j++] = 'f';
+ i++;
+ }
+ for (; i <= len ;) {
+ dest[j++] = arg[++i];
+ }
+ dest[j] = '\0';
+ return dest;
+}
+
+/**
+ * "./${db}/${table}" ==> "${table}" (without encoding first '_')
+ */
+char *mrn_table_name_gen_for_mysql(const char *arg, char *dest)
+{
+ int len = strlen(arg);
+ int i=len, j=0;
+ for (; arg[--i] != '/' ;) {}
for (; i <= len ;) {
dest[j++] = arg[++i];
}
@@ -142,12 +165,12 @@ char *mrn_table_name_gen(const char *arg, char *dest)
}
/**
- * "${table}" ==> "${table}_${index_name}"
+ * "${table}" ==> "${table}#${index_name}"
*/
char *mrn_index_table_name_gen(const char *table_name,
const char *index_name,
char *dest)
{
- snprintf(dest, MRN_MAX_PATH_SIZE, "%s_%s", table_name, index_name);
+ snprintf(dest, MRN_MAX_PATH_SIZE, "%s#%s", table_name, index_name);
return dest;
}
Modified: mrn_sys.h (+1 -0)
===================================================================
--- mrn_sys.h 2012-02-17 17:25:39 +0900 (38b4b65)
+++ mrn_sys.h 2012-02-18 08:48:01 +0900 (a70c1f4)
@@ -52,6 +52,7 @@ int mrn_hash_remove(grn_ctx *ctx, grn_hash *hash, const char *key);
char *mrn_db_path_gen(const char *arg, char *dest);
char *mrn_db_name_gen(const char *arg, char *dest);
char *mrn_table_name_gen(const char *arg, char *dest);
+char *mrn_table_name_gen_for_mysql(const char *arg, char *dest);
char *mrn_index_table_name_gen(const char *arg, const char *idx_name, char *dest);
#endif /* _mrn_sys_h */
Modified: mrn_table.cc (+34 -2)
===================================================================
--- mrn_table.cc 2012-02-17 17:25:39 +0900 (397bee1)
+++ mrn_table.cc 2012-02-18 08:48:01 +0900 (f74584a)
@@ -857,10 +857,42 @@ void mrn_set_bitmap_by_key(MY_BITMAP *map, KEY *key_info)
DBUG_VOID_RETURN;
}
-uint mrn_decode(uchar *buf_st, uchar *buf_ed, const uchar *st, const uchar *ed)
+uint mrn_encode(char *buf_st, char *buf_ed, const char *st, const char *ed)
+{
+ int res1, res2;
+ char *buf = buf_st;
+ my_wc_t wc;
+ my_charset_conv_mb_wc mb_wc = system_charset_info->cset->mb_wc;
+ my_charset_conv_wc_mb wc_mb = my_charset_filename.cset->wc_mb;
+ DBUG_ENTER("mrn_encode");
+ DBUG_PRINT("info", ("mroonga: in=%s", st));
+ buf_ed--;
+ for (; st < ed && buf < buf_ed; st += res1, buf += res2)
+ {
+ if ((res1 = (*mb_wc)(NULL, &wc, (uchar *) st, (uchar *) ed)) > 0)
+ {
+ if ((res2 = (*wc_mb)(NULL, wc, (uchar *) buf, (uchar *) buf_ed)) <= 0)
+ {
+ break;
+ }
+ } else if (res1 == MY_CS_ILSEQ)
+ {
+ *buf = *st;
+ res1 = 1;
+ res2 = 1;
+ } else {
+ break;
+ }
+ }
+ *buf = '\0';
+ DBUG_PRINT("info", ("mroonga: out=%s", buf_st));
+ DBUG_RETURN(buf - buf_st);
+}
+
+uint mrn_decode(char *buf_st, char *buf_ed, const char *st, const char *ed)
{
int res;
- uchar *buf = buf_st;
+ char *buf = buf_st;
my_wc_t wc;
my_charset_conv_mb_wc mb_wc = my_charset_filename.cset->mb_wc;
DBUG_ENTER("mrn_decode");
Modified: mrn_table.h (+2 -2)
===================================================================
--- mrn_table.h 2012-02-17 17:25:39 +0900 (cf90947)
+++ mrn_table.h 2012-02-18 08:48:01 +0900 (4e6e166)
@@ -104,8 +104,8 @@ TABLE_SHARE *mrn_create_tmp_table_share(TABLE_LIST *table_list, const char *path
void mrn_free_tmp_table_share(TABLE_SHARE *table_share);
KEY *mrn_create_key_info_for_table(MRN_SHARE *share, TABLE *table, int *error);
void mrn_set_bitmap_by_key(MY_BITMAP *map, KEY *key_info);
-uint mrn_decode(uchar *buf_st, uchar *buf_ed,
- const uchar *st, const uchar *ed);
+uint mrn_encode(char *buf_st, char *buf_ed, const char *st, const char *ed);
+uint mrn_decode(char *buf_st, char *buf_ed, const char *st, const char *ed);
st_mrn_slot_data *mrn_get_slot_data(THD *thd, bool can_create);
void mrn_clear_alter_share(THD *thd);
Modified: test/unit/test_mrn_sys.c (+1 -1)
===================================================================
--- test/unit/test_mrn_sys.c 2012-02-17 17:25:39 +0900 (0314b66)
+++ test/unit/test_mrn_sys.c 2012-02-18 08:48:01 +0900 (74443a2)
@@ -143,6 +143,6 @@ void test_mrn_index_table_name_gen()
char buf[64], buf2[64];
const char *arg = "./db/users";
mrn_table_name_gen(arg, buf);
- cut_assert_equal_string("users_name",
+ cut_assert_equal_string("users#name",
mrn_index_table_name_gen(buf, "name", buf2));
}