本节描述如何编写服务器端INFORMATION_SCHEMA
表插件。实现此类插件的示例代码,请参见sql / sql_show.cc
MySQL源码分发版的文件。您还可以查看示例插件InnoDB
源。看到处理程序/ i_s.cc
和处理程序/ ha_innodb.cc
文件内InnoDB
源树(在存储/ innobase
目录)。
写一INFORMATION_SCHEMA
表插件,包括以下头文件在插件源文件。根据插件的功能和需求,可能还需要其他MySQL头文件或一般头文件。
#include #include . #include
这些头文件位于sql
MySQL源代码分发的目录。它们包含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_INFO
在table.h
头文件。允许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 ()
安装行。的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;