将MySQL 8.0// 写作INFORMATION_SCHEMA插件

4.4.6写INFORMATION_SCHEMA插件

本节描述如何编写服务器端INFORMATION_SCHEMA表插件。实现此类插件的示例代码,请参见sql / sql_show.ccMySQL源码分发版的文件。您还可以查看示例插件InnoDB源。看到处理程序/ i_s.cc处理程序/ ha_innodb.cc文件内InnoDB源树(在存储/ innobase目录)。

写一INFORMATION_SCHEMA表插件,包括以下头文件在插件源文件。根据插件的功能和需求,可能还需要其他MySQL头文件或一般头文件。

#include  #include  . #include 

这些头文件位于sqlMySQL源代码分发的目录。它们包含c++结构,因此源文件INFORMATION_SCHEMA插件必须编译为c++代码。

这里开发的示例插件的源文件被命名为simple_i_s_table.cc.它创建了一个简单的INFORMATION_SCHEMA表命名SIMPLE_I_S_TABLE它有两个列的名字价值.实现这个表的插件库的一般描述符是这样的:

mysql_declare_plugin (simple_i_s_library) {MYSQL_INFORMATION_SCHEMA_PLUGIN &simple_table_info, / *特定类型描述符* / " SIMPLE_I_S_TABLE " / *表名称* /“作者姓名”,作者/ * * /”简单INFORMATION_SCHEMA表”,/ * * / PLUGIN_LICENSE_GPL描述,/ *许可类型* / simple_table_init, / * init函数* /空,0 x0100,/* version = 1.0 */ NULL, /*没有状态变量*/ NULL, /*没有系统变量*/ NULL, /*没有保留信息*/ 0 /*没有flags */} mysql_declare_plugin_end;

的名字成员(SIMPLE_I_S_TABLE)表示在语句中引用插件时使用的名称,例如安装插件卸载插件.所显示的名称显示插件INFORMATION_SCHEMA。插件

simple_table_info通用描述符的成员指向特定类型的描述符,它只包含特定类型的API版本号:

static struct st_mysql_information_schema simple_table_info = {MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION};

通用描述符指向初始化和反初始化函数:

  • 初始化函数提供关于表结构和填充表的函数的信息。

  • 反初始化函数执行任何必需的清理。如果不需要清理,则此描述符成员可以为(如示例所示)。

初始化函数应该返回0表示成功,如果发生错误返回1。函数接收一个泛型指针,它应该将其解释为指向表结构的指针:

static int table_init(void *ptr) {ST_SCHEMA_TABLE* schema_table= (ST_SCHEMA_TABLE*)ptr;schema_table - > fields_info = simple_table_fields;schema_table - > fill_table = simple_fill_table;返回0;}

函数应该设置表结构的这两个成员:

  • fields_info:数组ST_FIELD_INFO包含关于每个列的信息的结构。

  • fill_table:填充表的函数。

所指向的数组fields_info每列应该包含一个元素INFORMATION_SCHEMA加上一个终止元素。以下simple_table_fields数组的例子插件表明SIMPLE_I_S_TABLE有两个列。的名字字符串值的长度为10和价值是整数值,显示宽度为20。最后一个结构标志着数组的结束。

static ST_FIELD_INFO simple_table_fields[]= {{"NAME", 10, MYSQL_TYPE_STRING, 0,0 0,0}, {"VALUE", 6, MYSQL_TYPE_LONG, 0, MY_I_S_UNSIGNED, 0,0}, {0,0, MYSQL_TYPE_NULL, 0,0,0,0}};

有关列信息结构的更多信息,请参见ST_FIELD_INFOtable.h头文件。允许MYSQL_TYPE_xxx类型值是在C API中使用的值;看到C API基本数据结构

fill_table成员应该被设置为一个函数,该函数填充表,如果成功返回0,如果发生错误返回1。对于示例插件,simple_fill_table ()函数是这样的:

static int simple_fill_table(THD * THD, TABLE_LIST *tables, Item *cond) {TABLE * TABLE = tables-> TABLE;table->field[0]->store("Name 1", 6, system_charset_info);表- >领域[1]- >存储(1);如果schema_table_store_record(thd, table))返回1;table->field[0]->store("Name 2", 6, system_charset_info);表- >领域[1]- >存储(2);如果schema_table_store_record(thd, table))返回1;返回0;}

的每一行INFORMATION_SCHEMA表中,该函数初始化每一列,然后调用schema_table_store_record ()安装行。的store ()方法参数取决于要存储的值的类型。第0栏(的名字一个字符串),store ()接受一个指向字符串的指针、它的长度和关于字符串字符集的信息:

const char *to, uint length, CHARSET_INFO *cs

第一栏(价值一个整数),store ()接受值和一个指示它是否是无符号的标志:

存储(long - long nr, bool unsigned_value);

有关如何填充的其他示例INFORMATION_SCHEMA表,搜索实例schema_table_store_record ()sql_show.cc

要编译和安装插件库文件,请使用第4.4.3节,“编译和安装插件库”.要使库文件可用,请将其安装在plugin目录中(以plugin_dir系统变量)。

要测试插件,安装它:

mysql> INSTALL PLUGIN SIMPLE_I_S_TABLE SONAME ' SIMPLE_I_S_TABLE .so';

验证表是否存在:

mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA。table -> where table_name = ' simple_i_s_table ';+------------------+ | TABLE_NAME  | +------------------+ | SIMPLE_I_S_TABLE  | +------------------+

试着从中选择:

mysql> SELECT * FROM INFORMATION_SCHEMA.SIMPLE_I_S_TABLE;+--------+-------+ | 名称|值  | +--------+-------+ | 名称1 | 1 | 2 | 2 |名称  | +--------+-------+

卸载:

mysql> UNINSTALL PLUGIN SIMPLE_I_S_TABLE;