如何使用保留字节创建数据库?

时间:2016-07-05 11:11:23

标签: database sqlite

可以在SQLite数据库的每页末尾保留字节。

根据documentation

  

SQLite能够在每个页面的末尾留出少量额外字节供扩展使用。例如,SQLite加密扩展使用这些额外字节来存储与每个页面相关联的随机数和/或加密校验和。 "预留空间"偏移量为20的1字节整数中的大小是每个页面末尾为扩展保留的空间字节数。该值通常为0.该值可以是奇数。

我想使用此功能并尝试创建一个普通的空数据库,并手动将字节(标题,偏移量为20;使用十六进制编辑器)更改为非空值( - > x10表示十六个保留字节)。

在sqlite3中使用.dbinfo:

  

(...)保留字节:16(...)

所以一切似乎都是正确的,但没有编辑数据库的命令会成功。 每个命令(例如CREATE TABLE example('id' int);)都会产生以下错误消息:

  

错误:数据库磁盘映像格式错误

所以我的问题是:如何使用这个保留空间创建一个SQLite数据库(不会因为格式错误而被拒绝)?

1 个答案:

答案 0 :(得分:2)

第一个数据库页面不仅包含标题,还包含sqlite_master表的第一个B-tree page。 您必须确保没有任何数据指向页面的可用区域之外。 如果主表是空的,则唯一要调整的是指向B树标题的偏移5处的单元格内容区域的开始的指针(在这种情况下应该简单地指向可用区域的末尾)。 / p>

无论如何,如果SQLite库没有使用SQLITE_OMIT_BUILTIN_TEST编译,您可以使用sqlite3_test_control() function设置此值(对于空数据库):

sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N)