扩展MySQL 5.6/....../ 写作INFORMATION_SCHEMA插件

4.4.6写入信息_schema插件

本节介绍如何编写服务器端Information_Schema.表插件。例如实现此类插件的示例代码,请参阅sql / sql_show.ccMySQL源分发的文件。您也可以查看发现的示例插件Innodb.源。看到handler / i_s.cc.处理程序/ ha_innodb.cc文件中的文件Innodb.源树(在存储/ innobase.目录)。

写一个Information_Schema.表插件,包括插件源文件中的以下头文件。根据插件功能和要求,也可能需要其他MySQL或常规标题文件。

#include  #include  . #include 

这些头文件位于sqlMySQL源代码分发的目录。它们包含c++结构,因此源文件Information_Schema.插件必须编译为C ++(而不是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”,/ *表名* /“作者姓名”,/ *作者* /“简单信息_schema表”,/ *描述* / plugin_license_gpl,/ *许可证类型* / simple_table_init,/ * init函数* / null,0x0100,/ * version = 1.0 * / null,/ *没有状态变量* / null,/ *没有系统变量* / null,/ *没有保留信息* / 0 / * no flags * /} mysql_declare_plugin_end;

名称成员(SIMPLE_I_S_TABLE)表示要用于引用Plugin的名称,例如安装插件卸载插件。这也是显示的名称显示插件INFORMATION_SCHEMA。插件

simple_table_info.通用描述符的成员指向特定于类型的描述符,该描述符仅由特定于类型的API版本号表示:

static struct st_mysql_information_schema simple_table_info = {mysql_information_schema_interface_version};

常规描述符指向初始化和除通化功能:

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

  • Deinitialization函数执行任何所需的清理。如果不需要清理,则该描述符可以是(如图所示的示例)。

初始化函数应返回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_info.头文件。允许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()安装行。这店铺()方法参数取决于要存储的值的类型。第0栏(名称,一个字符串),店铺()接受一个指向字符串的指针、它的长度和关于字符串字符集的信息:

商店(const char * to,uint length,charset_info * cs);

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

商店(Longlong NR,Bool unsigned_value);

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

要编译并安装插件库文件,请使用说明第4.4.3节“编译和安装插件库”。。要使库文件可用,请在插件目录中安装它(由此指定的目录plugin_dir系统变量)。

要测试插件,请安装:

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

验证表是否存在:

mysql>从Information_schema.tables中选择table_name  - >其中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>卸载plugin simple_i_s_table;