28.3 MySQL 插件服务

MySQL 服务器插件可以访问服务器“插件服务”。插件服务接口公开了插件可以调用的服务器功能。它是插件 API 的补充,并具有以下 Feature:

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

要确定存在哪些服务及其提供的功能,请查看 MySQL 源代码分发的include/mysql目录。相关文件为:

每个特定于服务的 Headers 应包含 Comments,这些 Comments 提供给定服务的完整用法文档,包括可用的服务功能,它们的调用 Sequences 和返回值。

对于希望修改服务器以添加新服务的开发人员,请参见MySQL 内部:MySQL 插件服务

可用服务包括:

本节的其余部分描述了插件如何使用作为服务可用的服务器功能。另请参见“守护程序”示例插件的源,该插件使用my_snprintf服务。在 MySQL 源代码发布中,该插件位于plugin/daemon_example目录中。

要使用插件中的一项或多项服务,插件源文件必须包含plugin.h头文件才能访问与服务相关的信息:

#include <mysql/plugin.h>

这不代 table 任何额外的安装费用。插件无论如何都必须包含该文件,因为它包含每个插件都需要的定义和结构。

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

char buffer[BUFFER_SIZE];

my_snprintf(buffer, sizeof(buffer), format_string, argument_to_format, ...);

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

enum 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 level,
                          const char *format, ...);

For example:

my_plugin_log_message(plugin_ptr, MY_ERROR_LEVEL, "Cannot initialize plugin");

某些插件服务可能由*插件提供,因此仅在加载了提供服务的插件时可用。使用此类服务的任何 MySQL 组件都应检查该服务是否可用。

生成插件时,请在链接时使用-lmysqlservices标志链接到libmysqlservices库。例如,对于 CMake ,将其放在顶级CMakeLists.txt文件中:

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

将其放在包含插件源的目录中的CMakeLists.txt文件中:

# the plugin needs the mysql services library for error logging
TARGET_LINK_LIBRARIES (your_plugin_library_name ${MYSQLSERVICES_LIB})
首页