[Groonga-mysql-commit] mroonga/mroonga [master] temporary commit for reviewing. refs #1191

Back to archive index

null+****@clear***** null+****@clear*****
2012年 1月 19日 (木) 10:38:19 JST


Kentoku	2012-01-19 10:38:19 +0900 (Thu, 19 Jan 2012)

  New Revision: a6985d4da03ff8445c3f406603c4a7786fec22db

  Log:
    temporary commit for reviewing. refs #1191

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+149 -18)
===================================================================
--- ha_mroonga.cc    2012-01-16 12:25:17 +0900 (bcc2802)
+++ ha_mroonga.cc    2012-01-19 10:38:19 +0900 (f92b4a7)
@@ -2970,12 +2970,6 @@ int ha_mroonga::wrapper_open_indexes(const char *name)
     if (ctx->rc) {
       DBUG_PRINT("info",
         ("mroonga: sql_command=%u", thd_sql_command(ha_thd())));
-      if (thd_sql_command(ha_thd()) == SQLCOM_REPAIR)
-      {
-        DBUG_PRINT("info", ("mroonga: continue"));
-        grn_index_tables[i] = NULL;
-        continue;
-      }
       error = ER_CANT_OPEN_FILE;
       my_message(error, ctx->errbuf, MYF(0));
       free(key_min[i]);
@@ -2997,12 +2991,6 @@ int ha_mroonga::wrapper_open_indexes(const char *name)
     if (ctx->rc) {
       DBUG_PRINT("info",
         ("mroonga: sql_command=%u", thd_sql_command(ha_thd())));
-      if (thd_sql_command(ha_thd()) == SQLCOM_REPAIR)
-      {
-        DBUG_PRINT("info", ("mroonga: continue"));
-        grn_index_columns[i] = NULL;
-        continue;
-      }
       error = ER_CANT_OPEN_FILE;
       my_message(error, ctx->errbuf, MYF(0));
       free(key_min[i]);
@@ -8074,11 +8062,6 @@ int ha_mroonga::wrapper_rename_index(const char *from, const char *to,
       rc = grn_table_rename(ctx, index_table, to_index_name,
                             strlen(to_index_name));
       if (rc != GRN_SUCCESS) {
-        if (thd_sql_command(ha_thd()) == SQLCOM_REPAIR)
-        {
-          DBUG_PRINT("info", ("mroonga: continue"));
-          continue;
-        }
         error = ER_CANT_OPEN_FILE;
         my_message(error, ctx->errbuf, MYF(0));
         DBUG_RETURN(error);
@@ -8407,10 +8390,158 @@ int ha_mroonga::check(THD* thd, HA_CHECK_OPT* check_opt)
   DBUG_RETURN(error);
 }
 
+int ha_mroonga::wrapper_recreate_indexes(THD *thd)
+{
+  int res;
+  uint i, n_keys = table_share->keys;
+  KEY *p_key_info = &table->key_info[table_share->primary_key], *tmp_key_info,
+    *key_info = table->key_info;
+  char db_name[MRN_MAX_PATH_SIZE];
+  char table_name[MRN_MAX_PATH_SIZE];
+  char decode_name[MRN_MAX_PATH_SIZE];
+  grn_obj *db, *grn_table;
+  MRN_DBUG_ENTER_METHOD();
+  mrn_decode((uchar *) decode_name, (uchar *) decode_name + MRN_MAX_PATH_SIZE,
+             (const uchar *) table_share->normalized_path.str,
+             (const uchar *) table_share->normalized_path.str +
+             table_share->normalized_path.length);
+  mrn_db_name_gen(decode_name, db_name);
+  mrn_table_name_gen(decode_name, table_name);
+  mrn_hash_get(&mrn_ctx, mrn_hash, db_name, &db);
+  bitmap_clear_all(table->read_set);
+  clear_indexes();
+  grn_table = grn_ctx_get(ctx, table_name, strlen(table_name));
+  if (grn_table != NULL) {
+    grn_obj_remove(ctx, grn_table);
+  } else {
+    record_id = grn_table_get(ctx, db,
+                              table_name,
+                              strlen(table_name));
+    if (record_id != GRN_ID_NIL) {
+      grn_obj_delete_by_id(ctx, db, record_id, GRN_TRUE);
+    }
+  }
+  mrn_set_bitmap_by_key(table->read_set, p_key_info);
+  for (i = 0; i < n_keys; i++) {
+    if (!(key_info[i].flags & HA_FULLTEXT) && !mrn_is_geo_key(&key_info[i])) {
+      continue;
+    }
+    char index_name[MRN_MAX_PATH_SIZE];
+    mrn_index_table_name_gen(table_name, table_share->key_info[i].name,
+                             index_name);
+    grn_table = grn_ctx_get(ctx, index_name, strlen(index_name));
+    if (grn_table != NULL) {
+      grn_obj_remove(ctx, grn_table);
+    } else {
+      record_id = grn_table_get(ctx, db,
+                                index_name,
+                                strlen(index_name));
+      if (record_id != GRN_ID_NIL) {
+        grn_obj_delete_by_id(ctx, db, record_id, GRN_TRUE);
+      }
+    }
+    mrn_set_bitmap_by_key(table->read_set, &key_info[i]);
+  }
+  if (
+    (res = wrapper_create_index(table_share->normalized_path.str, table,
+      NULL, share)) ||
+    (res = wrapper_open_indexes(table_share->normalized_path.str))
+  )
+    DBUG_RETURN(res);
+  if (
+    (mrn_lock_type != F_UNLCK || !(res = wrapper_external_lock(thd, F_WRLCK)))
+  ) {
+    if (
+      !(res = wrapper_start_stmt(thd, thr_lock_data.type)) &&
+      !(res = wrapper_rnd_init(TRUE))
+    ) {
+      grn_obj key;
+      GRN_TEXT_INIT(&key, 0);
+      grn_bulk_space(ctx, &key, p_key_info->key_length);
+      while (!(res = wrapper_rnd_next(table->record[0])))
+      {
+        key_copy((uchar *) (GRN_TEXT_VALUE(&key)), table->record[0],
+          p_key_info, p_key_info->key_length);
+        int added;
+        grn_id record_id;
+        mrn_change_encoding(ctx, NULL);
+        record_id = grn_table_add(ctx, grn_table,
+          GRN_TEXT_VALUE(&key), GRN_TEXT_LEN(&key), &added);
+        if (record_id == GRN_ID_NIL)
+        {
+          char error_message[MRN_MESSAGE_BUFFER_SIZE];
+          snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE,
+                   "failed to add a new record into groonga: key=<%.*s>",
+                   (int) GRN_TEXT_LEN(&key), GRN_TEXT_VALUE(&key));
+          res = ER_ERROR_ON_WRITE;
+          my_message(res, error_message, MYF(0));
+        }
+        grn_obj_unlink(ctx, &key);
+        if (res)
+          break;
+
+        uint k;
+        for (k = 0; k < n_keys; k++) {
+          tmp_key_info = &key_info[k];
+          if (!(tmp_key_info->flags & HA_FULLTEXT) &&
+            !mrn_is_geo_key(tmp_key_info)) {
+            continue;
+          }
+
+          uint l;
+          for (l = 0; l < tmp_key_info->key_parts; l++) {
+            Field *field = tmp_key_info->key_part[l].field;
+
+            if (field->is_null())
+              continue;
+            res = mrn_change_encoding(ctx, field->charset());
+            if (res)
+              break;
+
+            int new_column_size;
+            mrn_set_buf(ctx, field, &new_value_buffer, &new_column_size);
+
+            grn_obj *index_column = grn_index_columns[k];
+            grn_rc rc;
+            rc = grn_column_index_update(ctx, index_column, record_id, l + 1,
+                                         NULL, &new_value_buffer);
+            grn_obj_unlink(ctx, index_column);
+            if (rc) {
+              res = ER_ERROR_ON_WRITE;
+              my_message(res, ctx->errbuf, MYF(0));
+              break;
+            }
+          }
+          if (res)
+            break;
+        }
+        if (res)
+          break;
+      }
+      if (res != HA_ERR_END_OF_FILE)
+        wrapper_rnd_end();
+      else
+        res = wrapper_rnd_end();
+    }
+    if (mrn_lock_type == F_UNLCK)
+      wrapper_external_lock(thd, F_UNLCK);
+  }
+  bitmap_set_all(table->read_set);
+  DBUG_RETURN(res);
+}
+
 int ha_mroonga::wrapper_repair(THD* thd, HA_CHECK_OPT* check_opt)
 {
+  int error;
   MRN_DBUG_ENTER_METHOD();
-  DBUG_RETURN(HA_ADMIN_TRY_ALTER);
+  MRN_SET_WRAP_SHARE_KEY(share, table->s);
+  MRN_SET_WRAP_TABLE_KEY(this, table);
+  error = wrap_handler->ha_repair(thd, check_opt);
+  MRN_SET_BASE_SHARE_KEY(share, table->s);
+  MRN_SET_BASE_TABLE_KEY(this, table);
+  if (error && error != HA_ADMIN_NOT_IMPLEMENTED)
+    DBUG_RETURN(error);
+  DBUG_RETURN(wrapper_recreate_indexes(thd));
 }
 
 int ha_mroonga::storage_repair(THD* thd, HA_CHECK_OPT* check_opt)

  Modified: ha_mroonga.h (+1 -0)
===================================================================
--- ha_mroonga.h    2012-01-16 12:25:17 +0900 (fbdc0ce)
+++ ha_mroonga.h    2012-01-19 10:38:19 +0900 (3ad36a1)
@@ -657,6 +657,7 @@ private:
   int storage_enable_indexes(uint mode);
   int wrapper_check(THD* thd, HA_CHECK_OPT* check_opt);
   int storage_check(THD* thd, HA_CHECK_OPT* check_opt);
+  int wrapper_recreate_indexes(THD *thd);
   int wrapper_repair(THD* thd, HA_CHECK_OPT* check_opt);
   int storage_repair(THD* thd, HA_CHECK_OPT* check_opt);
   bool wrapper_check_and_repair(THD *thd);




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