|
|
|
@ -42,9 +42,8 @@ extern struct st_mysql_plugin *mysql_mandatory_plugins[]; |
|
|
|
@note The order of the enumeration is critical. |
|
|
|
@see construct_options |
|
|
|
*/ |
|
|
|
static const char *global_plugin_typelib_names[]= |
|
|
|
{ "OFF", "ON", "FORCE", NULL }; |
|
|
|
enum enum_plugin_load_policy {PLUGIN_OFF, PLUGIN_ON, PLUGIN_FORCE}; |
|
|
|
const char *global_plugin_typelib_names[]= |
|
|
|
{ "OFF", "ON", "FORCE", "FORCE_PLUS_PERMANENT", NULL }; |
|
|
|
static TYPELIB global_plugin_typelib= |
|
|
|
{ array_elements(global_plugin_typelib_names)-1, |
|
|
|
"", global_plugin_typelib_names, NULL }; |
|
|
|
@ -800,6 +799,7 @@ static bool plugin_add(MEM_ROOT *tmp_root, |
|
|
|
tmp.name.length= name_len; |
|
|
|
tmp.ref_count= 0; |
|
|
|
tmp.state= PLUGIN_IS_UNINITIALIZED; |
|
|
|
tmp.load_option= PLUGIN_ON; |
|
|
|
if (test_plugin_options(tmp_root, &tmp, argc, argv)) |
|
|
|
tmp.state= PLUGIN_IS_DISABLED; |
|
|
|
|
|
|
|
@ -1241,7 +1241,7 @@ int plugin_init(int *argc, char **argv, int flags) |
|
|
|
tmp.name.str= (char *)plugin->name; |
|
|
|
tmp.name.length= strlen(plugin->name); |
|
|
|
tmp.state= 0; |
|
|
|
tmp.is_mandatory= mandatory; |
|
|
|
tmp.load_option= mandatory ? PLUGIN_FORCE : PLUGIN_ON; |
|
|
|
|
|
|
|
/*
|
|
|
|
If the performance schema is compiled in, |
|
|
|
@ -1260,7 +1260,7 @@ int plugin_init(int *argc, char **argv, int flags) |
|
|
|
to work, by using '--skip-performance-schema' (the plugin) |
|
|
|
*/ |
|
|
|
if (!my_strcasecmp(&my_charset_latin1, plugin->name, "PERFORMANCE_SCHEMA")) |
|
|
|
tmp.is_mandatory= true; |
|
|
|
tmp.load_option= PLUGIN_FORCE; |
|
|
|
|
|
|
|
free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE)); |
|
|
|
if (test_plugin_options(&tmp_root, &tmp, argc, argv)) |
|
|
|
@ -1338,7 +1338,8 @@ int plugin_init(int *argc, char **argv, int flags) |
|
|
|
while ((plugin_ptr= *(--reap))) |
|
|
|
{ |
|
|
|
mysql_mutex_unlock(&LOCK_plugin); |
|
|
|
if (plugin_ptr->is_mandatory) |
|
|
|
if (plugin_ptr->load_option == PLUGIN_FORCE || |
|
|
|
plugin_ptr->load_option == PLUGIN_FORCE_PLUS_PERMANENT) |
|
|
|
reaped_mandatory_plugin= TRUE; |
|
|
|
plugin_deinitialize(plugin_ptr, true); |
|
|
|
mysql_mutex_lock(&LOCK_plugin); |
|
|
|
@ -1848,6 +1849,11 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name) |
|
|
|
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
if (plugin->load_option == PLUGIN_FORCE_PLUS_PERMANENT) |
|
|
|
{ |
|
|
|
my_error(ER_PLUGIN_IS_PERMANENT, MYF(0), name->str); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
plugin->state= PLUGIN_IS_DELETED; |
|
|
|
if (plugin->ref_count) |
|
|
|
@ -3058,7 +3064,8 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp, |
|
|
|
plugin_dash.length + 1); |
|
|
|
strxmov(plugin_name_with_prefix_ptr, plugin_dash.str, plugin_name_ptr, NullS); |
|
|
|
|
|
|
|
if (!tmp->is_mandatory) |
|
|
|
if (tmp->load_option != PLUGIN_FORCE && |
|
|
|
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) |
|
|
|
{ |
|
|
|
/* support --skip-plugin-foo syntax */ |
|
|
|
options[0].name= plugin_name_ptr; |
|
|
|
@ -3318,7 +3325,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, |
|
|
|
{ |
|
|
|
struct sys_var_chain chain= { NULL, NULL }; |
|
|
|
bool disable_plugin; |
|
|
|
enum_plugin_load_policy plugin_load_policy= tmp->is_mandatory ? PLUGIN_FORCE : PLUGIN_ON; |
|
|
|
enum_plugin_load_option plugin_load_option= tmp->load_option; |
|
|
|
|
|
|
|
MEM_ROOT *mem_root= alloc_root_inited(&tmp->mem_root) ? |
|
|
|
&tmp->mem_root : &plugin_mem_root; |
|
|
|
@ -3339,7 +3346,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, |
|
|
|
*/ |
|
|
|
if (!(my_strcasecmp(&my_charset_latin1, tmp->name.str, "federated") && |
|
|
|
my_strcasecmp(&my_charset_latin1, tmp->name.str, "ndbcluster"))) |
|
|
|
plugin_load_policy= PLUGIN_OFF; |
|
|
|
plugin_load_option= PLUGIN_OFF; |
|
|
|
|
|
|
|
for (opt= tmp->plugin->system_vars; opt && *opt; opt++) |
|
|
|
count+= 2; /* --{plugin}-{optname} and --plugin-{plugin}-{optname} */ |
|
|
|
@ -3363,8 +3370,9 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, |
|
|
|
We adjust the default value to account for the hardcoded exceptions |
|
|
|
we have set for the federated and ndbcluster storage engines. |
|
|
|
*/ |
|
|
|
if (!tmp->is_mandatory) |
|
|
|
opts[0].def_value= opts[1].def_value= plugin_load_policy; |
|
|
|
if (tmp->load_option != PLUGIN_FORCE && |
|
|
|
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) |
|
|
|
opts[0].def_value= opts[1].def_value= plugin_load_option; |
|
|
|
|
|
|
|
error= handle_options(argc, &argv, opts, NULL); |
|
|
|
(*argc)++; /* add back one for the program name */ |
|
|
|
@ -3379,12 +3387,13 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, |
|
|
|
Set plugin loading policy from option value. First element in the option |
|
|
|
list is always the <plugin name> option value. |
|
|
|
*/ |
|
|
|
if (!tmp->is_mandatory) |
|
|
|
plugin_load_policy= (enum_plugin_load_policy)*(ulong*)opts[0].value; |
|
|
|
if (tmp->load_option != PLUGIN_FORCE && |
|
|
|
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT) |
|
|
|
plugin_load_option= (enum_plugin_load_option) *(ulong*) opts[0].value; |
|
|
|
} |
|
|
|
|
|
|
|
disable_plugin= (plugin_load_policy == PLUGIN_OFF); |
|
|
|
tmp->is_mandatory= (plugin_load_policy == PLUGIN_FORCE); |
|
|
|
disable_plugin= (plugin_load_option == PLUGIN_OFF); |
|
|
|
tmp->load_option= plugin_load_option; |
|
|
|
|
|
|
|
/*
|
|
|
|
If the plugin is disabled it should not be initialized. |
|
|
|
|