diff options
-rw-r--r-- | include/mysql/plugin.h | 4 | ||||
-rw-r--r-- | plugin/fulltext/plugin_example.c | 4 | ||||
-rw-r--r-- | sql/ha_innodb.cc | 4 | ||||
-rw-r--r-- | sql/ha_ndbcluster.cc | 6 | ||||
-rw-r--r-- | sql/ha_partition.cc | 4 | ||||
-rw-r--r-- | sql/handler.cc | 70 | ||||
-rw-r--r-- | sql/handler.h | 6 | ||||
-rw-r--r-- | sql/log.cc | 4 | ||||
-rw-r--r-- | sql/mysqld.cc | 7 | ||||
-rw-r--r-- | sql/sql_plugin.cc | 260 | ||||
-rw-r--r-- | sql/sql_plugin.h | 32 | ||||
-rw-r--r-- | sql/sql_show.cc | 5 | ||||
-rw-r--r-- | storage/archive/ha_archive.cc | 4 | ||||
-rw-r--r-- | storage/blackhole/ha_blackhole.cc | 4 | ||||
-rw-r--r-- | storage/csv/ha_tina.cc | 4 | ||||
-rw-r--r-- | storage/example/ha_example.cc | 4 | ||||
-rw-r--r-- | storage/federated/ha_federated.cc | 4 | ||||
-rw-r--r-- | storage/heap/ha_heap.cc | 4 | ||||
-rw-r--r-- | storage/myisam/ha_myisam.cc | 4 | ||||
-rw-r--r-- | storage/myisammrg/ha_myisammrg.cc | 4 |
20 files changed, 274 insertions, 164 deletions
diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index 156c3312c53..739f7bc5fc6 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -60,7 +60,7 @@ __MYSQL_DECLARE_PLUGIN(NAME, \ builtin_ ## NAME ## _sizeof_struct_st_plugin, \ builtin_ ## NAME ## _plugin) -#define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0}} +#define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0}} /* declarations for SHOW STATUS support in plugins @@ -96,6 +96,8 @@ struct st_mysql_plugin int (*deinit)(void); /* the function to invoke when plugin is unloaded */ unsigned int version; /* plugin version (for SHOW PLUGINS) */ struct st_mysql_show_var *status_vars; + void * __reserved1; /* placeholder for system variables */ + void * __reserved2; /* placeholder for config options */ }; /************************************************************************* diff --git a/plugin/fulltext/plugin_example.c b/plugin/fulltext/plugin_example.c index beb02128774..34350e317ba 100644 --- a/plugin/fulltext/plugin_example.c +++ b/plugin/fulltext/plugin_example.c @@ -225,7 +225,9 @@ mysql_declare_plugin(ftexample) simple_parser_plugin_init, /* init function (when loaded) */ simple_parser_plugin_deinit,/* deinit function (when unloaded) */ 0x0001, /* version */ - simple_status /* status variables */ + simple_status, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 82372c20e41..1665c7c011a 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -7616,7 +7616,9 @@ mysql_declare_plugin(innobase) innobase_init, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100 /* 1.0 */, - innodb_status_variables_export + innodb_status_variables_export,/* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 038d2a05e7e..f73d83f6030 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -6399,6 +6399,8 @@ static int ndbcluster_init() #endif h.flags= HTON_CAN_RECREATE | HTON_TEMPORARY_NOT_SUPPORTED; h.discover= ndbcluster_discover; + h.find_files= ndbcluster_find_files; + h.table_exists_in_engine= ndbcluster_table_exists_in_engine; } if (have_ndbcluster != SHOW_OPTION_YES) @@ -10614,7 +10616,9 @@ mysql_declare_plugin(ndbcluster) ndbcluster_init, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100 /* 1.0 */, - ndb_status_variables_export + ndb_status_variables_export,/* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 30c64760c88..bd8d604ef0d 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -5640,7 +5640,9 @@ mysql_declare_plugin(partition) partition_initialize, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100, /* 1.0 */ - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/sql/handler.cc b/sql/handler.cc index dd1be47e3c2..9aaad7b3914 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -28,11 +28,6 @@ #include <myisampack.h> #include <errno.h> -#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE -#define NDB_MAX_ATTRIBUTES_IN_TABLE 128 -#include "ha_ndbcluster.h" -#endif - #ifdef WITH_PARTITION_STORAGE_ENGINE #include "ha_partition.h" #endif @@ -430,12 +425,6 @@ int ha_initialize_handlerton(st_plugin_int *plugin) savepoint_alloc_size+= tmp; hton->slot= total_ha++; hton2plugin[hton->slot]=plugin; - /* This is just a temp need until plugin/engine startup is fixed */ - if (plugin->plugin->status_vars) - { - add_status_vars(plugin->plugin->status_vars); - } - if (hton->prepare) total_ha_2pc++; break; @@ -2751,6 +2740,29 @@ int ha_discover(THD *thd, const char *db, const char *name, to ask engine if there are any new tables that should be written to disk or any dropped tables that need to be removed from disk */ +typedef struct st_find_files_args +{ + const char *db; + const char *path; + const char *wild; + bool dir; + List<char> *files; +}; + +static my_bool find_files_handlerton(THD *thd, st_plugin_int *plugin, + void *arg) +{ + st_find_files_args *vargs= (st_find_files_args *)arg; + handlerton *hton= (handlerton *)plugin->data; + + + if (hton->state == SHOW_OPTION_YES && hton->find_files) + if (hton->find_files(thd, vargs->db, vargs->path, vargs->wild, + vargs->dir, vargs->files)) + return TRUE; + + return FALSE; +} int ha_find_files(THD *thd,const char *db,const char *path, @@ -2760,10 +2772,11 @@ ha_find_files(THD *thd,const char *db,const char *path, DBUG_ENTER("ha_find_files"); DBUG_PRINT("enter", ("db: %s, path: %s, wild: %s, dir: %d", db, path, wild, dir)); -#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE - if (have_ndbcluster == SHOW_OPTION_YES) - error= ndbcluster_find_files(thd, db, path, wild, dir, files); -#endif + st_find_files_args args= {db, path, wild, dir, files}; + + plugin_foreach(thd, find_files_handlerton, + MYSQL_STORAGE_ENGINE_PLUGIN, &args); + /* The return value is not currently used */ DBUG_RETURN(error); } @@ -2777,15 +2790,34 @@ ha_find_files(THD *thd,const char *db,const char *path, # Error code */ + +typedef struct st_table_exists_in_engine_args +{ + const char *db; + const char *name; +}; + +static my_bool table_exists_in_engine_handlerton(THD *thd, st_plugin_int *plugin, + void *arg) +{ + st_table_exists_in_engine_args *vargs= (st_table_exists_in_engine_args *)arg; + handlerton *hton= (handlerton *)plugin->data; + + if (hton->state == SHOW_OPTION_YES && hton->table_exists_in_engine) + if ((hton->table_exists_in_engine(thd, vargs->db, vargs->name)) == 1) + return TRUE; + + return FALSE; +} + int ha_table_exists_in_engine(THD* thd, const char* db, const char* name) { int error= 0; DBUG_ENTER("ha_table_exists_in_engine"); DBUG_PRINT("enter", ("db: %s, name: %s", db, name)); -#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE - if (have_ndbcluster == SHOW_OPTION_YES) - error= ndbcluster_table_exists_in_engine(thd, db, name); -#endif + st_table_exists_in_engine_args args= {db, name}; + error= plugin_foreach(thd, table_exists_in_engine_handlerton, + MYSQL_STORAGE_ENGINE_PLUGIN, &args); DBUG_PRINT("exit", ("error: %d", error)); DBUG_RETURN(error); } diff --git a/sql/handler.h b/sql/handler.h index df40a207916..b331c47a370 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -668,7 +668,11 @@ struct handlerton (*create_iterator)(enum handler_iterator_type type, struct handler_iterator *fill_this_in); int (*discover)(THD* thd, const char *db, const char *name, - const void** frmblob, uint* frmlen); + const void** frmblob, uint* frmlen); + int (*find_files)(THD *thd,const char *db,const char *path, + const char *wild, bool dir, List<char> *files); + int (*table_exists_in_engine)(THD* thd, const char *db, + const char *name); }; diff --git a/sql/log.cc b/sql/log.cc index 1bc7ff4f01e..2d7055db049 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -4683,6 +4683,8 @@ mysql_declare_plugin(binlog) binlog_init, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100 /* 1.0 */, - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 86a7a0a3b58..afb81cf7214 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1186,7 +1186,7 @@ void clean_up(bool print_message) udf_free(); #endif } - plugin_free(); + plugin_shutdown(); if (tc_log) tc_log->close(); xid_cache_free(); @@ -2627,7 +2627,7 @@ static int init_common_variables(const char *conf_file_name, int argc, /* Add server status variables to the dynamic list of status variables that is shown by SHOW STATUS. - Later, in plugin_init, plugin_load, and mysql_install_plugin + Later, in plugin_init, and mysql_install_plugin new entries could be added to that list. */ if (add_status_vars(status_vars)) @@ -3176,7 +3176,7 @@ server."); using_update_log=1; } - if (plugin_init()) + if (plugin_init(0)) { sql_print_error("Failed to init plugins."); return 1; @@ -3608,7 +3608,6 @@ we force server id to 2, but this MySQL server will not act as a slave."); if (!opt_noacl) { - plugin_load(); #ifdef HAVE_DLOPEN udf_init(); #endif diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 074999a52cf..b66d2d20925 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -63,6 +63,12 @@ static HASH plugin_hash[MYSQL_MAX_PLUGIN_TYPE_NUM]; static rw_lock_t THR_LOCK_plugin; static bool initialized= 0; +static int plugin_array_version=0; + +/* prototypes */ +my_bool plugin_register_builtin(struct st_mysql_plugin *plugin); +void plugin_load(void); + static struct st_plugin_dl *plugin_dl_find(const LEX_STRING *dl) { uint i; @@ -366,7 +372,7 @@ struct st_plugin_int *plugin_lock(const LEX_STRING *name, int type) rw_wrlock(&THR_LOCK_plugin); if ((rc= plugin_find_internal(name, type))) { - if (rc->state == PLUGIN_IS_READY || rc->state == PLUGIN_IS_UNINITIALIZED) + if (rc->state & (PLUGIN_IS_READY | PLUGIN_IS_UNINITIALIZED)) rc->ref_count++; else rc= 0; @@ -442,17 +448,9 @@ static my_bool plugin_add(const LEX_STRING *name, const LEX_STRING *dl, int repo tmp.name.length= name_len; tmp.ref_count= 0; tmp.state= PLUGIN_IS_UNINITIALIZED; - if (plugin->status_vars) - { - SHOW_VAR array[2]= { - {plugin->name, (char*)plugin->status_vars, SHOW_ARRAY}, - {0, 0, SHOW_UNDEF} - }; - if (add_status_vars(array)) // add_status_vars makes a copy - goto err; - } if (! (tmp_plugin_ptr= plugin_insert_or_reuse(&tmp))) goto err; + plugin_array_version++; if (my_hash_insert(&plugin_hash[plugin->type], (byte*)tmp_plugin_ptr)) { tmp_plugin_ptr->state= PLUGIN_IS_FREED; @@ -466,26 +464,13 @@ static my_bool plugin_add(const LEX_STRING *name, const LEX_STRING *dl, int repo if (report & REPORT_TO_LOG) sql_print_error(ER(ER_CANT_FIND_DL_ENTRY), name->str); err: - if (plugin->status_vars) - { - SHOW_VAR array[2]= { - {plugin->name, (char*)plugin->status_vars, SHOW_ARRAY}, - {0, 0, SHOW_UNDEF} - }; - remove_status_vars(array); - } plugin_dl_del(dl); DBUG_RETURN(TRUE); } -static void plugin_del(const LEX_STRING *name) +void plugin_deinitializer(struct st_plugin_int *plugin) { - uint i; - struct st_plugin_int *plugin; - DBUG_ENTER("plugin_del"); - if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN))) - { if (plugin->plugin->status_vars) { SHOW_VAR array[2]= { @@ -494,9 +479,35 @@ static void plugin_del(const LEX_STRING *name) }; remove_status_vars(array); } + + if (plugin->state == PLUGIN_IS_READY) + { + if (plugin->plugin->deinit) + { + DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str)); + if (plugin->plugin->deinit()) + { + DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.", + plugin->name.str)); + } + } + plugin->state= PLUGIN_IS_UNINITIALIZED; + } +} + + +static void plugin_del(const LEX_STRING *name) +{ + uint i; + struct st_plugin_int *plugin; + DBUG_ENTER("plugin_del"); + if ((plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN))) + { + plugin_deinitializer(plugin); hash_delete(&plugin_hash[plugin->plugin->type], (byte*)plugin); plugin_dl_del(&plugin->plugin_dl->dl); plugin->state= PLUGIN_IS_FREED; + plugin_array_version++; } DBUG_VOID_RETURN; } @@ -523,6 +534,26 @@ static int plugin_initialize(struct st_plugin_int *plugin) { DBUG_ENTER("plugin_initialize"); + if (plugin->plugin->status_vars) + { +#ifdef FIX_LATER + /* + We have a problem right now where we can not prepend without + breaking backwards compatibility. We will fix this shortly so + that engines have "use names" and we wil use those for + CREATE TABLE, and use the plugin name then for adding automatic + variable names. + */ + SHOW_VAR array[2]= { + {plugin->name, (char*)plugin->status_vars, SHOW_ARRAY}, + {0, 0, SHOW_UNDEF} + }; + if (add_status_vars(array)) // add_status_vars makes a copy + goto err; +#else + add_status_vars(plugin->plugin->status_vars); // add_status_vars makes a copy +#endif /* FIX_LATER */ + } if (plugin->plugin->init) { if (plugin->plugin->init()) @@ -540,6 +571,8 @@ static int plugin_initialize(struct st_plugin_int *plugin) goto err; } + plugin->state= PLUGIN_IS_READY; + DBUG_RETURN(0); err: DBUG_RETURN(1); @@ -592,52 +625,6 @@ err: DBUG_RETURN(1); } -static void plugin_call_initializer(void) -{ - uint i; - DBUG_ENTER("plugin_call_initializer"); - for (i= 0; i < plugin_array.elements; i++) - { - struct st_plugin_int *tmp= dynamic_element(&plugin_array, i, - struct st_plugin_int *); - if (tmp->state == PLUGIN_IS_UNINITIALIZED) - { - if (plugin_initialize(tmp)) - plugin_del(&tmp->name); - else - tmp->state= PLUGIN_IS_READY; - } - } - DBUG_VOID_RETURN; -} - - -static void plugin_call_deinitializer(void) -{ - uint i; - DBUG_ENTER("plugin_call_deinitializer"); - for (i= 0; i < plugin_array.elements; i++) - { - struct st_plugin_int *tmp= dynamic_element(&plugin_array, i, - struct st_plugin_int *); - if (tmp->state == PLUGIN_IS_READY) - { - if (tmp->plugin->deinit) - { - DBUG_PRINT("info", ("Deinitializing plugin: '%s'", tmp->name.str)); - if (tmp->plugin->deinit()) - { - DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.", - tmp->name.str)); - } - } - tmp->state= PLUGIN_IS_UNINITIALIZED; - } - } - DBUG_VOID_RETURN; -} - - static byte *get_hash_key(const byte *buff, uint *length, my_bool not_used __attribute__((unused))) { @@ -647,9 +634,16 @@ static byte *get_hash_key(const byte *buff, uint *length, } -int plugin_init(void) +/* + The logic is that we first load and initialize all compiled in plugins. + From there we load up the dynamic types (assuming we have not been told to + skip this part). + + Finally we inializie everything, aka the dynamic that have yet to initialize. +*/ +int plugin_init(int skip_dynamic_loading) { - int i; + uint i; struct st_mysql_plugin **builtins; struct st_mysql_plugin *plugin; DBUG_ENTER("plugin_init"); @@ -672,24 +666,46 @@ int plugin_init(void) goto err; } - /* Register all the built-in plugins */ + /* + First we register builtin plugins + */ for (builtins= mysqld_builtins; *builtins; builtins++) { for (plugin= *builtins; plugin->info; plugin++) { - if (plugin_register_builtin(plugin)) - goto err; - struct st_plugin_int *tmp=dynamic_element(&plugin_array, - plugin_array.elements-1, - struct st_plugin_int *); - if (plugin_initialize(tmp)) - goto err; - tmp->state= PLUGIN_IS_READY; +// if (!(strcmp(plugin->name, "MyISAM"))) + { + if (plugin_register_builtin(plugin)) + goto err; + struct st_plugin_int *tmp= dynamic_element(&plugin_array, + plugin_array.elements-1, + struct st_plugin_int *); + if (plugin_initialize(tmp)) + goto err; + } } } + /* Register all dynamic plugins */ + if (!skip_dynamic_loading) + plugin_load(); + initialized= 1; + /* + Now we initialize all remaining plugins + */ + for (i= 0; i < plugin_array.elements; i++) + { + struct st_plugin_int *tmp= dynamic_element(&plugin_array, i, + struct st_plugin_int *); + if (tmp->state == PLUGIN_IS_UNINITIALIZED) + { + if (plugin_initialize(tmp)) + plugin_del(&tmp->name); + } + } + DBUG_RETURN(0); err: @@ -734,8 +750,6 @@ void plugin_load(void) THD *new_thd; DBUG_ENTER("plugin_load"); - DBUG_ASSERT(initialized); - if (!(new_thd= new THD)) { sql_print_error("Can't allocate memory for plugin structures"); @@ -772,7 +786,6 @@ void plugin_load(void) DBUG_PRINT("warning", ("Couldn't load plugin named '%s' with soname '%s'.", name.str, dl.str)); } - plugin_call_initializer(); if (error > 0) sql_print_error(ER(ER_GET_ERRNO), my_errno); end_read_record(&read_record_info); @@ -787,11 +800,22 @@ end: } -void plugin_free(void) +void plugin_shutdown(void) { uint i; - DBUG_ENTER("plugin_free"); - plugin_call_deinitializer(); + DBUG_ENTER("plugin_shutdown"); + + /* + We loop through all plugins and call deinit() if they have one. + */ + for (i= 0; i < plugin_array.elements; i++) + { + struct st_plugin_int *tmp= dynamic_element(&plugin_array, i, + struct st_plugin_int *); + plugin_deinitializer(tmp); + + } + for (i= 0; i < MYSQL_MAX_PLUGIN_TYPE_NUM; i++) hash_free(&plugin_hash[i]); delete_dynamic(&plugin_array); @@ -841,8 +865,6 @@ my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING goto err; } - tmp->state= PLUGIN_IS_READY; - table->use_all_columns(); restore_record(table, s->default_values); table->field[0]->store(name->str, name->length, system_charset_info); @@ -921,43 +943,63 @@ err: DBUG_RETURN(TRUE); } - -my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, - int type, void *arg) +my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, + int type, uint state_mask, void *arg) { - uint idx; - struct st_plugin_int *plugin; - DBUG_ENTER("plugin_foreach"); - rw_rdlock(&THR_LOCK_plugin); + uint idx, total; + struct st_plugin_int *plugin, **plugins; + int version=plugin_array_version; + DBUG_ENTER("plugin_foreach_with_mask"); + + state_mask= ~state_mask; // do it only once + rw_rdlock(&THR_LOCK_plugin); if (type == MYSQL_ANY_PLUGIN) { - for (idx= 0; idx < plugin_array.elements; idx++) + total=plugin_array.elements; + plugins=(struct st_plugin_int **)my_alloca(total*sizeof(*plugins)); + for (idx= 0; idx < total; idx++) { plugin= dynamic_element(&plugin_array, idx, struct st_plugin_int *); - - /* FREED records may have garbage pointers */ - if ((plugin->state != PLUGIN_IS_FREED) && - func(thd, plugin, arg)) - goto err; + if (plugin->state & state_mask) + continue; + plugins[idx]= plugin; } } else { HASH *hash= &plugin_hash[type]; - for (idx= 0; idx < hash->records; idx++) + total=hash->records; + plugins=(struct st_plugin_int **)my_alloca(total*sizeof(*plugins)); + for (idx= 0; idx < total; idx++) { plugin= (struct st_plugin_int *) hash_element(hash, idx); - if ((plugin->state != PLUGIN_IS_FREED) && - (plugin->state != PLUGIN_IS_DELETED) && - func(thd, plugin, arg)) - goto err; + if (plugin->state & state_mask) + continue; + plugins[idx]= plugin; } } - rw_unlock(&THR_LOCK_plugin); + + for (idx= 0; idx < total; idx++) + { + plugin= plugins[idx]; + if (unlikely(version != plugin_array_version)) + { + rw_rdlock(&THR_LOCK_plugin); + for (uint i=idx; i < total; i++) + if (plugins[i]->state & state_mask) + plugins[i]=0; + rw_unlock(&THR_LOCK_plugin); + } + if (plugin && func(thd, plugin, arg)) + goto err; + } + + my_afree(plugins); DBUG_RETURN(FALSE); err: - rw_unlock(&THR_LOCK_plugin); + my_afree(plugins); DBUG_RETURN(TRUE); } + diff --git a/sql/sql_plugin.h b/sql/sql_plugin.h index df7c9a39495..fa3440f7f68 100644 --- a/sql/sql_plugin.h +++ b/sql/sql_plugin.h @@ -31,13 +31,17 @@ typedef struct st_mysql_show_var SHOW_VAR; #define MYSQL_ANY_PLUGIN -1 -enum enum_plugin_state -{ - PLUGIN_IS_FREED= 0, - PLUGIN_IS_DELETED, - PLUGIN_IS_UNINITIALIZED, - PLUGIN_IS_READY -}; +/* + different values of st_plugin_int::state + though they look like a bitmap, plugin may only + be in one of those eigenstates, not in a superposition of them :) + It's a bitmap, because it makes it easier to test + "whether the state is one of those..." +*/ +#define PLUGIN_IS_FREED 1 +#define PLUGIN_IS_DELETED 2 +#define PLUGIN_IS_UNINITIALIZED 4 +#define PLUGIN_IS_READY 8 /* A handle for the dynamic library containing a plugin or plugins. */ @@ -57,7 +61,7 @@ struct st_plugin_int LEX_STRING name; struct st_mysql_plugin *plugin; struct st_plugin_dl *plugin_dl; - enum enum_plugin_state state; + uint state; uint ref_count; /* number of threads using the plugin */ void *data; /* plugin type specific, e.g. handlerton */ }; @@ -67,20 +71,18 @@ typedef int (*plugin_type_init)(struct st_plugin_int *); extern char *opt_plugin_dir_ptr; extern char opt_plugin_dir[FN_REFLEN]; extern const LEX_STRING plugin_type_names[]; -extern int plugin_init(void); -extern void plugin_load(void); -extern void plugin_free(void); +extern int plugin_init(int); +extern void plugin_shutdown(void); extern my_bool plugin_is_ready(const LEX_STRING *name, int type); extern st_plugin_int *plugin_lock(const LEX_STRING *name, int type); extern void plugin_unlock(struct st_plugin_int *plugin); extern my_bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl); extern my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name); -extern my_bool plugin_register_builtin(struct st_mysql_plugin *plugin); - typedef my_bool (plugin_foreach_func)(THD *thd, st_plugin_int *plugin, void *arg); -extern my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, - int type, void *arg); +#define plugin_foreach(A,B,C,D) plugin_foreach_with_mask(A,B,C,PLUGIN_IS_READY,D) +extern my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, + int type, uint state_mask, void *arg); #endif diff --git a/sql/sql_show.cc b/sql/sql_show.cc index a8bf2695ac4..3acc025b84f 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -220,9 +220,10 @@ int fill_plugins(THD *thd, TABLE_LIST *tables, COND *cond) DBUG_ENTER("fill_plugins"); TABLE *table= tables->table; - if (plugin_foreach(thd, show_plugins, MYSQL_ANY_PLUGIN, table)) + if (plugin_foreach_with_mask(thd, show_plugins, MYSQL_ANY_PLUGIN, + ~PLUGIN_IS_FREED, table)) DBUG_RETURN(1); - + DBUG_RETURN(0); } diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index de8b50fd2f3..3029b1db53e 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -1583,7 +1583,9 @@ mysql_declare_plugin(archive) archive_db_init, /* Plugin Init */ archive_db_done, /* Plugin Deinit */ 0x0100 /* 1.0 */, - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/storage/blackhole/ha_blackhole.cc b/storage/blackhole/ha_blackhole.cc index d22d9372e0d..c1141cce5ae 100644 --- a/storage/blackhole/ha_blackhole.cc +++ b/storage/blackhole/ha_blackhole.cc @@ -223,6 +223,8 @@ mysql_declare_plugin(blackhole) blackhole_init, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100 /* 1.0 */, - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc index 2fe2afeb470..ce19202d745 100644 --- a/storage/csv/ha_tina.cc +++ b/storage/csv/ha_tina.cc @@ -1529,7 +1529,9 @@ mysql_declare_plugin(csv) tina_init_func, /* Plugin Init */ tina_done_func, /* Plugin Deinit */ 0x0100 /* 1.0 */, - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/storage/example/ha_example.cc b/storage/example/ha_example.cc index 704ea757749..6986796cb2e 100644 --- a/storage/example/ha_example.cc +++ b/storage/example/ha_example.cc @@ -715,7 +715,9 @@ mysql_declare_plugin(example) example_init_func, /* Plugin Init */ example_done_func, /* Plugin Deinit */ 0x0001 /* 0.1 */, - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/storage/federated/ha_federated.cc b/storage/federated/ha_federated.cc index 98f48b09ba6..456b6c73f3c 100644 --- a/storage/federated/ha_federated.cc +++ b/storage/federated/ha_federated.cc @@ -2896,7 +2896,9 @@ mysql_declare_plugin(federated) federated_db_init, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100 /* 1.0 */, - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/storage/heap/ha_heap.cc b/storage/heap/ha_heap.cc index 317f85d26f2..57777410bea 100644 --- a/storage/heap/ha_heap.cc +++ b/storage/heap/ha_heap.cc @@ -708,6 +708,8 @@ mysql_declare_plugin(heap) heap_init, NULL, 0x0100, /* 1.0 */ - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 209478ee9a5..6a32ba95eee 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -1800,7 +1800,9 @@ mysql_declare_plugin(myisam) myisam_init, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100, /* 1.0 */ - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; diff --git a/storage/myisammrg/ha_myisammrg.cc b/storage/myisammrg/ha_myisammrg.cc index 8c767e32b83..2d1628e5e4f 100644 --- a/storage/myisammrg/ha_myisammrg.cc +++ b/storage/myisammrg/ha_myisammrg.cc @@ -573,6 +573,8 @@ mysql_declare_plugin(myisammrg) myisammrg_init, /* Plugin Init */ NULL, /* Plugin Deinit */ 0x0100, /* 1.0 */ - 0 + NULL, /* status variables */ + NULL, /* system variables */ + NULL /* config options */ } mysql_declare_plugin_end; |