ラクダと猿 2: 複合オブジェクトが言語の壁を越えられるようにする


前回、perlSpiderMonkeyというモジュールでjavascriptを組み込んだプログラムを作った。このモジュールにより、javascriptから簡単にperlの関数を呼出せる。 こうなると、データベースをアクセスするウェブアプリケーションも簡単につくれる。早速、sqlite3をjavascriptから使うためのインターフェースを書き始めた。しかし、そこには大きな落とし穴があった。なんと、javascriptからperl関数を呼出した場合、スケーラー(文字列と数字)しか返せないのだ。Hashのlistを返せないようじゃ、データベースライブラリは書く気にならない、、いつもなら、ここで挫折してしまうんだが、使い慣れたperlのライブラリを駆使してjavascriptでwebアプリケーションを書くってのはとても愉快そうだったので、奮起してXSのソースに
飛び込んでみた。

通勤の電車の中で二つのハイレベル言語のnative intefaceを格闘すること数週間、
ついにarray、 hashなどを組み合わせた複合オブジェクトでも言語の壁を乗り越させる 「glue code」ができた。一つの関数にこれだけてこずらされたのは初めてだ。

これで、普通にデータベースインタフェースが書ける:
var dbfile="/usr/var/mogmer/mogmer.sqlite";
var db=db_new("dbi:SQLite:"+dbfile);
p_print(db);
var rows=db_select(db, "select msgid from msg");
p_print(rows.length);
for (var i=0; i