[Gauche] SQLite3 名前つきパラメータ

chaton で、前から欲しいと思ってた SQL の名前つきパラメータの話題をみかけた。


どうやら Gauche は自前で SQL をパーズしてるので、SQL エンジンごとに実装をしなくても、ちょっと変更すれば、名前つきパラメータを使えるようになるらしい。
この機能もよさげなんだけど、stub ファイルをいじってみたかったので、以前 fork した SQLite3 の実装に pass-through して名前つきパラメータを実装してみることにした。


Github Gauche-dbd-sqlite3

C レベルの低レイヤなプログラミング知識が貧弱なので動かないときは教えてもらえると、とても嬉しいです。 *1

たとえば、こういう SQL

(let* ([con (dbi-connect "dbi:sqlite3:example.db")])
  (dbi-do con "SELECT :c1, @a1, :n1, :f1, :v1, :null1" '(:pass-through #t)
          :@a1 "@1" :c1 "colon1" :n1 100 :f1 99.9 :v1 #u8(1 5) :null1 #f))

で (#("colon1" "@1" 100 99.9 #u8(1 5) #f)) が返ってくる。
上記以外の型を渡すと全部 x->string して sqlite3 の TEXT として扱うようにしてある。


最初に stub をいじりたくなってから今日までにえらく時間がかかった気もするけど、やってみるとそれほど難しくはなく、Gauche でプログラミングできる幅がすごく拡がりそう。
sqlite3 の api も扱いやすかったけど、何より gauche の stub で感動してしまった。
このプログラム書いてる一週間ほど、gauche.cgen の実装を眺めてディスプレイの前でにやにや (~_~) してた。

Mono のコードを呼び出せないかなーとか考えてるところ。

*1:もう全部直したつもりだけど、自宅の 64bit なプログラミング環境では動いたのが、32bit の環境で動かなくなったりして四苦八苦してたので…