diff options
Diffstat (limited to 'sql/handler.cc')
-rw-r--r-- | sql/handler.cc | 228 |
1 files changed, 92 insertions, 136 deletions
diff --git a/sql/handler.cc b/sql/handler.cc index b3487e69670..5f368720390 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -271,7 +271,7 @@ handler *get_new_handler(TABLE_SHARE *share, MEM_ROOT *alloc, DBUG_ENTER("get_new_handler"); DBUG_PRINT("enter", ("alloc: %p", alloc)); - if (db_type && db_type->state == SHOW_OPTION_YES && db_type->create) + if (ha_storage_engine_is_enabled(db_type)) { if ((file= db_type->create(db_type, share, alloc))) file->init(); @@ -456,15 +456,8 @@ int ha_finalize_handlerton(st_plugin_int *plugin) if (!hton) goto end; - switch (hton->state) { - case SHOW_OPTION_NO: - case SHOW_OPTION_DISABLED: - break; - case SHOW_OPTION_YES: - if (installed_htons[hton->db_type] == hton) - installed_htons[hton->db_type]= NULL; - break; - }; + if (installed_htons[hton->db_type] == hton) + installed_htons[hton->db_type]= NULL; if (hton->panic) hton->panic(hton, HA_PANIC_CLOSE); @@ -531,7 +524,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) if (plugin->plugin->init && plugin->plugin->init(hton)) { sql_print_error("Plugin '%s' init function returned error.", - plugin->name.str); + plugin->name.str); goto err; } @@ -550,90 +543,78 @@ int ha_initialize_handlerton(st_plugin_int *plugin) hton->discover_table_existence= full_discover_for_existence; } - switch (hton->state) { - case SHOW_OPTION_NO: - break; - case SHOW_OPTION_YES: - { - uint tmp; - ulong fslot; - - DBUG_EXECUTE_IF("unstable_db_type", { - static int i= (int) DB_TYPE_FIRST_DYNAMIC; - hton->db_type= (enum legacy_db_type)++i; - }); - - /* now check the db_type for conflict */ - if (hton->db_type <= DB_TYPE_UNKNOWN || - hton->db_type >= DB_TYPE_DEFAULT || - installed_htons[hton->db_type]) - { - int idx= (int) DB_TYPE_FIRST_DYNAMIC; + uint tmp; + ulong fslot; - while (idx < (int) DB_TYPE_DEFAULT && installed_htons[idx]) - idx++; + DBUG_EXECUTE_IF("unstable_db_type", { + static int i= (int) DB_TYPE_FIRST_DYNAMIC; + hton->db_type= (enum legacy_db_type)++i; + }); - if (idx == (int) DB_TYPE_DEFAULT) - { - sql_print_warning("Too many storage engines!"); - goto err_deinit; - } - if (hton->db_type != DB_TYPE_UNKNOWN) - sql_print_warning("Storage engine '%s' has conflicting typecode. " - "Assigning value %d.", plugin->plugin->name, idx); - hton->db_type= (enum legacy_db_type) idx; - } + /* now check the db_type for conflict */ + if (hton->db_type <= DB_TYPE_UNKNOWN || + hton->db_type >= DB_TYPE_DEFAULT || + installed_htons[hton->db_type]) + { + int idx= (int) DB_TYPE_FIRST_DYNAMIC; - /* - In case a plugin is uninstalled and re-installed later, it should - reuse an array slot. Otherwise the number of uninstall/install - cycles would be limited. So look for a free slot. - */ - DBUG_PRINT("plugin", ("total_ha: %lu", total_ha)); - for (fslot= 0; fslot < total_ha; fslot++) - { - if (!hton2plugin[fslot]) - break; - } - if (fslot < total_ha) - hton->slot= fslot; - else - { - if (total_ha >= MAX_HA) - { - sql_print_error("Too many plugins loaded. Limit is %lu. " - "Failed on '%s'", (ulong) MAX_HA, plugin->name.str); - goto err_deinit; - } - hton->slot= total_ha++; - } - installed_htons[hton->db_type]= hton; - tmp= hton->savepoint_offset; - hton->savepoint_offset= savepoint_alloc_size; - savepoint_alloc_size+= tmp; - hton2plugin[hton->slot]=plugin; - if (hton->prepare) - { - total_ha_2pc++; - if (tc_log && tc_log != get_tc_log_implementation()) - { - total_ha_2pc--; - hton->prepare= 0; - push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, - ER_UNKNOWN_ERROR, - "Cannot enable tc-log at run-time. " - "XA features of %s are disabled", - plugin->name.str); - } - } + while (idx < (int) DB_TYPE_DEFAULT && installed_htons[idx]) + idx++; + + if (idx == (int) DB_TYPE_DEFAULT) + { + sql_print_warning("Too many storage engines!"); + goto err_deinit; + } + if (hton->db_type != DB_TYPE_UNKNOWN) + sql_print_warning("Storage engine '%s' has conflicting typecode. " + "Assigning value %d.", plugin->plugin->name, idx); + hton->db_type= (enum legacy_db_type) idx; + } + + /* + In case a plugin is uninstalled and re-installed later, it should + reuse an array slot. Otherwise the number of uninstall/install + cycles would be limited. So look for a free slot. + */ + DBUG_PRINT("plugin", ("total_ha: %lu", total_ha)); + for (fslot= 0; fslot < total_ha; fslot++) + { + if (!hton2plugin[fslot]) break; + } + if (fslot < total_ha) + hton->slot= fslot; + else + { + if (total_ha >= MAX_HA) + { + sql_print_error("Too many plugins loaded. Limit is %lu. " + "Failed on '%s'", (ulong) MAX_HA, plugin->name.str); + goto err_deinit; } - /* fall through */ - default: - hton->state= SHOW_OPTION_DISABLED; - break; + hton->slot= total_ha++; } - + installed_htons[hton->db_type]= hton; + tmp= hton->savepoint_offset; + hton->savepoint_offset= savepoint_alloc_size; + savepoint_alloc_size+= tmp; + hton2plugin[hton->slot]=plugin; + if (hton->prepare) + { + total_ha_2pc++; + if (tc_log && tc_log != get_tc_log_implementation()) + { + total_ha_2pc--; + hton->prepare= 0; + push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, + ER_UNKNOWN_ERROR, + "Cannot enable tc-log at run-time. " + "XA features of %s are disabled", + plugin->name.str); + } + } + /* This is entirely for legacy. We will create a new "disk based" hton and a "memory" hton which will be configurable longterm. We should be able to @@ -668,10 +649,10 @@ err_deinit: */ if (plugin->plugin->deinit) (void) plugin->plugin->deinit(NULL); - + err: #ifdef DBUG_ASSERT_EXISTS - if (hton->prepare && hton->state == SHOW_OPTION_YES) + if (hton->prepare) failed_ha_2pc++; #endif my_free(hton); @@ -716,7 +697,7 @@ static my_bool dropdb_handlerton(THD *unused1, plugin_ref plugin, void *path) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->drop_database) + if (hton->drop_database) hton->drop_database(hton, (char *)path); return FALSE; } @@ -732,7 +713,7 @@ static my_bool checkpoint_state_handlerton(THD *unused1, plugin_ref plugin, void *disable) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->checkpoint_state) + if (hton->checkpoint_state) hton->checkpoint_state(hton, (int) *(bool*) disable); return FALSE; } @@ -754,7 +735,7 @@ static my_bool commit_checkpoint_request_handlerton(THD *unused1, plugin_ref plu { st_commit_checkpoint_request *st= (st_commit_checkpoint_request *)data; handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->commit_checkpoint_request) + if (hton->commit_checkpoint_request) { void *cookie= st->cookie; if (st->pre_hook) @@ -811,8 +792,7 @@ static my_bool kill_handlerton(THD *thd, plugin_ref plugin, { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->kill_query && - thd_get_ha_data(thd, hton)) + if (hton->kill_query && thd_get_ha_data(thd, hton)) hton->kill_query(hton, thd, *(enum thd_kill_levels *) level); return FALSE; } @@ -833,7 +813,7 @@ static my_bool plugin_prepare_for_backup(THD *unused1, plugin_ref plugin, void *not_used) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->prepare_for_backup) + if (hton->prepare_for_backup) hton->prepare_for_backup(); return FALSE; } @@ -849,7 +829,7 @@ static my_bool plugin_end_backup(THD *unused1, plugin_ref plugin, void *not_used) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->end_backup) + if (hton->end_backup) hton->end_backup(); return FALSE; } @@ -1927,7 +1907,7 @@ static my_bool xacommit_handlerton(THD *unused1, plugin_ref plugin, void *arg) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->recover) + if (hton->recover) { hton->commit_by_xid(hton, ((struct xahton_st *)arg)->xid); ((struct xahton_st *)arg)->result= 0; @@ -1939,7 +1919,7 @@ static my_bool xarollback_handlerton(THD *unused1, plugin_ref plugin, void *arg) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->recover) + if (hton->recover) { hton->rollback_by_xid(hton, ((struct xahton_st *)arg)->xid); ((struct xahton_st *)arg)->result= 0; @@ -2070,7 +2050,7 @@ static my_bool xarecover_handlerton(THD *unused, plugin_ref plugin, struct xarecover_st *info= (struct xarecover_st *) arg; int got; - if (hton->state == SHOW_OPTION_YES && hton->recover) + if (hton->recover) { while ((got= hton->recover(hton, info->list, info->len)) > 0 ) { @@ -2415,8 +2395,7 @@ static my_bool snapshot_handlerton(THD *thd, plugin_ref plugin, void *arg) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && - hton->start_consistent_snapshot) + if (hton->start_consistent_snapshot) { if (hton->start_consistent_snapshot(hton, thd)) return TRUE; @@ -2462,28 +2441,14 @@ static my_bool flush_handlerton(THD *thd, plugin_ref plugin, void *arg) { handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->flush_logs && - hton->flush_logs(hton)) - return TRUE; - return FALSE; + return hton->flush_logs && hton->flush_logs(hton); } -bool ha_flush_logs(handlerton *db_type) +bool ha_flush_logs() { - if (db_type == NULL) - { - if (plugin_foreach(NULL, flush_handlerton, - MYSQL_STORAGE_ENGINE_PLUGIN, 0)) - return TRUE; - } - else - { - if (db_type->state != SHOW_OPTION_YES || - (db_type->flush_logs && db_type->flush_logs(db_type))) - return TRUE; - } - return FALSE; + return plugin_foreach(NULL, flush_handlerton, + MYSQL_STORAGE_ENGINE_PLUGIN, 0); } @@ -5316,7 +5281,7 @@ static my_bool discover_handlerton(THD *thd, plugin_ref plugin, { TABLE_SHARE *share= (TABLE_SHARE *)arg; handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->discover_table) + if (hton->discover_table) { share->db_plugin= plugin; int error= hton->discover_table(hton, thd, share); @@ -5392,7 +5357,7 @@ static my_bool discover_existence(THD *thd, plugin_ref plugin, { st_discover_existence_args *args= (st_discover_existence_args*)arg; handlerton *ht= plugin_hton(plugin); - if (ht->state != SHOW_OPTION_YES || !ht->discover_table_existence) + if (!ht->discover_table_existence) return args->frm_exists; args->hton= ht; @@ -5682,7 +5647,7 @@ static my_bool discover_names(THD *thd, plugin_ref plugin, st_discover_names_args *args= (st_discover_names_args *)arg; handlerton *ht= plugin_hton(plugin); - if (ht->state == SHOW_OPTION_YES && ht->discover_table_names) + if (ht->discover_table_names) { size_t old_elements= args->result->tables->elements(); if (ht->discover_table_names(ht, args->db, args->dirp, args->result)) @@ -6083,7 +6048,7 @@ static my_bool showstat_handlerton(THD *thd, plugin_ref plugin, { enum ha_stat_type stat= *(enum ha_stat_type *) arg; handlerton *hton= plugin_hton(plugin); - if (hton->state == SHOW_OPTION_YES && hton->show_status && + if (hton->show_status && hton->show_status(hton, thd, stat_print, stat)) return TRUE; return FALSE; @@ -6115,17 +6080,8 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) } else { - if (db_type->state != SHOW_OPTION_YES) - { - const LEX_CSTRING *name= hton_name(db_type); - result= stat_print(thd, name->str, name->length, - "", 0, "DISABLED", 8) ? 1 : 0; - } - else - { - result= db_type->show_status && - db_type->show_status(db_type, thd, stat_print, stat) ? 1 : 0; - } + result= db_type->show_status && + db_type->show_status(db_type, thd, stat_print, stat) ? 1 : 0; } /* |