这篇文档主要描述了SQLite 类库的结构 。这篇文档的内容对于那些想了解和修改SQLite内部结构的人将会非常有用。
简介
显示了SQLite的主要成分及各成分之间是如何相互关联的。接下来的文本将简要的介绍每个单一的成分。
这篇文档描述SQLite第三版,它和 2.8版以及早期的版本基本相似,但在一些细节上是有区别的。
接口程序
SQLite类库大部分的公共接口程序是由main.c ,legacy.c , 和vdbeapi.c 源文件中的功能执行的。 但有些程序是分散在其他文件夹的,因为在其他文件夹里他们可以访问有文件作用域的数据结构。sqlite3_get_table() 这个程序是在table.c 中执行的。sqlite3_mprintf() 在printf.c 中执行。sqlite3_complete() 在tokenize.c 中执行。 Tcl 接口程序用tclsqlite.c 来执行。
为了避免和其它软件在名字上有冲突,SQLite类库中所有的外部符号都是以sqlite3 为前缀来命名的。这些被用来做外部使用的符号(换句话说,这些符号用来形成SQLite的API)是以sqlite3_ .来命名的。
Tokenizer
当执行一个包含SQL语句的字符串时,接口程序要把这个字符串传递给tokenizer。Tokenizer的任务是把原有字符串分成一个个标示符,并把这些标示符传递给剖析器。Tokenizer是在C文件夹tokenize.c 中用手编译的。
在这个设计中需要注意的一点是,tokenizer调用parser。熟悉YACC和BISON的人们也许会习惯于用parser调用 tokenizer。 The author of SQLite的作者已经尝试了这两种方法 ,并发现用tokenizer调用parser会使程序运行的更顺利。YACC使程序更滞后一些。
Parser
The parser是一个部分,它基于文件场景赋予tokens意思。SQLite的parser是由Lemon LALR(1) parser generator产生的。Lemon和YACC/BISON一样做同样的工作 ,但是它使用不同的输入语句,这个输入语句是不易出错的。 Lemon也产生一个parser,这个parser是可重入的并且是线程安全的。 Lemon 定义了无终端解除程序的概念,所以当遇到语法错误的时候,它不会泄露内存。驱动Lemon的原文件在parse.y .
因为lemon是一个在发展机械上不常见的程序,所以lemon的源代码 (只是一个C文件)是在SQLite分布区的"tool"子目录下的。 lemon的文档是在分布区的 "doc"子目录下的。
代码发生器
在剖析器收集完符号并把之转换成完全的SQL语句时,它调用代码产生器来产生虚拟的机器代码,这些机器代码将按照SQL语句的要求来工作。在代码产生器中有许多文件; attach.c, auth.c, build.c, delete.c, expr.c, insert.c, pragma.c,select.c, trigger.c, update.c, vacuum.c and where.c.正是在这些文件中,最具有重要意义的事情发生了。 expr.c 处理表达式代码的生成。 where.c 处理SELECT, UPDATE andDELETE语句中WHERE子句的代码的生成。文件 attach.c, delete.c, insert.c, select.c,trigger.c update.c,和vacuum.c处理SQL语句中具有同样名字的语句的代码的生成。(每个文件调用expr.c andwhere.c中的程序) All other 所有SQL的其它语句的代码是由build.c生成的。文件auth.c执行sqlite3_set_authorizer()的功能.
虚拟机器
由代码生成器产生的程序由虚拟机器来运行。总而言之,虚拟机器主要用来执行一个为操作数据库 而设计的抽象的计算引擎。机器有一个用来存储中间数据的存储栈。每个指令包含一个操作代码和三个额外的操作数。
虚拟机器本身是被包含在一个单独的文件vdbe.c 中的。虚拟机器也有它自己的标题文件:vdbe.h 它在虚拟机器和剩下的SQLite类库之间定义了一个接口程序,vdbeInt.h 它定义了虚拟机器的结构。文件vdbeaux.c 包含了虚拟机器所使用的实用程序和一些被其它类库用来建立VM程序的接口程序模块。文件vdbeapi.c 包含虚拟机器的外部接口,比如sqlite3_bind_... 类的函数 。单独的值(字符串,整数,浮动点数值,BLOBS)被存储在一个叫 "Mem"的内部目标程序里,"Mem"是由vdbemem.c 执行的。
SQLite使用C语言程序来来执行SQL函数。即使内置的SQL函数也是用这种方法来执行的。大部分的SQL内置函数(ex:coalesce() ,count() ,substr() , and so forth)可以在func.c 里发现。日期和时间转换函数在date.c .
B-树
SQLite数据库在磁盘里维护,使用源文件btree.c 中的B-树执行。数据库中的每个表格和目录使用一个单独的B-tree。所有的 B-trees 被存储在同样的磁盘文件里。文件格式的细节被记录在btree.c .
开头的备注里。 B-tree子系统的接口程序被标题文件btree.h 所定义。.
页面高速缓存
B-tree模块要求信息来源于磁盘上固定规模的程序块。默认程序块的大小是1024个字节,但是可以在512和65536个字节间变化。页面高速缓存负责读,写和高速缓存这些程序块。页面高速缓存还提供重新运算和提交抽象命令,它还管理关闭数据库文件夹。B-tree驱动器要求页面高速缓存器中的特别的页,当它想修改页或重新运行改变的时候,它会通报页面高速缓存。为了保证所有的需求被快速,安全和有效的处理,页面高速缓存处理所有的微小的细节。
运行页面高速缓存的代码在专门的C源文件pager.c 中。页面高速缓存的子系统的接口程序被目标文件pager.h 所定义。
OS 接口程序
为了在POSIX和Win32 之间提供一些可移植性,SQLite操作系统的接口程序使用一个提取层。 OS提取层的接口程序被定义在os.h . 每个支持的操作系统有它自己的执行文件: Unix使用os_unix.c ,windows使用os_win.c 。每个具体的操作器具有它自己的标题文件:os_unix.h ,os_win.h , etc.
Utilities
内存分配和字符串比较程序位于util.c 。剖析器使用的表格符号被hash.c 中的无用信息表格维护。源文件utf.c 包含UNICODE转换子程序。SQLite有它自己的执行文件printf() (有一些扩展)在printf.c 中,还有它自己随机数量产生器在random.c .
测试代码
如果你计算回归测试脚本,多于一半的SQLite代码数据库的代码将被测试。 在主要代码文件中有许多assert() 语句。另外,源文件test1.c 通过test5.c 和md5.c 执行只为测试用的扩展名。os_test.c 向后的接口程序用来模拟断电,来验证页面调度程序中的系统性事故恢复机制
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com