一、简介
SQLite
主要由如图几种组件构成。
SQLite
运行过程:
-
SQL
编译器将SQL
语句翻译为bytecode
。 - 虚拟机(调用
B-Tree
引擎)执行bytecode
。
外部相关接口:
-
sqlite3_prepare_v2()
和相关接口负责编译SQL
语句为bytecode
。 -
sqlite3_stmt
对象包含编译SQL
语句后的bytecode
。 -
sqlite3_step()
接口将bytecode
转交给虚拟机执行。
二、组件介绍
2.1.接口(Interface)
大部分SQLite
的接口实现在源文件main.c
、legacy.c
、vdbeapi.c
中。为避免命名域冲突,外部接口/变量前缀为sqlite3_
,拓展接口/变量前缀为sqlite3xxx_
。
注:能够使用nm sqlite3 | grep sqlite3_
来查看外部接口函数名。
3.1.词法分析器(Tokenizer)
首先,SQL
语句通过词法分析器产生一系列词素(tokens
),然后调用语法分析器(Parser
)依次处理tokens
。相关源文件为tokenize.c
。
注:SQL
编译器部分实现需编译原理相关知识。
3.2.语法分析器(Parser)
token
通过语法分析器分析以生成语法树。
相关源文件为parse.y
,由Lemon parser generator
(一种使用LALR(1)
文法的语法分析器)使用。
3.3.代码生成(Code Generator)
当语法树解析完成,通过代码生成器分析语法树,生成bytecode
。
相关源文件:attach.c
、auth.c
、build.c
、delete.c
、expr.c
、insert.c
、pragma.c
、select.c
、trigger.c
、update.c
、vacuum.c
、where.c
、wherecode.c
、whereexpr.c
。
3.4.Bytecode引擎(Bytecode Engin)
Bytecode
引擎是用于运行bytecode
的虚拟机。
相关源文件:vdbe.c
、vdbe.h
3.5.B树(B-Tree)
SQLite
数据库使用B-Tree
算法在磁盘存储数据。
相关源文件:btree.c
。
3.6.页缓存(Page Cache)
B-Tree
从磁盘获取的数据大小固定,遂需要页缓存机制读、写和缓存这些页。
相关源文件:pager.c
、pager.h
。
注:类比操作系统物理内存分页管理机制。
3.7.操作系统接口(OS Interface)
SQLite
使用VFS
来完成磁盘读写操作。
3.8.实用工具(Utilities)
提供一些算法等工具支撑,例如内存分配,hash table
实现等。
相关源文件:util.c
。
3.9.单元测试(Test Code)
测试代码。
相关源文件:src/
以test
做前缀的文件。
网友评论