2011-01-09 77 views
3

我想能夠判斷SQLite數據庫文件是否以任何方式更新。我將如何去實施呢?SQLite數據庫的校驗和?

我想到的第一個解決方案是比較校驗和,但我沒有任何使用校驗和的經驗。

回答

1

根據數據庫的大小,連續輪詢和生成校驗和可能對機器來說過於密集。

您是否考慮過監視操作系統文件系統上存儲的上次修改元數據?

6

根據http://www.sqlite.org/fileformat.html SQLite3在數據庫文件的字節24..27中維護file change counter。它是獨立的文件更改時間,其中,例如,可以二進制後更改,而沒有任何改變都恢復或回滾:

$ 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 

爲了真正確保兩個數據庫文件都是「平等」的只能是你轉儲文件後(.dump),將輸出減少到INSERT語句並對結果進行排序以進行比較(可能通過一些加密安全校驗和)。但這太簡單了。

+0

+1以我沒有想到的方式使用od。 – 2011-02-17 13:25:08

1

如果其中一個sqlite數據庫僅用作副本(只讀),並且您想要檢查原始數據庫文件是否已更新,以便您可以更新副本(例如從Web上進行更新,而無需下載那麼你可以比較兩個數據庫文件(數據庫頭文件)的前100個字節http://www.sqlite.org/fileformat.html

對於數據庫頭的字節24..27,SQlite doc說:

24..27 4
文件更改計數器。每一個數據庫事務提交時,存儲在這一領域的32位無符號整數的值增加

看來,當一個數據庫事務提交的文件更改計數器不增加,但只有經過一些測試包含select語句,這是您在事務中包裝選擇並提交結束事務時所需的行爲。