blogですかい

株式会社Loco Partnersに勤めるエンジニアうちの一人のブログ。仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

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のスクリプトで取得
MySQLPHPスクリプト間の引数/戻り値の受け渡しを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)