Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел описывает, как записать 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 и инициализацию:
Функция инициализации предоставляет информацию о структуре таблицы и функции, которая заполняет таблицу.
Функция deinitialization выполняет любую необходимую уборку. Если никакая уборка не
необходима, этот элемент дескриптора может быть 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
оценивается целому числу с дисплеем 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_
значения типа -
используемые в API C; см. Раздел 21.8.5, "Структуры данных API C".
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
.
Чтобы скомпилировать и установить сменный объектный файл библиотеки, см. инструкции в Разделе
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;