Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Lux IOのPerlバインディングを作成した

id:mogwaingさんが開発されているYet AnotherなDBMであるところのLux IOを使ってみたくなったので、Perlから使えるようバインディングを書いてみました。初XSな上にC/C++もろくに書いたことがないのでわかんないところだらけですが、なんか一応動くようになったっぽいので、GitHubに上げておきました。

ご覧になればわかる通り、なんかせっかくC++ライブラリを触るのに、関数をベタベタ書いてラップしてるだけで、なんともダサい感じ。typemapをうまく使えばいい感じになるということだったのだけど、Lux::IO::Btreeみたいなコロンつきの型や、Lux::IO::*以下にあるstructやenumをどうtypemapすればいいのかわからなかったので、こんな感じに。

以下、あれこれ試行錯誤する中で疑問だったり、やり残したりしたこと。

  • コロンつきの型を普通にtypemapしようとするとエラーになる?
  • たとえばtypedef Lux::IO::Btree Lux_IO_Btree;とかいちいちtypedefしてまわればできないことはないけど、ダサい感じ。
  • typedefするんじゃなくてusing namespace Lux::IO;とかすればいけるかも……?
  • フラグの扱いがまだちゃんとできてない。Perl側でどう定義してやるのがいいんかなー。

次は、typemapしてスマートな感じにしたいところです。

あと、以下に一応使い方を示しておきます。つっても、特に何もないけど。

use Lux::IO;
use Lux::IO::Btree;

my $bt = Lux::IO::Btree->new;
$bt->open('test', Lux::IO::DB_CREAT);
$bt->put('key', 'value');             #=> true
$bt->get('key');                      #=> 'value'
$bt->del('key');                      #=> true
$bt->get('key');                      #-> false
$bt->close;