sqlite3_open()
sqlite3_open()は指定されたデータベースファイルが本当にデータベースなのかどうか全く見ない(適当なテキストファイルを指定してもオープンに成功する)
ファイルが無いときは勝手に空のファイルを作ってしまう(ファイルがアクセスできなかったり作れないときはさすがにエラーになる)
あと、成功失敗にかかわらずデータベースのハンドルは返ってくるので、忘れずにsqlite3_close()を呼ぶこと。
http://www.3rd-impact.net/Document/SQLite/Translation/Current/capi3ref.html#sqlite3_open
データベースファイルが壊れてても、sqlite3_prepare()などの結果を見るまでわからない。
sqlite3_busy_timeout()
古いバージョンのsqlite3_busy_timeout()は帰ってこなくなることがあるので使ってはいけない。
SQLite version 3.2.1 とかそのあたりはアウト
database is locked
BEGIN;してもそのときはロックされず、実際にDBをいじったときに初めてロックする。
すぐロックしたいときはBEGIN EXCLUSIVE;かBEGIN IMMIDIATE;すること
- BEGIN DEFERRED(デフォルト)
- 共有ロック
- 同時に何人もBEGINできる
- 他の人がなんのBEGINしてもBEGINコマンドそのものは成功してしまう
- 先に変更した者勝ちでロックを取得する
- BEGIN IMMIDIATE
- 共有ロック
- 他の人はBEGINできない
- 変更がかかるまではSELECTできる
- 変更がかかってもsqlite3_prepare()は成功してしまう
- BEGIN EXCLUSIVE
- 排他ロック
- 他の人はBEGINできない
- 当然SELECTもできない
- sqlite3_prepare()も失敗する