UDF を実装するファイルは、サーバーが実行されるホストでコンパイルおよびインストールする必要があります。MySQL ソース配布に含まれている UDF ファイルの例 sql/udf_example.cc
を使用して、このプロセスについて説明します。
スレーブサーバーにレプリケーションされるステートメントで UDF が参照される場合は、すべてのスレーブでその関数が使用可能である必要があります。そうしないと、スレーブでその関数を呼び出そうとしたときに、レプリケーションがスレーブで失敗します。
次の手順は Unix の場合です。Windows での手順は、このセクションの以降で説明します。
udf_example.cc
ファイルには次の関数が含まれています。
metaphon()
は、文字列引数の metaphon 文字列を返します。これは soundex 文字列に似ていますが、英語向けに調整されています。myfunc_double()
は、引数内の文字の ASCII 値の合計をその引数の長さの合計で割ったものを返します。myfunc_int()
は、その引数の長さの合計を返します。sequence([const int])
は、指定された数値または 1 (数値が指定されなかった場合) から始まるシーケンスを返します。lookup()
は、ホスト名の IP アドレスを返します。reverse_lookup()
は、IP アドレスに対するホスト名を返します。この関数は、'xxx.xxx.xxx.xxx'
という形式の単一の文字列引数または 4 つの数値のいずれかを使用して呼び出すことができます。avgcost()
は、平均コストを返します。これは集約関数です。
動的にロード可能なファイルは、次のようなコマンドを使用して、共有可能なオブジェクトファイルとしてコンパイルします。
shell> gcc -shared -o udf_example.so udf_example.cc
CMake に gcc を使用している場合 (MySQL はそのように構成されています) は、より簡単なコマンドで udf_example.so
を作成できます。
shell> make udf_example
UDF が含まれている共有オブジェクトをコンパイルしたら、共有オブジェクトをインストールして MySQL に通知する必要があります。gcc を使用して udf_example.cc
から共有オブジェクトをコンパイルすると、udf_example.so
という名前のファイルが直接生成されます。共有オブジェクトをサーバーのプラグインディレクトリにコピーし、udf_example.so
という名前を付けます。このディレクトリは、plugin_dir
システム変数の値から取得できます。
一部のシステムでは、ダイナミックリンカーを構成する ldconfig プログラムは、共有オブジェクトの名前が lib
で始まっていない場合、共有オブジェクトを認識しません。この場合は、たとえば、ファイル名を udf_example.so
から libudf_example.so
に名前変更してください。
Windows では、次の手順を使用してユーザー定義関数をコンパイルできます。
MySQL ソース配布を取得します。セクション2.1.3「MySQL の取得方法」を参照してください。
必要な場合は CMake ビルドユーティリティーを http://www.cmake.org から取得します。(バージョン 2.6 以降が必要となります)。
ソースツリーで
sql
ディレクトリを参照します。その場所にはudf_example.def
udf_example.cc
という名前のファイルがあります。両方のファイルをこのディレクトリから作業ディレクトリにコピーします。-
次の内容を持つ CMake の
makefile
(CMakeLists.txt
) を作成します。PROJECT(udf_example) # Path for MySQL include directory INCLUDE_DIRECTORIES("c:/mysql/include") ADD_DEFINITIONS("-DHAVE_DLOPEN") ADD_LIBRARY(udf_example MODULE udf_example.cc udf_example.def) TARGET_LINK_LIBRARIES(udf_example wsock32)
-
VC プロジェクトファイルおよびソリューションファイルを作成します。
cmake -G "<Generator>"
cmake --help を呼び出すと、有効なジェネレータのリストが表示されます。
-
udf_example.dll
を作成します。devenv udf_example.sln /build Release
共有オブジェクトファイルがインストールされたら、次のステートメントを使用して、新しい関数について mysqld に通知します。使用しているシステムでオブジェクトファイルのサフィクスが .so
ではない場合、正しいサフィクスにすべて置き換えます (たとえば、Windows の場合は .dll
)。
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME 'udf_example.so';
mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME 'udf_example.so';
mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME 'udf_example.so';
mysql> CREATE FUNCTION sequence RETURNS INTEGER SONAME 'udf_example.so';
mysql> CREATE FUNCTION lookup RETURNS STRING SONAME 'udf_example.so';
mysql> CREATE FUNCTION reverse_lookup
-> RETURNS STRING SONAME 'udf_example.so';
mysql> CREATE AGGREGATE FUNCTION avgcost
-> RETURNS REAL SONAME 'udf_example.so';
関数を削除するには、DROP FUNCTION
を使用します。
mysql> DROP FUNCTION metaphon;
mysql> DROP FUNCTION myfunc_double;
mysql> DROP FUNCTION myfunc_int;
mysql> DROP FUNCTION sequence;
mysql> DROP FUNCTION lookup;
mysql> DROP FUNCTION reverse_lookup;
mysql> DROP FUNCTION avgcost;
CREATE FUNCTION
ステートメントおよび DROP FUNCTION
ステートメントは、mysql
データベースの func
システムテーブルを更新します。関数の名前、型、および共有ライブラリ名は、このテーブルに保存されます。関数を作成または削除するには、mysql
データベースの INSERT
権限または DELETE
権限をそれぞれ持っている必要があります。
すでに作成されている関数を CREATE FUNCTION
を使用して追加しないでください。関数を再インストールする必要がある場合は、DROP FUNCTION
を使用して関数を削除してから、CREATE FUNCTION
を使用して再インストールする必要があります。これを行う必要があるのは、たとえば、mysqld が関数の新しいバージョンを取得するように、新しいバージョンを再コンパイルする場合です。そうしないと、サーバーは古いバージョンを使用し続けます。
アクティブ関数とは、CREATE FUNCTION
を使用してロードされていて、DROP FUNCTION
を使用して削除されていない関数です。すべてのアクティブ関数は、サーバーが起動するたびにリロードされますが、--skip-grant-tables
オプションを指定して mysqld を起動した場合は異なります。この場合は、UDF の初期化がスキップされ、UDF は使用できません。