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();