Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

MySQLでmrubyを動かす

matsumotoryさんがジョインされた結果、mrubyを激しく活用していこうという機運が盛り上がり始め、というか、既にどんどん活用が広がっているところです。一方、僕はこれまでmrubyを、実際には手を動かして触ったことがなかったので「これはマズい!」と焦りを感じ、触り始めてみることにした。

とはいえ、特に取り組むべきお題もないので、文字列をmrubyコードとして評価するMySQLのUDFを作ってみることにしました。参考にしたリソースは「やったーJavaScriptの動くMySQLできたよー - 愛と勇気と缶ビール」。

github.com

使い方

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