4.4.2插件数据结构

插件库文件包含描述符信息,以指示它包含什么插件。

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

  • 库描述符指示库使用的通用服务器插件API版本号,并包含库中每个服务器插件的通用插件描述符。为该描述符提供框架,请从plugin.h头文件:

    mysql_declare_plugin (的名字...一个或多个服务器插件描述符在这里…mysql_declare_plugin_end;

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

  • 在库描述符中,每个通用服务器插件都用st_mysql_plugin结构。这个插件描述符结构包含了所有类型的服务器插件的通用信息:一个指示插件类型的值;插件名称、作者、描述和许可类型;指向服务器在加载和卸载插件时调用的初始化和去初始化函数的指针,以及指向插件实现的任何状态或系统变量的指针。

  • 库描述符中的每个通用服务器插件描述符还包含指向特定于类型的插件描述符的指针。特定于类型的描述符的结构因插件类型的不同而不同,因为每种类型的插件都可以有自己的API。特定于类型的插件描述符包含特定于类型的API版本号和指向实现该插件类型所需函数的指针。例如,一个全文解析器插件具有初始化和反初始化函数,以及一个主解析函数。服务器在使用插件解析文本时调用这些函数。

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

如果插件库包含客户端插件,它必须包含该插件的描述符。描述符以所有客户端插件通用的固定成员集合开始,然后是特定于插件类型的任何成员。方法中调用两个宏来提供描述符框架client_plugin.h头文件:

mysql_declare_client_plugin (plugin_type)…所有客户端插件的通用成员……特定类型的成员...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在一个系统上使用所以作为库后缀,它在已命名的文件中查找auth_xxx.so.(在macOS上,程序首先查找auth_xxx.dylib,然后auth_xxx.so)。因此,如果一个插件库包含一个客户端插件,该库必须具有与该插件相同的基名。

对于包含服务器插件的库则不是这样。的——plugin-load选择和安装插件语句显式地提供库文件名,因此库名称和它所包含的任何服务器插件的名称之间不需要显式的关系。