Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 20.9Mb
PDF (A4) - 21.0Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  INFORMATION_SCHEMA プラグインの作成

24.2.4.6 INFORMATION_SCHEMA プラグインの作成

このセクションでは、INFORMATION_SCHEMA テーブルサーバープラグインを作成する方法について説明します。このようなプラグインを実装するためのコード例については、MySQL ソース配布の sql/sql_show.cc ファイルを参照してください。InnoDB ソースにあるプラグインの例を参照することもできます。InnoDB ソースツリーの handler/i_s.cc ファイルおよび handler/ha_innodb.cc ファイルを参照してください (storage/innobase ディレクトリ内)。

INFORMATION_SCHEMA テーブルプラグインを作成するには、プラグインのソースファイルに次のヘッダーファイルをインクルードします。プラグインの機能および要件によっては、ほかの MySQL のヘッダーファイルまたは一般的なヘッダーファイルが必要になることもあります。

#include <sql_class.h>
#include <table.h>

これらのヘッダーファイルは、MySQL ソース配布の sql ディレクトリにあります。これらは C++ 構造体を含んでいるため、INFORMATION_SCHEMA プラグインのソースファイルは (C ではなく) C++ コードとしてコンパイルする必要があります。

ここで作成するプラグインの例のソースファイルは、simple_i_s_table.cc という名前です。これは、SIMPLE_I_S_TABLE という名前の単純な INFORMATION_SCHEMA テーブルを作成し、NAME および VALUE という名前の 2 つのカラムがあります。テーブルを実装するプラグインライブラリの一般ディスクリプタは、次のようになります。

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;
}

この関数は、テーブル構造体の次の 2 つのメンバーを設定します。

  • fields_info: 各カラムについての情報を格納する ST_FIELD_INFO 構造体の配列。

  • fill_table: テーブルにデータを移入する関数。

fields_info によって指し示されている配列には、INFORMATION_SCHEMA のカラムごとの 1 つの要素および終端の要素が含まれるようにします。プラグイン例の次の simple_table_fields 配列は、SIMPLE_I_S_TABLE に 2 つのカラムがあることを示しています。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}
};

カラムの情報構造体については、table.h ヘッダーファイルの ST_FIELD_INFO の定義を参照してください。許容される MYSQL_TYPE_xxx タイプ値は、C API で使用される値です。セクション23.7.5「C API データ構造」を参照してください。

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 テーブルにデータを移入する方法に関するほかの例については、sql_show.ccschema_table_store_record() のインスタンスを検索してください。

プラグインライブラリのオブジェクトファイルをコンパイルおよびインストールするには、セクション24.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;