2011-01-09 25 views
3

私はSQLiteデータベースファイルがどのように更新されたかを知りたいと思っています。それをどうやって実装するのですか?SQLiteデータベースのチェックサム?

私が考えている最初の解決策はチェックサムを比較することですが、実際にチェックサムを扱う経験はありません。

答えて

1

データベースのサイズによっては、チェックサムを頻繁にポーリングして生成することが、マシンに多すぎる可能性があります。

OSファイルシステムに保存されている最後に変更されたメタデータを監視することを検討しましたか?

6

http://www.sqlite.org/fileformat.htmlによると、SQLite3はfile change counterをデータベースファイルの24..27に保持します。それは、例えば、何も全く変化しない状態の復元またはロールバックバイナリ後に変更することができ、ファイルの変更時間とは無関係です:

$ sqlite3 test.sqlite 'create table test (test)' 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000001 
$ sqlite3 test.sqlite "insert into test values ('hello world');" 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000002 
$ sqlite3 test.sqlite "delete from test;" 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000003 
$ sqlite3 test.sqlite "begin exclusive; insert into test values (1); rollback;" 
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' ' 
00000003 

は、2つのデータベースファイルは「同じ」であることを実際に確認するためにあなただけのことができますファイルをダンプした後(.dump)、出力をINSERTステートメントに減らし、その結果を比較のために(おそらく暗号的に安全なチェックサムによって)ソートしてください。しかし、それは平凡な過度のことです。

+0

私が考えていない方法でodを使用するための+1。 –

+0

ありがとうございます。 'sed | tr'構文は' awk 'を読むために "最適化"することができますNR == 1 {print $ 2 $ 3 $ 4 $ 5} '' – Tino

1

sqliteデータベースの1つがコピー(読み取り専用)としてのみ使用され、元のデータベースファイルが更新されているかどうかをチェックして、コピーを更新できるようにしたい場合、orginalそれは)コピーと変わらない場合は、あなただけのデータベースヘッダーのバイト24..27のために、両方のデータベースファイルの最初の100バイト(データベースヘッダ)http://www.sqlite.org/fileformat.html

を比較することができるSQLiteのドキュメントは言う:

24..27 4
ファイル変更カウンタ。データベーストランザクションがコミットされるたびに、このフィールドに格納されている32ビットの符号なし整数の値がインクリメントされます。

データベーストランザクションがコミットされたときだけファイル変更カウンタがインクリメントされないselectステートメントが含まれています。これは、トランザクションでセレクションをラップし、トランザクションを終了する場合に必要な動作です。