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