2011-01-09 40 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语句,这是您在事务中包装选择并提交结束事务时所需的行为。