扩展MySQL 5.7./ MySQL插件服务

第5章MySQL Services for Plugins

MySQL服务器插件可以访问服务器插件服务。插件服务界面公开了插件可以调用的服务器功能。它补充了插件API并具有这些特性:

  • 服务使插件能够使用普通函数调用访问服务器内的代码。服务也可供用户定义的函数(UDFS)。

  • 服务是便携式的,并在多个平台上工作。

  • 该接口包含一个版本控制机制,以便服务器支持的服务版本可以在加载时根据插件版本进行检查。版本控制可以防止服务器提供的服务版本与插件期望或要求的服务版本之间的不兼容性。

  • 有关测试插件服务的插件信息,请参阅“MySQL Server Doxygen文档的”插件服务“部分的插件,可用10bet官方网站https://dev.10bet靠谱mysql.com/doc/index-其他.html.

插件服务接口与插件API的区别如下:

  • 插件API使服务器使用插件。调用的主动性位于服务器调用插件。这使插件能够扩展服务器功能或寄存器以接收有关服务器处理的通知。

  • Plugin Services接口使插件能够在服务器内调用代码。调用的主动性位于插件以调用服务功能。这使得已经在服务器中实现的功能是由许多插件使用的;他们不需要单独实施它。

确定存在哪些服务以及它们提供的功能,看看包括/ mysqlMySQL源分发的目录。相关文件是:

  • plugin.h包括services.h, 哪一个是标题包括所有可用的服务特定的头文件。

  • 服务特定标题有表单的名称服务_xxx. h

每个特定于服务的头文件应该包含注释,提供给定服务的完整使用文档,包括哪些服务函数可用、它们的调用序列和返回值。10bet官方网站

对于希望修改服务器以添加新服务的开发人员,请参阅MySQL Internals:Plugins的MySQL服务

可用服务包括以下内容:

  • locking_service.:使用三个属性实现锁定的服务:锁定命名空间,锁名称和锁定模式。此锁定接口可在两个级别的两个级别:1)在SQL级别,作为一组用户定义的函数,将映射到服务例程的呼叫;2)作为C语言接口,可作为插件服务从服务器插件或用户自定义函数调用。有关更多信息,请参阅锁定服务

  • my_plugin_log_service.:允许插件报告错误并指定错误消息的服务。服务器将消息写入其错误日志。

  • my_snprintf.:字符串格式化服务,在平台上生成一致的结果。

  • my_thd_scheduler:一个为插件选择线程调度程序的服务。

  • mysql_keyring.:一个用于密匙环存储的服务,可在两个级别访问:1)在SQL级别,作为一组映射到服务例程调用的用户定义函数;2)作为C语言接口,可作为插件服务从服务器插件或用户自定义函数调用。有关更多信息,请参阅密匙环服务

  • mysql_password_policy.:用于密码验证和实力检查的服务。

  • mysql_string:用于字符串操作的服务。

  • security_context:一个服务,使插件能够检查或操纵线程安全上下文。此服务为访问服务器的属性提供Setter和Getter例程Security_context类,包括属性,如操作系统用户和主机,经过身份验证的用户和主机以及客户端IP地址。

  • thd_alloc.:存储器分配服务。

  • THD_WAIT.:在要睡觉或摊位时要报告的插件服务。

本节的其余部分将描述插件如何使用作为服务可用的服务器功能。控件的源代码守护进程示例插件,使用该插件my_snprintf.服务。在MySQL源代码发行版中,该插件位于plugin / daemon_example.目录。

要使用服务或插件内的服务,插件源文件必须包含plugin.h访问服务相关信息的头文件:

# include < mysql / plugin.h >

这不代表任何其他设置成本。Anywine必须包含该文件,因为它包含每个插件需求的定义和结构。

要访问服务,插件会像调用其他函数一样调用服务函数。例如,要将字符串格式化为用于打印的缓冲区,则调用my_snprintf ()由同名服务提供的函数:

字符缓冲区(BUFFER_SIZE);my_snprintf(缓冲区,sizeof(缓冲),format_string.Argument_to_Format.,……);

要报告服务器将写入IT错误日志的错误,请首先选择错误级别。mysql / service_my_plugin_log.h定义这些级别:

枚举plugin_log_level {MY_ERROR_LEVEL, MY_WARNING_LEVEL, MY_INFORMATION_LEVEL};

然后调用my_plugin_log_message ()

int my_plugin_log_message(mysql_plugin * plugin,enum plugin_log_level级别,const char *格式,......);

例如:

my_plugin_log_message(plugin_ptr, MY_ERROR_LEVEL,“不能初始化插件”);

一些服务为了可以提供插件经过插件,因此,仅在加载服务提供插件时可用。使用此类服务​​的任何MySQL组件都应检查服务是否可用。

当你构建插件时,使用-lmysqlservices中的链接时标记libmysqlservices.图书馆。例如,CMake.,把这个放在顶层cmakelists.txt.txt.文件:

MYSQLSERVICES_LIB mysqlservices PATHS "${MYSQL_SRCDIR}/libservices" NO_DEFAULT_PATH)

把这个放进cmakelists.txt.txt.在包含插件源代码的目录下的文件:

#插件需要mysql服务库的错误日志your_plugin_library_name$ {mysqlservices_lib})