本节介绍如何编写服务器端Information_Schema.
表插件。例如实现此类插件的示例代码,请参阅sql / sql_show.cc
MySQL源分发的文件。您也可以查看发现的示例插件Innodb.
源。看到handler / i_s.cc.
和处理程序/ ha_innodb.cc
文件中的文件Innodb.
源树(在存储/ innobase.
目录)。
写一个Information_Schema.
表插件,包括插件源文件中的以下头文件。根据插件功能和要求,也可能需要其他MySQL或常规标题文件。
#include #include . #include
这些头文件位于sql
MySQL源代码分发的目录。它们包含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_
类型值是C API中使用的类型值;看C API基本数据结构。xxx
这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;