• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 编写INFORMATION_SCHEMA插件

    本节介绍如何编写服务器端INFORMATION_SCHEMA表插件。有关实现此类插件的示例代码,请参见sql/sql_show.ccMySQL源代码分发文件。您也可以参见在InnoDB源代码中找到的示例插件。请参阅源树(位于目录中)中的handler/i_s.cchandler/ha_innodb.cc文件。InnoDBstorage/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 PLUGINUNINSTALL 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_INFOtable.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_TABLE SONAME '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;