Every plugin library that contains server plugins must include a library descriptor that contains the general plugin descriptor for each server plugin in the file. This section discusses how to write the library and general descriptors for server plugins.
The library descriptor must define two symbols:
_mysql_plugin_interface_version_
specifies the version number of the general plugin framework. This is given by theMYSQL_PLUGIN_INTERFACE_VERSION
symbol, which is defined in theplugin.h
file._mysql_plugin_declarations_
defines an array of plugin declarations, terminated by a declaration with all members set to 0. Each declaration is an instance of thest_mysql_plugin
structure (also defined inplugin.h
). There must be one of these for each server plugin in the library.
If the server does not find those two symbols in a library, it does not accept it as a legal plugin library and rejects it with an error. This prevents use of a library for plugin purposes unless it was built specifically as a plugin library.
The conventional way to define the two required symbols is
by using the mysql_declare_plugin()
and
mysql_declare_plugin_end
macros from the
plugin.h
file:
mysql_declare_plugin(name)
... one or more server plugin descriptors here ...
mysql_declare_plugin_end;
Each server plugin must have a general descriptor that
provides information to the server plugin API. The general
descriptor has the same structure for all plugin types. The
st_mysql_plugin
structure in the
plugin.h
file defines this descriptor:
struct st_mysql_plugin
{
int type; /* the plugin type (a MYSQL_XXX_PLUGIN value) */
void *info; /* pointer to type-specific plugin descriptor */
const char *name; /* plugin name */
const char *author; /* plugin author (for I_S.PLUGINS) */
const char *descr; /* general descriptive text (for I_S.PLUGINS) */
int license; /* the plugin license (PLUGIN_LICENSE_XXX) */
int (*init)(void *); /* the function to invoke when plugin is loaded */
int (*deinit)(void *);/* the function to invoke when plugin is unloaded */
unsigned int version; /* plugin version (for I_S.PLUGINS) */
struct st_mysql_show_var *status_vars;
struct st_mysql_sys_var **system_vars;
void * __reserved1; /* reserved for dependency checking */
unsigned long flags; /* flags for plugin */
};
The st_mysql_plugin
descriptor structure
members are used as follows. char *
members should be specified as null-terminated strings.
-
type
: The plugin type. This must be one of the plugin-type values fromplugin.h
:/* The allowable types of plugins */ #define MYSQL_UDF_PLUGIN 0 /* User-defined function */ #define MYSQL_STORAGE_ENGINE_PLUGIN 1 /* Storage Engine */ #define MYSQL_FTPARSER_PLUGIN 2 /* Full-text parser plugin */ #define MYSQL_DAEMON_PLUGIN 3 /* The daemon/raw plugin type */ #define MYSQL_INFORMATION_SCHEMA_PLUGIN 4 /* The I_S plugin type */ #define MYSQL_AUDIT_PLUGIN 5 /* The Audit plugin type */ #define MYSQL_REPLICATION_PLUGIN 6 /* The replication plugin type */ #define MYSQL_AUTHENTICATION_PLUGIN 7 /* The authentication plugin type */ #define MYSQL_VALIDATE_PASSWORD_PLUGIN 8 /* validate password plugin type */ #define MYSQL_GROUP_REPLICATION_PLUGIN 9 /* The Group Replication plugin */ #define MYSQL_KEYRING_PLUGIN 10 /* The Keyring plugin type */ #define MYSQL_CLONE_PLUGIN 11 /* The Clone plugin type */
For example, for a full-text parser plugin, the
type
value isMYSQL_FTPARSER_PLUGIN
. info
: A pointer to the type-specific descriptor for the plugin. This descriptor's structure depends on the particular type of plugin, unlike that of the general plugin descriptor structure. For version-control purposes, the first member of the type-specific descriptor for every plugin type is expected to be the interface version for the type. This enables the server to check the type-specific version for every plugin no matter its type. Following the version number, the descriptor includes any other members needed, such as callback functions and other information needed by the server to invoke the plugin properly. Later sections on writing particular types of server plugins describe the structure of their type-specific descriptors.-
name
: A string that gives the plugin name. This is the name that will be listed in themysql.plugin
table and by which you refer to the plugin in SQL statements such asINSTALL PLUGIN
andUNINSTALL PLUGIN
, or with the--plugin-load
option. The name is also visible in theINFORMATION_SCHEMA.PLUGINS
table or the output fromSHOW PLUGINS
.The plugin name should not begin with the name of any server option. If it does, the server will fail to initialize it. For example, the server has a
--socket
option, so you should not use a plugin name such assocket
,socket_plugin
, and so forth. author
: A string naming the plugin author. This can be whatever you like.desc
: A string that provides a general description of the plugin. This can be whatever you like.license
: The plugin license type. The value can be one ofPLUGIN_LICENSE_PROPRIETARY
,PLUGIN_LICENSE_GPL
, orPLUGIN_LICENSE_BSD
.init
: A once-only initialization function, orNULL
if there is no such function. The server executes this function when it loads the plugin, which happens forINSTALL PLUGIN
or, for plugins listed in themysql.plugin
table, at server startup. The function takes one argument that points to the internal structure used to identify the plugin. It returns zero for success and nonzero for failure.deinit
: A once-only deinitialization function, orNULL
if there is no such function. The server executes this function when it unloads the plugin, which happens forUNINSTALL PLUGIN
or, for plugins listed in themysql.plugin
table, at server shutdown. The function takes one argument that points to the internal structure used to identify the plugin It returns zero for success and nonzero for failure.version
: The plugin version number. When the plugin is installed, this value can be retrieved from theINFORMATION_SCHEMA.PLUGINS
table. The value includes major and minor numbers. If you write the value as a hex constant, the format is0x
, whereMMNN
MM
andNN
are the major and minor numbers, respectively. For example,0x0302
represents version 3.2.-
status_vars
: A pointer to a structure for status variables associated with the plugin, orNULL
if there are no such variables. When the plugin is installed, these variables are displayed in the output of theSHOW STATUS
statement.The
status_vars
member, if notNULL
, points to an array ofst_mysql_show_var
structures that describe status variables. See Section 4.4.2.2, “Server Plugin Status and System Variables”. -
system_vars
: A pointer to a structure for system variables associated with the plugin, orNULL
if there are no such variables. These options and system variables can be used to help initialize variables within the plugin. When the plugin is installed, these variables are displayed in the output of theSHOW VARIABLES
statement.The
system_vars
member, if notNULL
, points to an array ofst_mysql_sys_var
structures that describe system variables. See Section 4.4.2.2, “Server Plugin Status and System Variables”. __reserved1
: A placeholder for the future. It should be set toNULL
.-
flags
: Plugin flags. Individual bits correspond to different flags. The value should be set to the OR of the applicable flags. These flags are available:#define PLUGIN_OPT_NO_INSTALL 1UL /* Not dynamically loadable */ #define PLUGIN_OPT_NO_UNINSTALL 2UL /* Not dynamically unloadable */ #define PLUGIN_OPT_ALLOW_EARLY 4UL /* allow --early-plugin-load */
The flags have the following meanings when enabled:
PLUGIN_OPT_NO_INSTALL
: The plugin cannot be loaded at runtime with theINSTALL PLUGIN
statement. This is appropriate for plugins that must be loaded at server startup with the--plugin-load
,--plugin-load-add
, or--early-plugin-load
option.PLUGIN_OPT_NO_UNINSTALL
: The plugin cannot be unloaded at runtime with theUNINSTALL PLUGIN
statement.PLUGIN_OPT_ALLOW_EARLY
: The plugin can be loaded early in the server startup sequence with the--early-plugin-load
option. This flag has no effect on whether a plugin can be loaded at server startup with the--plugin-load
or--plugin-load-add
option, or at runtime with theINSTALL PLUGIN
statement.
The server invokes the init
and
deinit
functions in the general plugin
descriptor only when loading and unloading the plugin. They
have nothing to do with use of the plugin such as happens
when an SQL statement causes the plugin to be invoked.
For example, the descriptor information for a library that
contains a single full-text parser plugin named
simple_parser
looks like this:
mysql_declare_plugin(ftexample)
{
MYSQL_FTPARSER_PLUGIN, /* type */
&simple_parser_descriptor, /* descriptor */
"simple_parser", /* name */
"Oracle Corporation", /* author */
"Simple Full-Text Parser", /* description */
PLUGIN_LICENSE_GPL, /* plugin license */
simple_parser_plugin_init, /* init function (when loaded) */
simple_parser_plugin_deinit,/* deinit function (when unloaded) */
0x0001, /* version */
simple_status, /* status variables */
simple_system_variables, /* system variables */
NULL,
0
}
mysql_declare_plugin_end;
For a full-text parser plugin, the type must be
MYSQL_FTPARSER_PLUGIN
. This is the value
that identifies the plugin as being legal for use in a
WITH PARSER
clause when creating a
FULLTEXT
index. (No other plugin type is
legal for this clause.)
plugin.h
defines the
mysql_declare_plugin()
and
mysql_declare_plugin_end
macros like
this:
#ifndef MYSQL_DYNAMIC_PLUGIN
#define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \
MYSQL_PLUGIN_EXPORT int VERSION= MYSQL_PLUGIN_INTERFACE_VERSION; \
MYSQL_PLUGIN_EXPORT int PSIZE= sizeof(struct st_mysql_plugin); \
MYSQL_PLUGIN_EXPORT struct st_mysql_plugin DECLS[]= {
#else
#define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \
MYSQL_PLUGIN_EXPORT int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; \
MYSQL_PLUGIN_EXPORT int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); \
MYSQL_PLUGIN_EXPORT struct st_mysql_plugin _mysql_plugin_declarations_[]= {
#endif
#define mysql_declare_plugin(NAME) \
__MYSQL_DECLARE_PLUGIN(NAME, \
builtin_ ## NAME ## _plugin_interface_version, \
builtin_ ## NAME ## _sizeof_struct_st_plugin, \
builtin_ ## NAME ## _plugin)
#define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0,0,0}}
Those declarations define the
_mysql_plugin_interface_version_
symbol
only if the MYSQL_DYNAMIC_PLUGIN
symbol
is defined. This means that
-DMYSQL_DYNAMIC_PLUGIN
must be provided
as part of the compilation command to build the plugin as
a shared library.
When the macros are used as just shown, they expand to the
following code, which defines both of the required symbols
(_mysql_plugin_interface_version_
and
_mysql_plugin_declarations_
):
int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION;
int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin);
struct st_mysql_plugin _mysql_plugin_declarations_[]= {
{
MYSQL_FTPARSER_PLUGIN, /* type */
&simple_parser_descriptor, /* descriptor */
"simple_parser", /* name */
"Oracle Corporation", /* author */
"Simple Full-Text Parser", /* description */
PLUGIN_LICENSE_GPL, /* plugin license */
simple_parser_plugin_init, /* init function (when loaded) */
simple_parser_plugin_deinit,/* deinit function (when unloaded) */
0x0001, /* version */
simple_status, /* status variables */
simple_system_variables, /* system variables */
NULL,
0
}
,{0,0,0,0,0,0,0,0,0,0,0,0}}
};
The preceding example declares a single plugin in the
general descriptor, but it is possible to declare multiple
plugins. List the declarations one after the other between
mysql_declare_plugin()
and
mysql_declare_plugin_end
, separated by
commas.
MySQL server plugins must be compiled as C++ code. One C++
feature that you should not use is nonconstant variables to
initialize global structures. Members of structures such as
the st_mysql_plugin
structure should be
initialized only with constant variables. The
simple_parser
descriptor shown earlier is
permissible in a C++ plugin because it satisfies that
requirement:
mysql_declare_plugin(ftexample)
{
MYSQL_FTPARSER_PLUGIN, /* type */
&simple_parser_descriptor, /* descriptor */
"simple_parser", /* name */
"Oracle Corporation", /* author */
"Simple Full-Text Parser", /* description */
PLUGIN_LICENSE_GPL, /* plugin license */
simple_parser_plugin_init, /* init function (when loaded) */
simple_parser_plugin_deinit,/* deinit function (when unloaded) */
0x0001, /* version */
simple_status, /* status variables */
simple_system_variables, /* system variables */
NULL,
0
}
mysql_declare_plugin_end;
Here is another valid way to write the general descriptor. It uses constant variables to indicate the plugin name, author, and description:
const char *simple_parser_name = "simple_parser";
const char *simple_parser_author = "Oracle Corporation";
const char *simple_parser_description = "Simple Full-Text Parser";
mysql_declare_plugin(ftexample)
{
MYSQL_FTPARSER_PLUGIN, /* type */
&simple_parser_descriptor, /* descriptor */
simple_parser_name, /* name */
simple_parser_author, /* author */
simple_parser_description, /* description */
PLUGIN_LICENSE_GPL, /* plugin license */
simple_parser_plugin_init, /* init function (when loaded) */
simple_parser_plugin_deinit,/* deinit function (when unloaded) */
0x0001, /* version */
simple_status, /* status variables */
simple_system_variables, /* system variables */
NULL,
0
}
mysql_declare_plugin_end;
However, the following general descriptor is invalid. It uses structure members to indicate the plugin name, author, and description, but structures are not considered constant initializers in C++:
typedef struct
{
const char *name;
const char *author;
const char *description;
} plugin_info;
plugin_info parser_info = {
"simple_parser",
"Oracle Corporation",
"Simple Full-Text Parser"
};
mysql_declare_plugin(ftexample)
{
MYSQL_FTPARSER_PLUGIN, /* type */
&simple_parser_descriptor, /* descriptor */
parser_info.name, /* name */
parser_info.author, /* author */
parser_info.description, /* description */
PLUGIN_LICENSE_GPL, /* plugin license */
simple_parser_plugin_init, /* init function (when loaded) */
simple_parser_plugin_deinit,/* deinit function (when unloaded) */
0x0001, /* version */
simple_status, /* status variables */
simple_system_variables, /* system variables */
NULL,
0
}
mysql_declare_plugin_end;