Project

mrubyudf

0.0
Low commit activity in last 3 years
No release in over a year
Create MySQL UDF using mruby
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies
 Project Readme

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'           # 関数名は fib
  f.return_type = Integer  # 戻り値は Integer
  f.arguments = [          # 引数は一つで型は Integer
    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