SQlite源码分析

页面缓存

Pager部分与PCache部分紧密相连,虽然我本次分到的代码并未包含PCache,但是还是简单介绍一下。
SQLite将页内存分配系统实现为两层:
1、PCache结构为页内存分配系统的上层接口结构,与具体的实现无关。
2、用户定义缓冲区模块,PCache1结构为页内存分配系统的默认实现,直接对页空间的分配与回收,上层使用者无需关心其内部实现。
Pcache.c这个文件实现的是页面缓存。
一个完整的页面缓存是这种结构的一个实例。

struct PCache {
  PgHdr pDirty, pDirtyTail;         / 按LRU顺序的脏数据页列表 /
  PgHdr pSynced;                     / 在脏数据列表中最后同步的页/
  int nRef;                           / 引用页的数量 /
  int szCache;                        / 配置的缓存的大小 /
  int szPage;                         / 缓存中每个页的大小 /
  int szExtra;                        / 每个页面的额外空间大小 /
  int bPurgeable;                     / 如果页面是在后备存储器则为真 /
  int (xStress)(void,PgHdr);       / Call to try make a page clean /
  void pStress;                      / xStress的参数 /
  sqlite3_pcache pCache;             / Pluggable cache module /
  PgHdr pPage1;                      / 指向第一页的指针 /
};
涉及到关于Cache的函数:
1.sqlite3PagerClearCache()
除非这是一个内存或者临时数据库,清除页面缓存
2.sqlite3PagerCacheStat()
参数eStat一定是SQLITE_DBSTATUS_CACHE_HIT或者SQLITE_DBSTATUS_CACHE_MISS。在返回之前,
pnVal是通过当前缓存命中或者未命中计数来增加,通过eStat的值。如果重置参数是非零,缓存命中或者未命中在返回前都是0.
3.sqlite3PagerSetCachesize()
改变所允许的内存页面的最大页数