Commit c7baf602 authored by brian@zim.(none)'s avatar brian@zim.(none)

Merge baker@bk-internal.mysql.com:/home/bk/mysql-5.1

into  zim.(none):/tmp/mysql-5.1-arch
parents e1c245bf b5fdcc29
......@@ -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 */
};
/*************************************************************************
......
......@@ -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;
......@@ -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;
......@@ -6389,6 +6389,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)
......@@ -10598,7 +10600,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;
......
......@@ -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;
......
......@@ -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);
}
......
......@@ -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);
};
......
......@@ -4678,6 +4678,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;
......@@ -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
......
......@@ -63,6 +63,10 @@ static HASH plugin_hash[MYSQL_MAX_PLUGIN_TYPE_NUM];
static rw_lock_t THR_LOCK_plugin;
static bool initialized= 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;
......@@ -442,15 +446,6 @@ 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;
if (my_hash_insert(&plugin_hash[plugin->type], (byte*)tmp_plugin_ptr))
......@@ -466,26 +461,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,6 +476,31 @@ 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;
......@@ -523,6 +530,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 +567,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 +621,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,7 +630,14 @@ 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;
struct st_mysql_plugin **builtins;
......@@ -672,24 +662,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 +746,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 +782,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 +796,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 +861,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);
......
......@@ -67,17 +67,14 @@ 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);
......
......@@ -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;
......@@ -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;
......@@ -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;
......@@ -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;
......@@ -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;
......@@ -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;
......@@ -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;
......@@ -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;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment