1、sqlite3 的体系架构
- 对外接口:
大部分C语言界面都可以在源文件main.c,legacy.c和vdbeapi.c中找到,尽管一些例程分散在其他文件中,他们可以访问具有文件范围的数据结构
- 词法分析器:
当执行一个包含SQL语句的字符串时,接口程序要把这个字符串传递给tokenizer。
Tokenizer的任务是把原有字符串分割成一个个标识符(token),并把这些标识符传递给解析器。
Tokenizer是用手工编写的,在C文件tokenize.c中。
- 语法分析器:
语法分析器的工作是在指定的上下文中赋予标识符具体的含义。 SQLite的语法分析器使用Lemon
LALR(1)分析程序生成器来产生,Lemon做的工作与YACC/BISON相同,但它使用不同的输入句法,这种句法更不易出错。
Lemon还产生可重入的并且线程安全的语法分析器。Lemon定义了非终结析构器的概念,当遇到语法错误时它不会泄露内存。驱动Lemon的源文件可在parse.y中找到。
- 代码生成器:
语法分析器在把标识符组装成完整的SQL语句后,就调用代码生成器产生虚拟机代码,以执行SQL语句请求的工作。
代码生成器包含许多文件:attach.c, auth.c, build.c, delete.c, expr.c,insert.c,pragma.c, select.c, trigger.c, update.c, vacuum.c和where.c。
- 虚拟机引擎:
虚拟机本身完全包含在单个源文件 vdbe.c 中,vdbe.h 头文件定义了虚拟机与 SQLite库的其余部分之间的接口,
vdbeInt.h 定义了虚拟机本身专用的结构和接口,代码生成器生成的代码由虚拟机来执行。
总的来说,虚拟机实现一个专为操作数据库文件而设计的抽象计算引擎。
它有一个存储中间数据的存储栈,每条指令包含一个操作码和不超过三个额外的操作数。
- B树:
SQLite 数据库使用 btree.c 源文件中找到的 B 树实现在磁盘上进行维护。对数据库中的每个表和每个索引使用单独的 B树。
所有 B 树都存储在同一个磁盘文件中
- 页面高速缓存(Page Cache) :
B 树模块以固定大小的页的形式从磁盘请求信息。默认page_size为 4096 字节,但可以是512 和 65536 字节之间的 2 的任意幂。 -->pager.c
页面缓存负责读取、写入和缓存这些页面。页面缓存还提供回滚和原子提交抽象,并负责锁定数据库文件。
B树驱动程序从页面缓存请求特定页面,并在要修改页面或提交或回滚更改时通知页面缓存。页面缓存处理所有混乱的细节,以确保快速,安全,高效地处理请求。
- 操作系统接口:
为了在POSIX和Win32操作系统之间提供移植性,SQLite使用一个抽象层来提供操作系统接口。
OS抽象层的接口在os.h中定义,每种支持的操作系统有各自的实现:Unix使用os_unix.c,Windows使用os_win.c,等等
- 工具 :
内存分配和字符串比较函数位于util.c中。语法分析器使用的符号表用Hash表来维护,其实现位于hash.c中。
源文件utf.c包含Unicode转换子程序。SQLite有自己的printf()实现(带一些扩展功能),在printf.c中,还有自己的随机数生成器,在random.c中
- test :
测试代码