※ネタです
※UDFです
正誤表を書くのにしばらくこの本をちょっと眺めてみたら、SQLiteのUDFって簡単に作れるんだなー、と思った && そういやV8ってライブラリとして簡単にリンクできるはずだな、と思い出した ので、ついカッとなって作った。
sqlite3udf-jseval - GitHub
http://github.com/mattn/sqlite3udf-jseval
UDFうんぬn
ほとんど↑の本、全然関係ないと思ってたけど、やっぱりSQLiteのUDFについて全然書いてなかった。しょうがないので軽く紹介しておくとUDFを追加する場合、SQLiteの再コンパイルは必要ない (しかるべき所に.soがおいてあればいい)
UDFはこの辺読んどけばだいたい分かる。
例えば文字列っぽいものを返すmyfuncっていうUDFを作りたい場合
SQLITE_EXTENSION_INIT1 static void js_eval_func(sqlite3_context *context, int argc, sqlite3_value **argv);
int sqlite3_extension_init(sqlite3 *db, char **errmsg, const sqlite3_api_routines *api);
の二つの関数を実装したmyfunc.cっていうコードを用意してあげて
gcc -o myfunc.so myfunc.c `sqlite_config --cflags` -shared
という風にコンパイルして(これはLinuxの場合)、しかるべき場所(LD_LIBRARY_PATHが通る場所)に置いた後、sqliteのシェルで
> select load_extension("myfunc.so");
とやればいきなり使える。sqlite3_value_textはアロケートした文字列を渡して、最終引数に開放関数を渡すというのがUDFのお作法らしい。strdupで確保したポインタは最終引数の関数でfreeする、みたいな。
動かす手順
で、今回作ったのはV8とリンクして、JSの文字列をevalしてくれるjs_evalというUDF。多分試す人はいないと思うけど、動かすための手順を書くと
V8のビルド
V8を落としてきてビルドする。ただし、SQLiteのUDFは別に-fPICを付けなくてもおk。js_eval.cppをコンパイル
V8をビルドしたディレクトリにもっていって
g++ -o js_eval.so js_eval.cpp `sqlite_config --cflags` -shared -Iinclude libv8.a -lpthread
そうすると、js_eval.soができるので、これをLD_LIBRARY_PATHが通ったディレクトリに置く読み込むる
シェルに入って
> select load_extension("myfunc.so");
(※このUDF、食わせるものによってはSQLiteごと落ちるかもしれないので良い子のみんなは注意だ)キターーーッ
すごい。全然
役に立つ気がしない。
というかSQLite力が低すぎてどうしたら面白くなるか思いつかない。これを発展させていってTEXTとかに突っ込んだJSONの中身を効率よく検索とか出来たら面白い&実用的なんだけど、道は遠そうだ。
参考
やったーJavaScriptの動くMySQLできたよー - 愛と勇気と缶ビール
しばらく 積ん読 していたこの本をちょっと眺めてみたら、 MySQL のUDFって簡単に作れるんだなー、と思った && そういや V8 って ライブラリ として簡単にリンクできるはずだな、と思い出した...
http://d.hatena.ne.jp/zentoo/20110925/1316961032