SQLite

会社で暇を見ながら、SQLite3のページをまんべんなく読んだ。
APIは、よく作ってあって、メモリの管理に関しても、どれを誰が管理するかきっちりしている。
雰囲気は、APRと似ていて、Cなりにオブジェクト指向ライクな感じ。
処理の流れ的には、

sqlite3_open() -> sqlite3_exec() -> sqlite_close()

という簡易パターンと、

sqlite3_open() -> sqlite3_prepare() -> loop {sqlite3_bind_*(), sqlite3_step(), [sqlite3_column_*], sqlite3_reset() } sqlite3_finalize(), sqlite3_close()

という細かいパターンで使える。
もちろん、後者を使う。

実行速度的な話。
とりあえず(id integer, name text)というテーブルにレコード100行をINSERTしたら、5秒ほどかかった。
こんなに遅いのは変だと思って調べると、どうやらトランザクションを使わないと遅いらしいので、BEGIN 〜 COMMITするようしたら、かなり速くなった。きちんと計っていないが、「一瞬」で終わる。
読み出しも、問題のない速度だと思う。

今はまだ、Cの関数を直接呼んでいるが、Dからだとnull terminateな文字列を求められたり、データの長さを指定したり、そして特にエラー処理が非常に面倒なので、1つクラスを作ろうと思う。

これをポエニーに使うことは決定した。
(ただ使っていて問題が見つかればまた変える)