SQlite源码分析

Pager的相关参数

       Pager定义了一系列的参数,有PAGER_H;日志文件的默认大小,也就是对当前日志文件大小定义最大值,一个负值意味着没有限制,所以这里赋值为-1;定义页号,也就是页面数量,第一页被称为Pager1,0用来表示没有页面;结构体Pager,每一个打开文件都由一个单独的Pager结构的实例来管理;每一个内存页面的头结构 为 DbPager,这是页面可以处理的类型;一个专门为解决windows/posix不兼容问题而保留的页码,它从未在SQLite数据库中使用过。他在日志中使用是为了表示剩余的日志文件都用来存储主日志名了,没有其他用于回滚的日志了;sqlite3PagerOpen中标志参数的值。一个是不使用回滚日志,另一个是表示内存数据库;sqlite3PagerLockingMode中第二个参数的有效值;journalmode编码的数字常量。定义了journalmode的查询值、通过删除、截断日志文件来提交和通过归零日志标题来提交的值,还有省略日志、内存日志文件和使用写前文件等。
       设计pager的一些说明:
① 页一般情况下不可复写;只有当满足(a)页面和同一个部分的所有其他页面是可重写的(b)原子页面启用了写优化,并且整个事务是由单个页面的变化构成。中任一条件才能实现复写。
② 页面内容被写进回滚日志,要匹配回滚日志被写入时和事务开始时数据库中的内容。
③ 被写入数据库的文件为页面大小的整数倍,并且在页边界上对齐。 ④ 从数据库中读取的文件要在页边界上对齐,并且为页面大小的整数倍,还要是取于数据库文件的前100个字节。
⑤ 所有写入数据库文件的内容,需要在回滚日志被删除,截短,归零之前同步。
⑥ 如果一个主日志被使用,所有写进数据库文件的内容需要在主日志文件被删除之前被同步。如果两个数据库对于所有查询给出同样的答案,释放列表子页面的内容可以任意的改变而不影响数据库的逻辑等价性,两个数据库(或在两点时间上的相同数据库)是被称为“逻辑上等效”的。
⑦ 在任何时候,如果任何子集,包括空集和总集,不同步的更改回滚日志被删除;并且日志被回滚,结果数据库文件将逻辑的相当于事务刚开始时候的数据库文件。在每个事务开始和结束的时候,数据库文件都格式必须正确。
⑧ 当事务回滚,VFS的xTruncate方法被调用来恢复数据库文件到和它在事务开始的时候的同样大小。(在某些VFS中,xTruncate方法是空操作,但这并不改变SQLite调用它的事实)。当向数据库里写入文件时,需要在数据库文件上加独占锁。
⑨ 数据库文件在开始和每次事务结束的时候是格式良好的。
⑩ 数据库文件在写入时加上排他锁;在读任何的数据库文件内容的时候对数据库文件加上共享锁