summaryrefslogtreecommitdiff
path: root/sql/sql_plugin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_plugin.cc')
-rw-r--r--sql/sql_plugin.cc74
1 files changed, 73 insertions, 1 deletions
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 66b0b810717..874e3943e10 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -1229,7 +1229,17 @@ static void reap_plugins(void)
list= reap;
while ((plugin= *(--list)))
- plugin_deinitialize(plugin, true);
+ {
+ if (plugin->plugin->type != MYSQL_KEY_MANAGEMENT_PLUGIN)
+ plugin_deinitialize(plugin, true);
+ }
+
+ list= reap;
+ while ((plugin= *(--list)))
+ {
+ if (plugin->plugin->type == MYSQL_KEY_MANAGEMENT_PLUGIN)
+ plugin_deinitialize(plugin, true);
+ }
mysql_mutex_lock(&LOCK_plugin);
@@ -1529,6 +1539,65 @@ int plugin_init(int *argc, char **argv, int flags)
/*
First we register builtin plugins
*/
+ mandatory = false;
+ for (builtins= mysql_optional_plugins; *builtins; builtins++)
+ {
+ for (plugin= *builtins; plugin->info; plugin++)
+ {
+ if (opt_ignore_builtin_innodb &&
+ !my_strnncoll(&my_charset_latin1, (const uchar*) plugin->name,
+ 6, (const uchar*) "InnoDB", 6))
+ continue;
+
+ if (plugin->type != MYSQL_KEY_MANAGEMENT_PLUGIN)
+ continue;
+
+ bzero(&tmp, sizeof(tmp));
+ tmp.plugin= plugin;
+ tmp.name.str= (char *)plugin->name;
+ tmp.name.length= strlen(plugin->name);
+ tmp.state= 0;
+ tmp.load_option= mandatory ? PLUGIN_FORCE : PLUGIN_ON;
+
+ for (i=0; i < array_elements(override_plugin_load_policy); i++)
+ {
+ if (!my_strcasecmp(&my_charset_latin1, plugin->name,
+ override_plugin_load_policy[i].plugin_name))
+ {
+ tmp.load_option= override_plugin_load_policy[i].override;
+ break;
+ }
+ }
+
+ free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE));
+ tmp.state= PLUGIN_IS_UNINITIALIZED;
+ if (register_builtin(plugin, &tmp, &plugin_ptr))
+ goto err_unlock;
+
+ is_myisam= !my_strcasecmp(&my_charset_latin1, plugin->name, "MyISAM");
+
+ if (plugin_initialize(&tmp_root, plugin_ptr, argc, argv, !is_myisam &&
+ (flags & PLUGIN_INIT_SKIP_INITIALIZATION)))
+ {
+ if (plugin_ptr->load_option == PLUGIN_FORCE)
+ goto err_unlock;
+ plugin_ptr->state= PLUGIN_IS_DISABLED;
+ }
+
+ if (is_myisam)
+ {
+ DBUG_ASSERT(!global_system_variables.table_plugin);
+ global_system_variables.table_plugin=
+ intern_plugin_lock(NULL, plugin_int_to_ref(plugin_ptr));
+ DBUG_ASSERT(plugin_ptr->ref_count == 1);
+ }
+ }
+ }
+
+ /*
+ First we register builtin plugins
+ */
+ mandatory = true;
for (builtins= mysql_mandatory_plugins; *builtins || mandatory; builtins++)
{
if (!*builtins)
@@ -1545,6 +1614,9 @@ int plugin_init(int *argc, char **argv, int flags)
6, (const uchar*) "InnoDB", 6))
continue;
+ if (plugin->type == MYSQL_KEY_MANAGEMENT_PLUGIN)
+ continue;
+
bzero(&tmp, sizeof(tmp));
tmp.plugin= plugin;
tmp.name.str= (char *)plugin->name;