mrubyudf
これは mruby で MySQL のユーザー定義関数(UDF)を簡単に作成するためのツールです。
インストール
% gem install mrubyudf
準備
mysql_config コマンドと MySQL のヘッダファイルが必要です。
mysql-8.4.2-linux-glibc2.28-x86_64.tar.xz みたいなファイルを展開した中には入ってるはずです。
それ以外の場合は MySQL 開発環境のインストールが必要になるかも知れません。
Ubuntu の場合は libmysqlclient-dev パッケージをインストールすればいいと思います。
使い方
まず mruby をインストールする必要があります。mruby を動的リンクにするため config を指定して make します。
% git clone git@github.com:mruby/mruby.git
% cd mruby
% MRUBY_CONFIG=$GEM_HOME/gems/mrubyudf-0.2.0/misc/shared.rb make
うまくいかない場合は頑張ってください。
この mruby ディレクトリを MRUBY_PATH 変数に設定しておきます。
% MRUBY_PATH=$(pwd)/bin
関数本体を作ります。ここではフィボナッチ数を返す fib() 関数を fib.rb ファイルとして作ります。
FIXNUM_MAX = 2**62-1
def fib(n)
a, b = 1, 0
n.times { a, b = b, a + b }
raise 'Overflow' if b > FIXNUM_MAX
b
end
mruby で実行して動きを確かめます。
% $MRUBY_PATH/mruby -r ./fib.rb -e 'p fib(10)'
55
% $MRUBY_PATH/mruby -r ./fib.rb -e 'p fib(90)'
2880067194370816120
% $MRUBY_PATH/mruby -r ./fib.rb -e 'p fib(91)'
trace (most recent call last):
[1] -e:1
./fib.rb:5:in fib: Overflow (RuntimeError)
関数名、戻り値の型、引数の型等の情報を fib.spec ファイルで次のような感じで作ります。
MrubyUdf.function do |f|
f.name = 'fib'
f.return_type = Integer
f.arguments = [
Integer
]
end
コンパイル。
% PATH=$MRUBY_PATH:$PATH mrubyudf fib.spec
うまくいけば fib.so ファイルができます。
これを MySQL のプラグインディレクトリにコピーします。
% sudo cp fib.so $(mysql_config --plugindir)
MySQL に組み込みます。一度やっておけば mysqld を再起動しても自動的に組み込まれます。
% mysql -uroot
mysql> create function fib returns int soname 'fib.so';
使ってみます。
mysql> select fib(10);
+
| fib(10) |
+
| 55 |
+
1 row in set (0.01 sec)
mysql> select fib(90);
+
| fib(90) |
+
| 2880067194370816120 |
+
1 row in set (0.01 sec)
mysql> select fib(91);
+
| fib(91) |
+
| NULL |
+
1 row in set (0.00 sec)
関数が要らなくなったら破棄します。
mysql> drop function fib;
drop しないで so ファイルを更新したりすると、mysqld が落ちるので注意。
example 配下にテキトーなサンプルがいくつかあります。
ライセンス
このツール自体は GPL 3 です。
このツールによって作られた so ファイルは、このツールのライセンスとは無関係です。
作者
とみたまさひろ https://twitter.com/tmtms