Ploonga/Groonga::APIというのを書き始めている件
肉の日のリリースには間に合いませんでしたが、先日からgroongaのPerl/XSバインディングを書き始めています。Perlからgroongaというと、過去にはYappoさんが着手されたXSバインディングや、hide_o_55さんがHachioji.pmで発表されていたApp::Groonga::Wrapper、ダウンロードたけしさんのAnyEvent::Groonga、Perl Advent Calendarにも記事を書かれたokamuuuさんのTest::Groongaなど、カジュアルに使う分にはそれなりにツールも揃っている(というか、groonga自体HTTPを話せるので、groongaコマンドでサーバさえ用意してしまえばあとはFurlなりLWP::UserAgentなりで事足りてしまう)のですが、それだけではかゆいところに手が届かない部分もあるようなので、ちょっと手を出してみた次第。
いまのところソースはgithubにしかありませんが、ごくカジュアルな使い方はこんな感じ。
use strict; use warnings; use Ploonga; my $ploonga = Ploonga->new( dbfile => 'db/test.db', ); $ploonga->do('table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText'); $ploonga->do('column_create --table Site --name title --type ShortText'); $ploonga->do('load --table Site', <<'JSON'); [ {"_key":"http://example.org/","title":"This is test record 1!"}, {"_key":"http://example.net/","title":"test record 2."}, {"_key":"http://example.com/","title":"test test record three."}, {"_key":"http://example.net/afr","title":"test record four."}, {"_key":"http://example.org/aba","title":"test test test record five."}, {"_key":"http://example.com/rab","title":"test test test test record six."}, {"_key":"http://example.net/atv","title":"test test test record seven."}, {"_key":"http://example.org/gat","title":"test test record eight."}, {"_key":"http://example.com/vdw","title":"test test record nine."}, ] JSON my $ret = $ploonga->do('select --table Site --query _id:1');
groongaには渡した文字列をそのまま解釈してくれる便利なAPIが用意されているので、データベースやホストを指定してインスタンスをつくったら、あとはgroongaコマンドに渡すようにコマンドを渡してやれば、結果を伝えるスカラー、あるいはもっと複雑な構造のデータが返ってきます。Furlなどでリクエストを投げる場合と違って、テストの際に別サーバを上げ下げしたり、文字列のエスケープをあれこれ気にしたりする必要がないのがメリットです。
もうちょい複雑なことをしたくなった場合は生API(Groonga::API)の方を触ればPure Perlの世界にいながらCを書いている気分を味わえますが、いまの段階ではまだ3割程度のAPIにしか対応できていません。様子がわかってきたらもう少し生っぽくないインタフェースも用意したいとは思っていますが、その辺も今後の課題です。
開発は(例によって)もっぱらWindows上で行っているのですが、手元のstrawberry perl環境ではオフィシャルのライブラリにリンクするとDBにアクセスする段階で落ちてしまうので、いまのところ自前でビルドしたgroongaを使っています(ほかの環境ではそのような問題にはあたっていません)。
追記:この件はどうやらstrawberry perlないしstrawberry perlに同梱されているMinGW側の問題のようです(ActivePerl 5.16.2とppmで提供されているMinGW64の組み合わせではオフィシャルのgroongaとリンクしても問題が発生しませんでした)。
また、現状動作確認したのはgroonga 2.1.1/2.1.2のみです。多少修正すれば1.x.x系列でも動きそうですが、まだ手をつけていません。
リポジトリはこちらです。