[Groonga-mysql-commit] mroonga/mroonga [master] Supports '-' for table name. refs #1165

Back to archive index

null+****@clear***** null+****@clear*****
2011年 11月 22日 (火) 02:40:59 JST


Kentoku	2011-11-21 17:40:59 +0000 (Mon, 21 Nov 2011)

  New Revision: 2eb2e9c1b90970e72e6131a3bf6a792900e9fdf4

  Log:
    Supports '-' for table name. refs #1165

  Modified files:
    ha_mroonga.cc
    mrn_table.cc
    mrn_table.h

  Modified: ha_mroonga.cc (+65 -19)
===================================================================
--- ha_mroonga.cc    2011-11-21 09:56:54 +0000 (f4b6c5c)
+++ ha_mroonga.cc    2011-11-21 17:40:59 +0000 (7464da3)
@@ -382,8 +382,11 @@ static void mrn_drop_db(handlerton *hton, char *path)
 {
   char db_path[MRN_MAX_PATH_SIZE];
   char db_name[MRN_MAX_PATH_SIZE];
-  mrn_db_path_gen(path, db_path);
-  mrn_db_name_gen(path, db_name);
+  char decode_name[MRN_MAX_PATH_SIZE];
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) path, (const uchar *) path + strlen(path));
+  mrn_db_path_gen(decode_name, db_path);
+  mrn_db_name_gen(decode_name, db_name);
   grn_ctx *ctx;
   ctx = grn_ctx_open(0);
   struct stat dummy;
@@ -1648,7 +1651,10 @@ int ha_mroonga::wrapper_create_index(const char *name, TABLE *table,
 
   grn_obj *grn_table;
   char grn_table_name[MRN_MAX_PATH_SIZE];
-  mrn_table_name_gen(name, grn_table_name);
+  char decode_name[MRN_MAX_PATH_SIZE];
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_table_name_gen(decode_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
@@ -1757,7 +1763,10 @@ int ha_mroonga::storage_create(const char *name, TABLE *table,
   /* create table */
   grn_obj *tbl_obj;
   char tbl_name[MRN_MAX_PATH_SIZE];
-  mrn_table_name_gen(name, tbl_name);
+  char decode_name[MRN_MAX_PATH_SIZE];
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_table_name_gen(decode_name, tbl_name);
   int tbl_name_len = strlen(tbl_name);
 
   char *tbl_path = NULL;           // we don't specify path
@@ -2089,9 +2098,13 @@ int ha_mroonga::ensure_database_create(const char *name)
   grn_obj *db;
   char db_name[MRN_MAX_PATH_SIZE];
   char db_path[MRN_MAX_PATH_SIZE];
+  char decode_name[MRN_MAX_PATH_SIZE];
   struct stat db_stat;
-  mrn_db_name_gen(name, db_name);
-  mrn_db_path_gen(name, db_path);
+  mrn_decode((uchar *) decode_name,
+             (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_db_name_gen(decode_name, db_name);
+  mrn_db_path_gen(decode_name, db_path);
 
   pthread_mutex_lock(&mrn_db_mutex);
   if (mrn_hash_get(&mrn_ctx, mrn_hash, db_name, &db) != 0) {
@@ -2131,8 +2144,12 @@ int ha_mroonga::ensure_database_open(const char *name)
   grn_obj *db;
   char db_name[MRN_MAX_PATH_SIZE];
   char db_path[MRN_MAX_PATH_SIZE];
-  mrn_db_name_gen(name, db_name);
-  mrn_db_path_gen(name, db_path);
+  char decode_name[MRN_MAX_PATH_SIZE];
+  mrn_decode((uchar *) decode_name,
+             (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_db_name_gen(decode_name, db_name);
+  mrn_db_path_gen(decode_name, db_path);
 
   pthread_mutex_lock(&mrn_db_mutex);
   if (mrn_hash_get(&mrn_ctx, mrn_hash, db_name, &db) != 0) {
@@ -2293,7 +2310,10 @@ int ha_mroonga::wrapper_open_indexes(const char *name)
   }
 
   char table_name[MRN_MAX_PATH_SIZE];
-  mrn_table_name_gen(name, table_name);
+  char decode_name[MRN_MAX_PATH_SIZE];
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_table_name_gen(decode_name, table_name);
   int i = 0;
   for (i = 0; i < n_keys; i++) {
     KEY key_info = table->s->key_info[i];
@@ -2407,7 +2427,10 @@ int ha_mroonga::open_table(const char *name)
   MRN_DBUG_ENTER_METHOD();
 
   char table_name[MRN_MAX_PATH_SIZE];
-  mrn_table_name_gen(name, table_name);
+  char decode_name[MRN_MAX_PATH_SIZE];
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_table_name_gen(decode_name, table_name);
   grn_table = grn_ctx_get(ctx, table_name, strlen(table_name));
   if (ctx->rc) {
     int error = ER_CANT_OPEN_FILE;
@@ -2473,7 +2496,10 @@ int ha_mroonga::storage_open_indexes(const char *name)
   }
 
   char table_name[MRN_MAX_PATH_SIZE];
-  mrn_table_name_gen(name, table_name);
+  char decode_name[MRN_MAX_PATH_SIZE];
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_table_name_gen(decode_name, table_name);
   int i = 0;
   for (i = 0; i < n_keys; i++) {
     key_min[i] = (uchar *)malloc(MRN_MAX_KEY_SIZE);
@@ -2699,7 +2725,7 @@ int ha_mroonga::wrapper_delete_index(const char *name, MRN_SHARE *tmp_share,
   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);
+                             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);
@@ -2730,7 +2756,8 @@ int ha_mroonga::storage_delete_table(const char *name, MRN_SHARE *tmp_share,
 
   int i;
   for (i = 0; i < tmp_table_share->keys; i++) {
-    mrn_index_table_name_gen(tbl_name, tmp_table_share->key_info[i].name, index_name);
+    mrn_index_table_name_gen(tbl_name, tmp_table_share->key_info[i].name,
+                             index_name);
     grn_obj *idx_tbl_obj = grn_ctx_get(ctx, index_name, strlen(index_name));
     if (idx_tbl_obj != NULL) {
       grn_obj_remove(ctx, idx_tbl_obj);
@@ -2752,6 +2779,7 @@ int ha_mroonga::delete_table(const char *name)
   int error = 0;
   char db_name[MRN_MAX_PATH_SIZE];
   char tbl_name[MRN_MAX_PATH_SIZE];
+  char decode_name[MRN_MAX_PATH_SIZE];
   TABLE_LIST table_list;
   TABLE_SHARE *tmp_table_share;
   TABLE tmp_table;
@@ -2764,8 +2792,10 @@ int ha_mroonga::delete_table(const char *name)
     sql_command == SQLCOM_ALTER_TABLE
   )
     DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-  mrn_db_name_gen(name, db_name);
-  mrn_table_name_gen(name, tbl_name);
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) name, (const uchar *) name + strlen(name));
+  mrn_db_name_gen(decode_name, db_name);
+  mrn_table_name_gen(decode_name, tbl_name);
 #if MYSQL_VERSION_ID >= 50500
   table_list.init_one_table(db_name, strlen(db_name),
                             tbl_name, strlen(tbl_name), tbl_name, TL_WRITE);
@@ -7370,6 +7400,7 @@ 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_name[MRN_MAX_PATH_SIZE];
   THD *thd = ha_thd();
   MRN_SHARE *tmp_share;
   TABLE_SHARE tmp_table_share;
@@ -7392,7 +7423,10 @@ 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, grn_table_name);
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) share->table_name,
+             (const uchar *) share->table_name + share->table_name_length);
+  mrn_table_name_gen(decode_name, grn_table_name);
   hnd_add_index = NULL;
   bitmap_clear_all(table->read_set);
   mrn_set_bitmap_by_key(table->read_set, p_key_info);
@@ -7535,6 +7569,7 @@ 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_name[MRN_MAX_PATH_SIZE];
   THD *thd = ha_thd();
   MRN_SHARE *tmp_share;
   TABLE_SHARE tmp_table_share;
@@ -7557,7 +7592,10 @@ 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, grn_table_name);
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) share->table_name,
+             (const uchar *) share->table_name + share->table_name_length);
+  mrn_table_name_gen(decode_name, grn_table_name);
   bitmap_clear_all(table->read_set);
   for (i = 0; i < num_of_keys; i++) {
     index_tables[i + n_keys] = NULL;
@@ -7718,8 +7756,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_name[MRN_MAX_PATH_SIZE];
   MRN_DBUG_ENTER_METHOD();
-  mrn_table_name_gen(share->table_name, grn_table_name);
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) share->table_name,
+             (const uchar *) share->table_name + share->table_name_length);
+  mrn_table_name_gen(decode_name, grn_table_name);
   for (i = 0, j = 0; i < num_of_keys; i++) {
     if (!(key_info[key_num[i]].flags & HA_FULLTEXT)) {
       wrap_key_num[j] = share->wrap_key_nr[key_num[i]];
@@ -7754,8 +7796,12 @@ 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_name[MRN_MAX_PATH_SIZE];
   MRN_DBUG_ENTER_METHOD();
-  mrn_table_name_gen(share->table_name, grn_table_name);
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) share->table_name,
+             (const uchar *) share->table_name + share->table_name_length);
+  mrn_table_name_gen(decode_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,

  Modified: mrn_table.cc (+29 -0)
===================================================================
--- mrn_table.cc    2011-11-21 09:56:54 +0000 (60a8ccf)
+++ mrn_table.cc    2011-11-21 17:40:59 +0000 (9241622)
@@ -796,3 +796,32 @@ 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)
+{
+  int res;
+  uchar *buf = buf_st;
+  my_wc_t wc;
+  my_charset_conv_mb_wc mb_wc = my_charset_filename.cset->mb_wc;
+  DBUG_ENTER("mrn_decode");
+  DBUG_PRINT("info", ("mroonga: in=%s", st));
+  buf_ed--;
+  for (; st < ed && buf < buf_ed; st += res)
+  {
+    if ((res = (*mb_wc)(NULL, &wc, (uchar *) st, (uchar *) ed)) > 0)
+    {
+      for (; wc; buf++, wc >>= 8)
+        *buf = (uchar)(wc & 0xff);
+    } else if (res == MY_CS_ILSEQ)
+    {
+      *buf = *st;
+      buf++;
+      res = 1;
+    } else {
+      break;
+    }
+  }
+  *buf = '\0';
+  DBUG_PRINT("info", ("mroonga: out=%s", buf_st));
+  DBUG_RETURN(buf - buf_st);
+}

  Modified: mrn_table.h (+2 -0)
===================================================================
--- mrn_table.h    2011-11-21 09:56:54 +0000 (a629e44)
+++ mrn_table.h    2011-11-21 17:40:59 +0000 (40d1812)
@@ -90,5 +90,7 @@ TABLE_SHARE *mrn_get_table_share(TABLE_LIST *table_list, int *error);
 void mrn_free_table_share(TABLE_SHARE *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);
 
 #endif /* _mrn_table_h */




Groonga-mysql-commit メーリングリストの案内
Back to archive index