SQlite源码分析

块存储结构

上面说明了chunk的概念,那么,块形成的链表如何存储呢?

这与用户申请的空间大小有关。在sqlite中,根据chunk中block的个数,将chunk链表存储到aiSmall[ i]、aIHash[i]、iMaster开始的数组中,其中aiSmall[i]存储block个数为2-12的chunk块链表;aIHash[i]存储block个数为大于等于61的chunk块链表;有很多block的块,特别大就存于iMaster开始的空间中,其block的个数为szMaster。

存储结构简单表示如下图。

图3.3.1 小chunk块存储图

大的chunk块存储到aiHash[i]中,存储结构与小chunk类似,有一个区别就是,小chunk块的存储可以列举完,但中块chunk存储无法列举,原因是不知道最大block个数上限是多少。中块链表u32 aiHash 表保存了大于等于13个block的数据,数据块hash后放到对应的链表,例如aiHash[ 0 ] 放 大小为 61, 122 , 183个block的块;aiHash[ 1 ] 放 大小为 62, 123,184个block的块;等等。这里就不再画图说明。