编写INFORMATION_SCHEMA插件
本节介绍如何编写服务器端INFORMATION_SCHEMA
表插件。有关实现此类插件的示例代码,请参见sql/sql_show.cc
MySQL源代码分发文件。您也可以参见在InnoDB
源代码中找到的示例插件。请参阅源树(位于目录中)中的handler/i_s.cc
和handler/ha_innodb.cc
文件。InnoDB
storage/innobase
要编写INFORMATION_SCHEMA
表插件,请在插件源文件中包含以下头文件。根据插件的功能和要求,可能还需要其他MySQL或常规头文件。
#include <sql_class.h> #include <table.h>
这些头文件位于sql
MySQL源代码分发目录中。它们包含C ++结构,因此INFORMATION_SCHEMA
必须将插件的源文件编译为C ++代码。
这里开发的示例插件的源文件名为simple_i_s_table.cc
。它创建一个INFORMATION_SCHEMA
名为的简单表SIMPLE_I_S_TABLE
,该表具有名为NAME
和的两列VALUE
。实现该表的插件库的常规描述符如下所示:
mysql_declare_plugin(simple_i_s_library) { MYSQL_INFORMATION_SCHEMA_PLUGIN, &simple_table_info, /* type-specific descriptor */ "SIMPLE_I_S_TABLE", /* table name */ "Author Name", /* author */ "Simple INFORMATION_SCHEMA table", /* description */ PLUGIN_LICENSE_GPL, /* license type */ simple_table_init, /* init function */ NULL, 0x0100, /* version = 1.0 */ NULL, /* no status variables */ NULL, /* no system variables */ NULL, /* no reserved information */ 0 /* no flags */ } mysql_declare_plugin_end;
所述name
构件(SIMPLE_I_S_TABLE
)指示要用于如在语句中的插件的引用名称INSTALL PLUGIN
或UNINSTALL PLUGIN
。这也是由SHOW PLUGINS
或显示的名称INFORMATION_SCHEMA.PLUGINS
。
simple_table_info
常规描述符的成员指向特定于类型的描述符,该描述符仅由特定于类型的API版本号组成:
static struct st_mysql_information_schema simple_table_info = { MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION };
通用描述符指向初始化和反初始化函数:
- 初始化函数提供有关表结构的信息以及填充表的函数。
- 反初始化功能执行任何必需的清除。如果不需要清除,则可以使用此描述符成员
NULL
(如所示示例)。
初始化函数应返回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;return 0; }
该函数应设置表结构的以下两个成员:
fields_info
:一个ST_FIELD_INFO
结构数组,其中包含有关每一列的信息。fill_table
:填充表格的函数。
所指向的数组的fields_info
每一列应包含一个元素,INFORMATION_SCHEMA
再加上一个终止元素。simple_table_fields
示例插件的以下数组指示SIMPLE_I_S_TABLE
具有两列。NAME
是长度为10的字符串值,VALUE
显示宽度为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
头文件中。允许的类型值是C API中使用的值;请参见“ C API数据结构”。MYSQL_TYPE_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); table->field[1]->store(1);if (schema_table_store_record(thd, table))return 1; table->field[0]->store("Name 2", 6, system_charset_info); table->field[1]->store(2);if (schema_table_store_record(thd, table))return 1;return 0; }
对于INFORMATION_SCHEMA
表的每一行,此函数都会初始化每一列,然后调用schema_table_store_record()
以安装该行。该store()
参数取决于的值的类型的方法来被存储。对于第0列(NAME
一个字符串),store()
使用指向该字符串的指针,其长度以及有关该字符串的字符集的信息:
store(const char *to, uint length, CHARSET_INFO *cs);
对于第1列(VALUE
一个整数),store()
采用该值和一个标志(指示其是否为无符号):
store(longlong nr, bool unsigned_value);
有关如何填充其他例子INFORMATION_SCHEMA
表,搜索的情况下,schema_table_store_record()
在sql_show.cc
。
要编译和安装插件库文件,请使用“编译和安装插件库”中的说明。要使该库文件可供使用,请将其安装在插件目录(由plugin_dir
系统变量命名的目录)中。
要测试插件,请安装它:
mysql>INSTALL PLUGIN SIMPLE_I_S_TABLESONAME 'simple_i_s_table.so';
验证表是否存在:
mysql>SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ->WHERE TABLE_NAME = 'SIMPLE_I_S_TABLE'; +------------------ + | TABLE_NAME | +------------------ + | SIMPLE_I_S_TABLE | +------------------ +
尝试从中选择:
mysql>SELECT *FROM INFORMATION_SCHEMA.SIMPLE_I_S_TABLE; +-------- +------- + | NAME | VALUE | +-------- +------- + | Name 1 | 1 | | Name 2 | 2 | +-------- +------- +
卸载它:
mysql>UNINSTALL PLUGIN SIMPLE_I_S_TABLE;