[Groonga-mysql-commit] mroonga/mroonga [master] storage: support REPAIR TABLE experimentaly

Zurück zum Archiv-Index

null+****@clear***** null+****@clear*****
2012年 4月 28日 (土) 23:28:16 JST


Kouhei Sutou	2012-04-28 23:28:16 +0900 (Sat, 28 Apr 2012)

  New Revision: b13968e9c69833619fa064306e8bea0f4be1b712

  Log:
    storage: support REPAIR TABLE experimentaly
    
    It may work for upgrading groonga type for ENUM and SET.
    NOTE: This is not tested!!!

  Modified files:
    ha_mroonga.cpp
    ha_mroonga.hpp

  Modified: ha_mroonga.cpp (+53 -1)
===================================================================
--- ha_mroonga.cpp    2012-04-28 00:29:32 +0900 (384fd23)
+++ ha_mroonga.cpp    2012-04-28 23:28:16 +0900 (3764beb)
@@ -2001,7 +2001,8 @@ ulonglong ha_mroonga::storage_table_flags() const
     HA_CAN_BIT_FIELD |
     HA_DUPLICATE_POS |
     HA_CAN_GEOMETRY |
-    HA_CAN_RTREEKEYS;
+    HA_CAN_RTREEKEYS |
+    HA_CAN_REPAIR;
     //HA_HAS_RECORDS;
 #ifdef HA_MUST_USE_TABLE_CONDITION_PUSHDOWN
   flags |= HA_MUST_USE_TABLE_CONDITION_PUSHDOWN;
@@ -11403,6 +11404,57 @@ void ha_mroonga::release_auto_increment()
   DBUG_VOID_RETURN;
 }
 
+int ha_mroonga::wrapper_check_for_upgrade(HA_CHECK_OPT *check_opt)
+{
+  MRN_DBUG_ENTER_METHOD();
+  MRN_SET_WRAP_SHARE_KEY(share, table->s);
+  MRN_SET_WRAP_TABLE_KEY(this, table);
+  int error = wrap_handler->ha_check_for_upgrade(check_opt);
+  MRN_SET_BASE_SHARE_KEY(share, table->s);
+  MRN_SET_BASE_TABLE_KEY(this, table);
+  DBUG_RETURN(error);
+}
+
+int ha_mroonga::storage_check_for_upgrade(HA_CHECK_OPT *check_opt)
+{
+  MRN_DBUG_ENTER_METHOD();
+  for (uint i = 0; i < table->s->fields; ++i) {
+    grn_obj *column = grn_columns[i];
+    if (!column) {
+      continue;
+    }
+    Field *field = table->field[i];
+    grn_id column_range = grn_obj_get_range(ctx, column);
+    switch (field->real_type()) {
+    case MYSQL_TYPE_ENUM:
+      if (column_range != GRN_DB_UINT16) {
+        DBUG_RETURN(HA_ADMIN_NEEDS_ALTER);
+      }
+      break;
+    case MYSQL_TYPE_SET:
+      if (column_range != GRN_DB_UINT64) {
+        DBUG_RETURN(HA_ADMIN_NEEDS_ALTER);
+      }
+      break;
+    default:
+      break;
+    }
+  }
+  DBUG_RETURN(HA_ADMIN_OK);
+}
+
+int ha_mroonga::check_for_upgrade(HA_CHECK_OPT *check_opt)
+{
+  MRN_DBUG_ENTER_METHOD();
+  int error;
+  if (share->wrapper_mode) {
+    error = wrapper_check_for_upgrade(check_opt);
+  } else {
+    error = storage_check_for_upgrade(check_opt);
+  }
+  DBUG_RETURN(error);
+}
+
 int ha_mroonga::wrapper_reset_auto_increment(ulonglong value)
 {
   int res;

  Modified: ha_mroonga.hpp (+3 -0)
===================================================================
--- ha_mroonga.hpp    2012-04-28 00:29:32 +0900 (8e9b28f)
+++ ha_mroonga.hpp    2012-04-28 23:28:16 +0900 (f27f904)
@@ -391,6 +391,7 @@ public:
                           ulonglong *first_value, ulonglong *nb_reserved_values);
   void restore_auto_increment(ulonglong prev_insert_id);
   void release_auto_increment();
+  int check_for_upgrade(HA_CHECK_OPT *check_opt);
   int reset_auto_increment(ulonglong value);
   bool was_semi_consistent_read();
   void try_semi_consistent_read(bool yes);
@@ -892,6 +893,8 @@ private:
   void storage_restore_auto_increment(ulonglong prev_insert_id);
   void wrapper_release_auto_increment();
   void storage_release_auto_increment();
+  int wrapper_check_for_upgrade(HA_CHECK_OPT *check_opt);
+  int storage_check_for_upgrade(HA_CHECK_OPT *check_opt);
   int wrapper_reset_auto_increment(ulonglong value);
   int storage_reset_auto_increment(ulonglong value);
   bool wrapper_was_semi_consistent_read();




Groonga-mysql-commit メーリングリストの案内
Zurück zum Archiv-Index