Gearman-MySQL-UDF をインストールする

MacPorts でインストールした MySQL に Gearman-MySQL-UDF をインストールする。

Gearmand を MacPorts でインストール

$ sudo port install gearmand
$ sudo port load gearmand
$ ps -eaf | grep gearmand
0 66518     1   0   0:00.01 ??         0:00.02 /opt/local/bin/daemondo --label=gearmand --start-cmd /opt/local/sbin/gearmand -vv --port=4730 -u root --pid-file=/opt/local/var/run/gearmand.pid --log-file=/opt/local/var/log/gearmand.log ; --pid=exec
0 66519 66518   0   0:00.00 ??         0:00.00 /opt/local/sbin/gearmand -vv --port=4730 -u root --pid-file=/opt/local/var/run/gearmand.pid --log-file=/opt/local/var/log/gearmand.log

Gearman-MySQL-UDF をダウンロード&インストール

$ wget http://launchpad.net/gearman-mysql-udf/trunk/0.5/+download/gearman-mysql-udf-0.5.tar.gz
$ tar xvzf gearman-mysql-udf-0.5.tar.gz
$ cd gearman-mysql-udf-0.5
$ ./configure --with-mysql=/opt/local/bin/mysql_config5 --libdir=/opt/local/lib/mysql5/mysql/plugin CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" DEPS_CFLAGS="-I/opt/local/include" DEPS_LIBS="-L/opt/local/lib"
$ make
$ sudo make install
$ cd /opt/local/lib/mysql5/mysql/plugin/
$ ls | grep *gearman*
libgearman_mysql_udf.la:dlname='libgearman_mysql_udf.0.so'
libgearman_mysql_udf.la:library_names='libgearman_mysql_udf.0.so libgearman_mysql_udf.so'

MySQL で Gearmand-UDF を登録

$ mysql5 -u root
mysql> CREATE FUNCTION gman_do RETURNS STRING
    ->        SONAME "libgearman_mysql_udf.so";
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING
    ->        SONAME "libgearman_mysql_udf.so";
Query OK, 0 rows affected (0.00 sec)
mysql> select gman_servers_set("127.0.0.1:4730");
+------------------------------------+
| gman_servers_set("127.0.0.1:4730") |
+------------------------------------+
| 127.0.0.1:4730                     |
+------------------------------------+
1 row in set (0.00 sec)

Worker を作る。
動作確認用なので Perl で作成した。
# Python の場合ライブラリのバージョンがあがったみたいでうまいこと行かなかった…。

#!/usr/bin/env perl
use strict;
use warnings;
use Gearman::Worker;

my $worker = Gearman::Worker->new;
$worker->job_servers('127.0.0.1:4730');
$worker->register_function(reverse => sub {reverse $_[0]->arg;});
$worker->work while 1;

worker.pl とかで保存して実行する。
MySQL で UDF を呼び出す。

mysql> select gman_do('reverse', 'Hello world');
+-----------------------------------+
| gman_do('reverse', 'Hello world') |
+-----------------------------------+
| dlrow olleH                       |
+-----------------------------------+
1 row in set (0.00 sec)

ちゃんと文字が反転して応答された。


参考文献
http://d.hatena.ne.jp/perezvon/20090501/1241156643
Python で上記の GearmanWorker を動かす場合は 1.5.0 じゃないと動かない。最新は 2.x 系。
http://oddments.org/?p=31