MySQLに独自の関数を実装する
独自の関数を実装?
MySQLでは、ユーザが独自の関数を実装することができる
ユーザ定義関数(User Defined Function)
http://dev.mysql.com/doc/refman/4.1/ja/udf-calling.html
開発言語
C / C++
必要な関数
初期化関数・終了関数・本体の3つが最低限必要
本体の関数は戻り値の型(STRING/INTEGER/REAL)によって宣言が変わります
#include<mysql.h> //初期化関数 my_bool funcname_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { //必要であれば処理を書く return 0; } //終了関数 void funcname_deinit(UDF_INIT *initid) { //必要があれば処理を書く return; } //本体 ※戻り値の型(STRING/INTEGER/REAL)によって宣言が変わる long long funcname(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { long long modorichi = 0; //処理を書く return modorichi; }
今回作成した関数
twcount()
引数にTwitterのscreen_nameを与えるとtweet数を返す
https://github.com/oh-sky/twcount
tweet数はPHPのスクリプトで取得
MySQLとPHPスクリプト間の引数/戻り値の受け渡しをC言語で
UDFのコンパイル
gcc -I/path/to/mysql/library -shared -o twcount.so twcount.c
/path/to/mysql/library は環境によって変わります
UDFのインストール
twcount.soを /usr/lib 等にコピー
mysqlにログイン、使用するデータベースを選択し、下記コマンドで関数が実行でき
mysql>CREATE FUNCTION twcount RETURNS INTEGER SONAME "twcount.so";
使用例
mysql> SELECT TWCOUNT('oh_sky'); +-------------------+ | TWCOUNT('oh_sky') | +-------------------+ | 15585 | +-------------------+ 1 row in set (0.56 sec)