揮発性のメモ2

http://d.hatena.ne.jp/iww/

sqlite3_open()

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()も失敗する