SQLITE学习总结(1)
SQLite体系架构
SQLite体系结构
SQLite整个系统采用模块化的设计,主要包括三个子系统,编译器、虚拟机、后端(包括八个独立的模块)。
编译器(Compiler)
在编译器中
分词器(Tokenizer)–当执行一个包含SQL语句的字符串时,接口程序把字符串传递给Tokenizer,将原有字符串分割成一个个标识符,并将这些标识符传递给分析器。
分析器(Parser)– 是在指定上下文中赋予标识符具体的含义。在SQLite中使用语法分析器Lemon,针对SQL进行语法检查,然后再转化为分层的数据结构—语法树。
代码生成器(Code Generator)– 代码生成器针对语法树进行处理,生成SQL对应的“汇编语言”,最后由虚拟机执行。
虚拟机(Virtual Machine)
虚拟机是针对真实计算机资源的一个抽象,它为语言程序提供了一套完整的计算机接口。虚拟机是SQLite的核心,它的上层模块和下层模块都是为它服务。用户程序发出SQL语句请求,在经过编译处理后,生成字节代码程序,然后由虚拟机解释执行,在虚拟机执行的过程中,又会调用B-Tree模块相关接口,并输出执行的结果。
虚拟机指令格式
操作码 | P1 | P2 | P3 | P4 | P5 |
---|
所有SQL指令,详见[SQL字节码引擎]
后端(BackEnd)
后端主要包括B-Tree,页面高速缓存(page cache)和OS接口,B-Tree主要功能就是索引,它维护各个页面之间复杂关系,便于快速查找数据,而页面高速缓存主要作用就是通过OS接口在B-Tree和Disk之间传递页面。
B-Tree – 数据库、数据库中的每个表和索引都以一颗单独的B-Tree单独存储在磁盘中。
页面高速缓存 – B-Tree模块以固定大小数据块形式从磁盘上请求信息,页面高速缓存负责读、写和缓存这些数据块。
SQLite执行流程和接口
1. 打开、关闭数据连接
sqlite3_open — 该函数创建数据库连接对象sqlite3,起
到构造器的作用
sqlite3_close — 该函数删除对象sqlite3,起到析构的作用
int sqlite3_open();
int sqlite3_open_v2();
int sqlite3_close(sqlite3*);
int sqlite3_close_v2(sqlite3*);
2. 编译SQL
sqlite3_prepare_v2 — 该函数将SQL文本编译成字节码。同时创建一个prepared statement对象sqlte3_stmt,起到构造器的作用
(其中sqlite3_prepare已经不再推荐使用)
3. 执行SQL
sqlite3_step — 该函数是虚拟机的接口,用来运行包含在
sqlite_statement中的字节流。
sqlite3_exec — 该函数其中封装了sqlite3_prepare_v2
sqlite3_step、sqlit3_finalize,可以直接通过一个函
数执行多条的SQL语句。
4.获取数据采集结果
5.对象销毁与重用
6.SQL语句绑定参数
数据库连接对象和SQL语句对象由下面几个核心的C/C++接口来控制:
sqlite3_open()
sqlite3_prepare()
sqlite3_step()
sqlite3_column()
sqlite3_finalize()
sqlite3_close()
通常交互的流程如下:
1.调用sqlite3_prepare_v2来编译生成指令流,返回一个sqlite3_stmt对象,其实这个对象就是vdbe对象。
2.调用sqlite3_bind_*来将参数传递给vdbe,
3.调用sqlite3_step进行执行,这时候会启动虚拟机执行一条条指令,直到遇到中断或者停止指令为止
4.调用sqlite3_column_*来获取上一步准备好的结果集
5.调用sqlite3_finalize,销毁vdbe对象,结束这次执行。