MySQLでmrubyを動かす
matsumotoryさんがジョインされた結果、mrubyを激しく活用していこうという機運が盛り上がり始め、というか、既にどんどん活用が広がっているところです。一方、僕はこれまでmrubyを、実際には手を動かして触ったことがなかったので「これはマズい!」と焦りを感じ、触り始めてみることにした。
とはいえ、特に取り組むべきお題もないので、文字列をmrubyコードとして評価するMySQLのUDFを作ってみることにしました。参考にしたリソースは「やったーJavaScriptの動くMySQLできたよー - 愛と勇気と缶ビール」。
使い方
git clone
してきたら、make
するだけ。mrubyのコードを適当にとってきて、共有ライブラリをビルドし、MySQLのプラグインを置く場所にそのファイルをコピーしてくれる。
あとは、MySQLにログインして、
mysql> CREATE FUNCTION mrb_eval RETURNS STRING SONAME "mrb_eval.so";
とすると、mrb_eval()
関数が使えるようになっている。
使ってみる
足し算:
mysql> select mrb_eval("1 + 1"); +-------------------+ | mrb_eval("1 + 1") | +-------------------+ | 2 | +-------------------+ 1 row in set (0.01 sec)
できましたね。
関数定義:
mysql> select mrb_eval("def foo(arg); arg; end; foo('bar')"); +------------------------------------------------+ | mrb_eval("def foo(arg); arg; end; foo('bar')") | +------------------------------------------------+ | bar | +------------------------------------------------+ 1 row in set (0.01 sec)
関数定義もちゃんと動きますね。
クラス定義:
mysql> select mrb_eval("class Foo; def self.bar; 'baz'; end; end; Foo.bar"); +---------------------------------------------------------------+ | mrb_eval("class Foo; def self.bar; 'baz'; end; end; Foo.bar") | +---------------------------------------------------------------+ | baz | +---------------------------------------------------------------+ 1 row in set (0.01 sec)
いけますね。
で?
まあ特にないんですが、とりあえず「初めてのmruby」は達成できたということで。
注意点
コードにエラーがあると、特にエラー処理もしてないので音もなくLost connection to MySQL server during query
してしまいます。
mysql> select mrb_eval("class;"); ERROR 2013 (HY000): Lost connection to MySQL server during query