• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 插件数据结构

    插件库文件包含描述符信息,以指示其包含哪些插件。

    如果插件库包含任何服务器插件,则它必须包含以下描述符信息:

    • 库描述符指示库使用的常规服务器插件API版本号,并包含库中每个服务器插件的常规插件描述符。要提供此描述符的框架,请从头plugin.h文件中调用两个宏:

      mysql_declare_plugin(name)
       ... one or more server plugin descriptors here ...
      mysql_declare_plugin_end;
      

      宏将展开以自动提供API版本的声明。您必须提供插件描述符。

    • 在库描述符中,每个通用服务器插件均由st_mysql_plugin结构描述。该插件描述符结构包含每种服务器插件类型共有的信息:指示插件类型的值;插件名称,作者,描述和许可证类型;指向服务器在加载和卸载插件时调用的初始化和反初始化函数的指针,以及指向插件实现的任何状态或系统变量的指针。
    • 库描述符中的每个常规服务器插件描述符还包含一个指向特定于类型的插件描述符的指针。特定于类型的描述符的结构因一种插件类型而异,因为每种插件类型都可以具有自己的API。特定于类型的插件描述符包含特定于类型的API版本号和指向实现该插件类型所需的功能的指针。例如,全文分析器插件具有初始化和反初始化功能,以及主要的分析功能。服务器在使用插件解析文本时会调用这些功能。

    插件库还包含接口函数,该函数由库中每个插件的常规和特定于类型的描述符引用。

    如果插件库包含客户端插件,则它必须包含该插件的描述符。描述符以所有客户端插件共有的一组固定成员开头,然后是该插件类型专有的所有成员。要提供描述符框架,请从头client_plugin.h文件中调用两个宏:

    mysql_declare_client_plugin(plugin_type)
       ... members common to all client plugins ...
       ... type-specific extra members ...
    mysql_end_client_plugin;
    

    插件库还包含客户端描述符引用的所有接口函数。

    mysql_declare_plugin()mysql_declare_client_plugin()宏在它们如何被调用,这对插件库的内容含义有所不同。以下准则概述了规则:

    • mysql_declare_plugin()并且mysql_declare_client_plugin()都可以在同一个源文件中使用,这意味着插件库可以同时包含服务器插件和客户端插件。但是,mysql_declare_plugin()mysql_declare_client_plugin()最多只能使用一次。
    • mysql_declare_plugin()允许多个服务器插件声明,因此插件库可以包含多个服务器插件。
    • mysql_declare_client_plugin()只允许一个客户端插件声明。要创建多个客户端插件,必须使用单独的插件库。

    当客户端程序查找位于插件库中且未内置的客户端插件时libmysqlclient,它将查找基名称与插件名称相同的文件。例如,如果程序需要使用auth_xxx.so用作库后缀的系统上命名的客户端身份验证插件,则它将在名为的文件中查找auth_xxx.so。(在macOS上,程序首先寻找auth_xxx.dylib,然后寻找auth_xxx.so。)因此,如果插件库包含客户端插件,则该库必须具有与该插件相同的基本名称。

    对于包含服务器插件的库,情况并非如此。该--plugin-load选项和INSTALL PLUGIN语句显式提供了库文件名,因此库名与其包含的任何服务器插件的名称之间都不需要明确的关系。

    服务器插件库和插件描述符

    每个包含服务器插件的插件库都必须包含一个库描述符,该描述符包含文件中每个服务器插件的常规插件描述符。本节讨论如何编写服务器插件的库和常规描述符。

    库描述符必须定义两个符号:

    • _mysql_plugin_interface_version_指定常规插件框架的版本号。这由文件中MYSQL_PLUGIN_INTERFACE_VERSION定义的符号给出plugin.h
    • _mysql_plugin_declarations_定义一个插件声明数组,该声明声明的声明将所有成员均设置为0终止。每个声明都是该st_mysql_plugin结构的实例(也在中定义plugin.h)。库中的每个服务器插件必须有一个。

    如果服务器在库中找不到这两个符号,则它不会将其接受为合法的插件库,并会错误地拒绝它。除非将库专门作为插件库构建,否则这将阻止将库用于插件目的。

    定义两个必需符号的常规方法是使用文件中的mysql_declare_plugin()mysql_declare_plugin_endplugin.h

    mysql_declare_plugin(name)
     ... one or more server plugin descriptors here ...
    mysql_declare_plugin_end;
    

    每个服务器插件必须具有向服务器插件API提供信息的通用描述符。对于所有插件类型,通用描述符具有相同的结构。文件中的st_mysql_plugin结构plugin.h定义了此描述符:

    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 */
    };
    

    st_mysql_plugin描述符结构构件被使用如下。char *成员应指定为以null终止的字符串。

    • type:插件类型。这必须是来自的插件类型值之一plugin.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 */
      ...
      

      例如,对于全文分析器插件,该type值为MYSQL_FTPARSER_PLUGIN

    • info:指向插件的特定于类型的描述符的指针。与通用插件描述符结构不同,此描述符的结构取决于插件的特定类型。出于版本控制的目的,每个插件类型的特定于类型的描述符的第一个成员应该是该类型的接口版本。这使服务器能够检查每个插件的特定于类型的版本,无论其类型如何。在版本号之后,描述符包括所需的任何其他成员,例如回调函数和服务器正确调用插件所需的其他信息。
    • name: A string that gives the plugin name. This is the name that will be listed in the mysql.plugin table and by which you refer to the plugin in SQL statements such as INSTALL PLUGIN and UNINSTALL PLUGIN, or with the --plugin-load option. The name is also visible in the INFORMATION_SCHEMA.PLUGINS table or the output from SHOW PLUGINS.

      插件名称不应以任何服务器选项的名称开头。如果是这样,服务器将无法初始化它。例如,服务器有一个--socket选项,因此您不应使用插件名称,如socketsocket_plugin等等。

    • author:命名插件作者的字符串。这可以随便你。
    • desc:提供插件概述的字符串。这可以随便你。
    • license:插件许可证类型。该值可以是一个PLUGIN_LICENSE_PROPRIETARYPLUGIN_LICENSE_GPLPLUGIN_LICENSE_BSD
    • init:仅一次初始化函数,或者NULL如果没有这样的函数。服务器在加载插件时执行此功能,这在服务器启动时发生INSTALL PLUGINmysql.plugin表中列出的插件中。该函数采用一个参数,该参数指向用于标识插件的内部结构。成功返回零,失败返回非零。
    • deinit:仅一次取消初始化功能,或者NULL如果没有这样的功能。服务器在卸载插件时执行此功能,这种情况发生在服务器关闭时UNINSTALL PLUGIN或对于mysql.plugin表中列出的插件。该函数采用一个参数,该参数指向用于标识插件的内部结构。成功返回零,失败返回非零。
    • version:插件版本号。安装插件后,可以从INFORMATION_SCHEMA.PLUGINS表中检索此值。该值包括主要和次要数字。如果将值写为十六进制常量,则格式为,其中和分别是大数和小数。例如,代表版本3.2。0xMMNNMMNN0x0302
    • status_vars:指向与插件相关联的状态变量或NULL没有此类变量的状态的结构的指针。安装插件后,这些变量将显示在SHOW STATUS语句的输出中。

      status_vars如果不是,则该成员NULL指向st_mysql_show_var描述状态变量的结构数组。请参见“服务器插件状态和系统变量”。

    • system_vars:指向与插件关联的系统变量或NULL没有此类变量的结构的指针。这些选项和系统变量可用于帮助初始化插件中的变量。安装插件后,这些变量将显示在SHOW VARIABLES语句的输出中。

      system_vars如果不是,则该成员NULL指向st_mysql_sys_var描述系统变量的结构数组。请参见“服务器插件状态和系统变量”。

    • __reserved1:未来的占位符。应该设置为NULL
    • flags:插件标志。各个位对应于不同的标志。该值应设置为适用标志的“或”。这些标志可用:

      #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 */
      

      启用时,这些标志具有以下含义:

      • PLUGIN_OPT_NO_INSTALL:插件无法在运行时使用该INSTALL PLUGIN语句加载。这是适当的,必须在与服务器启动时加载的插件--plugin-load--plugin-load-add--early-plugin-load选择。
      • PLUGIN_OPT_NO_UNINSTALL:不能在运行时使用以下UNINSTALL PLUGIN语句卸载插件。
      • PLUGIN_OPT_ALLOW_EARLY:可以使用--early-plugin-load选项在服务器启动顺序的早期加载插件。此标志对在服务器启动时使用--plugin-load--plugin-load-add选项或在运行时使用该INSTALL PLUGIN语句加载插件无效。

        该标志是在MySQL 8.0.17中添加的。使用8.0.17之前的MySQL发行版编译的所有插件都未设置此标志。将它们加载到8.0.17之前的服务器中时,这没有关系,但是尝试使用--early-plugin-load 8.0.17之前的MySQL发行版编译的插件二进制文件加载到8.0.17或更高版本的服务器中将会失败。必须针对MySQL 8.0.17或更高版本重新编译插件。

    服务器仅在加载和卸载插件时才在通用插件描述符中调用initdeinit函数。它们与插件的使用无关,例如当SQL语句导致调用插件时发生的情况。

    例如,包含单个名为的全文分析器插件的库的描述符信息simple_parser如下所示:

    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;
    

    对于全文分析器插件,类型必须为MYSQL_FTPARSER_PLUGIN。这是一个值,用于在WITH PARSER创建FULLTEXT索引时将插件标识为在子句中合法使用的值。(此条款没有其他插件类型合法。)

    plugin.h定义mysql_declare_plugin()mysql_declare_plugin_end宏,如下所示:

    #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}}
    
    注意

    _mysql_plugin_interface_version_仅当定义了符号时,这些声明才定义符号MYSQL_DYNAMIC_PLUGIN。这意味着-DMYSQL_DYNAMIC_PLUGIN必须将其作为编译命令的一部分提供,以将插件构建为共享库。

    如图所示使用宏时,它们将扩展为以下代码,该代码定义了两个必需的符号(_mysql_plugin_interface_version__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}}
    };
    

    前面的示例在常规描述符中声明了一个插件,但是可以声明多个插件。在mysql_declare_plugin()mysql_declare_plugin_end之间以逗号分隔列出声明。

    MySQL服务器插件必须编译为C ++代码。您不应该使用的一种C ++功能是非常数变量,用于初始化全局结构。结构成员(例如st_mysql_plugin结构)应仅使用常量变量进行初始化。simple_parser前面显示的描述符在C ++插件中是允许的,因为它满足了以下要求:

    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;
    

    这是编写通用描述符的另一种有效方法。它使用常量变量来指示插件名称,作者和描述:

    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;
    

    但是,以下通用描述符无效。它使用结构成员来指示插件名称,作者和描述,但是在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;
    

    服务器插件状态和系统变量

    服务器插件界面使插件可以使用常规插件描述符的status_varssystem_vars成员公开状态和系统变量。

    status_vars通用插件描述符的成员(如果不为0)指向st_mysql_show_var结构数组,每个结构都描述一个状态变量,然后是一个结构,该结构的所有成员均设置为0。该st_mysql_show_var结构具有以下定义:

    struct st_mysql_show_var {
      const char *name;
      char *value;
      enum enum_mysql_show_type type;
    };
    

    下表显示了允许的状态变量type值以及相应的变量应该是什么。

    服务器插件状态变量类型

    变量类型含义
    SHOW_BOOL指向布尔变量的指针
    SHOW_INT指向整数变量的指针
    SHOW_LONG指向长整数变量的指针
    SHOW_LONGLONG指向longlong整数变量的指针
    SHOW_CHAR一串
    SHOW_CHAR_PTR指向字符串的指针
    SHOW_ARRAY指向另一个st_mysql_show_var数组的指针
    SHOW_FUNC指向功能的指针
    SHOW_DOUBLE指向双精度指针

    对于SHOW_FUNC类型,将调用该函数并填写其out参数,然后该参数提供有关要显示的变量的信息。该函数具有以下签名:

    #define SHOW_VAR_FUNC_BUFF_SIZE 1024
    
    typedef int (*mysql_show_var_func) (void *thd,
                                        struct st_mysql_show_var *out,
                                        char *buf);
    

    system_vars成员(如果不为0)指向一个st_mysql_sys_var结构数组,每个结构都描述一个系统变量(也可以从命令行或配置文件中设置),然后是一个将所有成员都设置为0的st_mysql_sys_var结构。定义如下:

    struct st_mysql_sys_var {
     int flags;
     const char *name, *comment;
     int (*check)(THD*, struct st_mysql_sys_var *, void*, st_mysql_value*);
     void (*update)(THD*, struct st_mysql_sys_var *, void*, const void*);
    };
    

    根据需要,根据标志附加其他字段。

    为了方便起见,定义了许多宏,这些宏使在插件中创建新的系统变量更加简单。

    在整个宏中,以下字段可用:

    • name:系统变量的未加引号的标识符。
    • varname:静态变量的标识符。如果不可用,则与name字段相同。
    • opt:系统变量的附加使用标志。下表显示了允许的标志。

      服务器插件系统变量标志

      标记值描述
      PLUGIN_VAR_READONLY系统变量是只读的
      PLUGIN_VAR_NOSYSVAR在运行时用户看不到系统变量
      PLUGIN_VAR_NOCMDOPT无法从命令行配置系统变量
      PLUGIN_VAR_NOCMDARG在命令行上不需要参数(通常用于布尔变量)
      PLUGIN_VAR_RQCMDARG在命令行中需要一个参数(这是默认值)
      PLUGIN_VAR_OPCMDARG命令行中的参数是可选的
      PLUGIN_VAR_MEMALLOC用于字符串变量;指示要为存储字符串分配内存

    • comment:要在服务器帮助消息中显示的描述性注释。NULL如果要隐藏此变量。
    • check:检查功能,NULL默认情况下。
    • updateNULL默认为更新功能。
    • default:变量的默认值。
    • minimum:可变最小值。
    • maximum:可变最大值。
    • blocksize:可变块大小。设置该值后,会将其舍入为的最接近倍数blocksize

    可以通过直接使用静态变量或通过使用SYSVAR()访问器宏来访问系统变量。SYSVAR()提供该宏是为了完整性。通常,仅当代码无法直接访问基础变量时才应使用它。

    例如:

    static int my_foo;
    static MYSQL_SYSVAR_INT(foo_var, my_foo,
                            PLUGIN_VAR_RQCMDARG, "foo comment",
                            NULL, NULL, 0, 0, INT_MAX, 0);
     ...
       SYSVAR(foo_var)= value;
       value= SYSVAR(foo_var);
       my_foo= value;
       value= my_foo;
    

    会话变量只能通过THDVAR()访问宏来访问。例如:

    static MYSQL_THDVAR_BOOL(some_flag,
                             PLUGIN_VAR_NOCMDARG, "flag comment",
                             NULL, NULL, FALSE);
     ...
       if (THDVAR(thd, some_flag))
       {
         do_something();
         THDVAR(thd, some_flag)= FALSE;
       }
    

    使用之前,所有全局和会话系统变量必须发布到mysqld。这是通过构造一个NULL以变量结尾的数组并在插件公共接口中链接到它来完成的。例如:

    static struct st_mysql_sys_var *my_plugin_vars[]= {
      MYSQL_SYSVAR(foo_var),
      MYSQL_SYSVAR(some_flag),
      NULL
    };
    mysql_declare_plugin(fooplug)
    {
      MYSQL_..._PLUGIN,
      &plugin_data,
      "fooplug",
      "foo author",
      "This does foo!",
      PLUGIN_LICENSE_GPL,
      foo_init,
      foo_fini,
      0x0001,
      NULL,
      my_plugin_vars,
      NULL,
      0
    }
    mysql_declare_plugin_end;
    

    以下便利宏使您可以声明不同类型的系统变量:

    • 类型bool为的布尔型系统变量,为1字节的布尔值。(0 =false,1 =true

      MYSQL_THDVAR_BOOL(name, opt, comment, check, update, default)
      MYSQL_SYSVAR_BOOL(name, varname, opt, comment, check, update, default)
      
    • 类型char*为的字符串系统变量,它是一个以null终止的字符串的指针。

      MYSQL_THDVAR_STR(name, opt, comment, check, update, default)
      MYSQL_SYSVAR_STR(name, varname, opt, comment, check, update, default)
      
    • 整数系统变量,其中有几个变体。

      • 一个int系统变量,其通常是4字节的符号字。

        MYSQL_THDVAR_INT(name, opt, comment, check, update, default, min, max, blk)
        MYSQL_SYSVAR_INT(name, varname, opt, comment, check, update, default,
                       minimum, maximum, blocksize)
        
      • 一个unsigned int系统变量,其通常是4字节的无符号字。

        MYSQL_THDVAR_UINT(name, opt, comment, check, update, default, min, max, blk)
        MYSQL_SYSVAR_UINT(name, varname, opt, comment, check, update, default,
                        minimum, maximum, blocksize)
        
      • long系统变量,它典型地是4或8字节符号字。

        MYSQL_THDVAR_LONG(name, opt, comment, check, update, default, min, max, blk)
        MYSQL_SYSVAR_LONG(name, varname, opt, comment, check, update, default,
                        minimum, maximum, blocksize)
        
      • 一个unsigned long系统变量,这典型地是4或8个字节的无符号字。

        MYSQL_THDVAR_ULONG(name, opt, comment, check, update, default, min, max, blk)
        MYSQL_SYSVAR_ULONG(name, varname, opt, comment, check, update, default,
                         minimum, maximum, blocksize)
        
      • long long系统变量,其通常为8字节符号字。

        MYSQL_THDVAR_LONGLONG(name, opt, comment, check, update,
                            default, minimum, maximum, blocksize)
        MYSQL_SYSVAR_LONGLONG(name, varname, opt, comment, check, update,
                            default, minimum, maximum, blocksize)
        
      • 一个unsigned long long系统变量,其通常为8字节无符号字。

        MYSQL_THDVAR_ULONGLONG(name, opt, comment, check, update,
                             default, minimum, maximum, blocksize)
        MYSQL_SYSVAR_ULONGLONG(name, varname, opt, comment, check, update,
                             default, minimum, maximum, blocksize)
        
      • double系统变量,其通常为8字节符号字。

        MYSQL_THDVAR_DOUBLE(name, opt, comment, check, update,
                             default, minimum, maximum, blocksize)
        MYSQL_SYSVAR_DOUBLE(name, varname, opt, comment, check, update,
                             default, minimum, maximum, blocksize)
        
      • 一个unsigned long系统变量,这典型地是4或8个字节的无符号字。可能值的范围是的元素序数typelib,从0开始。

        MYSQL_THDVAR_ENUM(name, opt, comment, check, update, default, typelib)
        MYSQL_SYSVAR_ENUM(name, varname, opt, comment, check, update,
                        default, typelib)
        
      • 一个unsigned long long系统变量,其通常为8字节无符号字。每一位代表中的元素typelib

        MYSQL_THDVAR_SET(name, opt, comment, check, update, default, typelib)
        MYSQL_SYSVAR_SET(name, varname, opt, comment, check, update,
        default, typelib)
        

    在内部,所有可变和插件系统变量都存储在HASH结构中。

    服务器命令行帮助文本的显示是通过编译DYNAMIC_ARRAY与命令行选项相关的所有变量中的a ,对其进行排序,然后对其进行迭代以显示每个选项来进行处理的。

    当一个命令行选项已被处理,则接着从除去argvhandle_option()函数(my_getopt.c);实际上,它被消耗了。

    服务器在插件安装过程中,成功加载插件之后,调用插件初始化函数之前立即处理命令行选项。

    在运行时加载的插件无法从任何配置选项中受益,并且必须具有可用的默认值。一旦安装,它们将在mysqld初始化时加载,并且可以在命令行或内设置配置选项my.cnf

    插件应将thd参数视为只读。

    客户端插件描述符

    每个客户端插件都必须具有一个描述符,该描述符可为客户端插件API提供信息。描述符结构开始于所有客户端插件共有的一组固定成员,然后是特定于插件类型的所有成员。

    文件中的st_mysql_client_plugin结构client_plugin.h定义了一个“通用”描述符,其中包含公共成员:

    struct st_mysql_client_plugin
    {
      int type;
      unsigned int interface_version;
      const char *name;
      const char *author;
      const char *desc;
      unsigned int version[3];
      const char *license;
      void *mysql_api;
      int (*init)(char *, size_t, int, va_list);
      int (*deinit)();
      int (*options)(const char *option, const void *);
    };
    

    通用st_mysql_client_plugin描述符结构成员的用法如下。char *成员应指定为以null终止的字符串。

    • type:插件类型。这必须是的插件类型值之一client_plugin.h,例如MYSQL_CLIENT_AUTHENTICATION_PLUGIN
    • interface_version:插件界面版本。例如,这是MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION用于身份验证插件的。
    • name:提供插件名称的字符串。这是在mysql_options()使用MYSQL_DEFAULT_AUTH选项调用或--default-auth为MySQL客户端程序指定选项时引用插件的名称。
    • author:命名插件作者的字符串。这可以随便你。
    • desc:提供插件概述的字符串。这可以随便你。
    • version:插件版本,由三个整数组成的数组表示主要,次要和小版本。例如,{1,2,3}指示版本1.2.3。
    • license:一个字符串,用于指定许可证类型。
    • mysql_api:供内部使用。NULL在插件描述符中指定它。
    • init:仅一次初始化函数,或者NULL如果没有这样的函数。客户端库在加载插件时执行此功能。该函数成功返回零,失败返回非零。

      init如果发生错误,该函数使用其前两个参数返回错误消息。第一个参数是指向char缓冲区的指针,第二个参数指示缓冲区的长度。该init函数返回的任何消息都必须以空值结尾,因此最大消息长度是缓冲区长度减去一。下一个参数传递给mysql_load_plugin()。第一个表示存在多少个参数(如果没有则为0),其后是剩余的任何参数。

    • deinit:仅一次取消初始化功能,或者NULL如果没有这样的功能。客户端库在卸载插件时执行此功能。该函数不带参数。成功返回零,失败返回非零。
    • options:用于处理传递给插件的选项的函数,或者NULL如果没有这样的函数。该函数使用两个参数表示选项名称和一个指向其值的指针。该函数成功返回零,失败返回非零。

    对于给定的客户端插件类型,公共描述符成员后可以跟随实现该类型插件所必需的其他成员。例如,st_mysql_client_plugin_AUTHENTICATION身份验证插件的结构在客户端库调用的末尾具有执行身份验证的功能。

    要声明插件,请使用mysql_declare_client_plugin()mysql_end_client_plugin宏:

    mysql_declare_client_plugin(plugin_type)
       ... members common to all client plugins ...
       ... type-specific extra members ...
    mysql_end_client_plugin;
    

    不要明确指定typeinterface_version成员。该mysql_declare_client_plugin()宏使用plugin_type参数来自动生成它们的值。例如,声明这样的身份验证客户端插件:

    mysql_declare_client_plugin(AUTHENTICATION)
      "my_auth_plugin",
      "Author Name",
      "My Client Authentication Plugin",
      {1,0,0},
      "GPL",
      NULL,
      my_auth_init,
      my_auth_deinit,
      my_auth_options,
      my_auth_main
    mysql_end_client_plugin;
    

    该声明使用AUTHENTICATION参数将typeand interface_version成员设置为MYSQL_CLIENT_AUTHENTICATION_PLUGINand MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION

    根据插件的类型,描述符可能在公共成员之后还有其他成员。例如,对于身份验证插件,有一个函数(my_auth_main()在刚刚显示的描述符中)处理与服务器的通信。请参见“编写身份验证插件”。

    通常,支持身份验证插件使用的客户端程序会通过调用mysql_options()设置MYSQL_DEFAULT_AUTHMYSQL_PLUGIN_DIR选项来加载插件:

    char *plugin_dir = "path_to_plugin_dir";
    char *default_auth = "plugin_name";
    
    /* ... process command-line options ... */
    
    mysql_options(&mysql, MYSQL_PLUGIN_DIR, plugin_dir);
    mysql_options(&mysql, MYSQL_DEFAULT_AUTH, default_auth);
    

    通常,该程序还将接受--plugin-dir--default-auth选项,使用户能够覆盖默认值。

    如果客户端程序需要较低级别的插件管理,则客户端库应包含带有st_mysql_client_plugin参数的函数。请参见“ C API客户端插件功能”。