Ploonga/Groonga::APIというのを書き始めている件

肉の日のリリースには間に合いませんでしたが、先日からgroongaのPerl/XSバインディングを書き始めています。Perlからgroongaというと、過去にはYappoさんが着手されたXSバインディングや、hide_o_55さんがHachioji.pmで発表されていたApp::Groonga::Wrapper、ダウンロードたけしさんのAnyEvent::GroongaPerl 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系列でも動きそうですが、まだ手をつけていません。

リポジトリはこちらです。

https://github.com/charsbar/groonga-api