Spec-Zone .ru
спецификации, руководства, описания, API

22.2.4.6. Запись 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++ (не 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 };

Общий дескриптор указывает на функции 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;  return 0;}

Функция должна установить эти два элемента структуры таблицы:

Массив, которым указывают fields_info должен содержать один элемент для каждого столбца INFORMATION_SCHEMA плюс завершающийся элемент. Следующий simple_table_fields массив для плагина в качестве примера указывает на это SIMPLE_I_S_TABLE имеет два столбца. NAME оценивается строке с длиной 10 и VALUE оценивается целому числу с дисплеем width 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_xxx значения типа - используемые в API C; см. Раздел 21.8.5, "Структуры данных API C".

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.

Чтобы скомпилировать и установить сменный объектный файл библиотеки, см. инструкции в Разделе 22.2.4.3, "Компилируя и Устанавливая Сменные Библиотеки". Чтобы использовать файл библиотеки, это должно быть установлено в сменном каталоге (каталог, названный 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;