$1 简介
    本文档描述了SQLite库的体系结构,这些信息对那些想理解和修改SQLite的内部工作机制的人是有用的。
    下图显示了SQLite的主要组成部件及其相互关系,下面的内容将描述每一个部件。(具体的图参见http://www.sqlite.org/arch2.gif)

本文档描述SQLite 3.0版本,2.8版或更早期的版本与此相似,只是细节上有所不同。
$2 接口
    虽然有些函数分布在其它的文件中,但是主要的SQLite库的公用接口函数是在main.c,legacy.c和vdbeapi.c源代码文件中实现的。 sqlite3_get_table()函数在table.c中实现,sqlite3_mprintf()在printf.c中实现, sqlite3_complete()是在tokenize.c中实现的。Tcl接口在tclsqlite.c中实现的。关于SQLite的C接口更完整 的信息在http://www.sqlite.org/capi3ref.html中描述了。
    为避免和其它软件的命名冲突,SQLite库中所有的外部符号都以sqlite3为前缀。这些符号目的就是为外部使用,换句话说,所有以sqlite3_开始的符号,形成了SQLite的API。
$3 词法分析器
    当一个SQL语句执行时,接口首先把包含该SQL语句的字符串传给词法分析器来进行处理。词法分析器负责把字符串分成一个一个的词法单元,然后把词法单元 传递给语法分析器,词法分析器是在tokenize.c文件中实现,这个代码是手编的,而不是使用lex之类的工具生成的。
    需要注意的是,在本设计中,词法分析器调用语法分析器,熟悉YACC和BISON的人一般总是在语法分析器中调用词法分析器,SQLite的作者这两种方法都试过,发现在词法分析器中调用语法分析器更好。
$4 语法分析器
    语法分析器根据上下文对词法分析出来的单元理解其涵义。SQLite的语法分析器是使用Lemon(http://www.hwaci.com/sw/lemon/)的LALR (1)工具产生器生成的。Lemon和YACC/BISON工具差不多,但是Lemon使用一种不同的输入语法,这种语法更难以出错。Lemon能产生一 个可重入和线程安全的语法分析器,Lemon定义了一种非终结符析构器,以致在语法出现错误时不至于出现内存泄漏。Lemon分析器的输入文件在 parse.y中定义。
    由于Lemon不是一个常见的程序,其完整的源代码仅一个C文件在SQLite的tool子目录中。Lemon的文档在doc子目录中。
$5 代码生成器
    在语法分析器分析完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。这些文件就是我们的魔法发生的地方。expr.c处理表达式的代码生成,where.c处理SELECT,UPDATE和DELETE语 句中的WHERE子句的代码生成,attach.c, delete.c, insert.c, select.c, trigger.c update.c和vacuum.c处理与其名字相同的SQL语句的代码生成,这其中的每个文件在必要时都调用expr.c和where.c中的函数。其 它的SQL语句在build.c中实现,auth.c文件实现sqlite3_set_authorizer()函数的功能。
$6 虚拟机
    代码生成器产生的程序在虚拟机上运行,该虚拟机的信息在文档http://www.sqlite.org/opcode.html中 描述。概括来讲,虚拟机实现了一个抽象的计算引擎,这个计算引擎用来操作数据库文件。虚拟机有一个栈用于保存计算的中间状态,每条指令包括一个操作码和最 多三个操作数。虚拟机在vdbe.c中实现。虚拟机有它自己的头文件:vdbe.h文件定义了虚拟机和SQLite库的接口,vdbeInt.h文件定义 了虚拟机的结构。vdbeaux.c文件中包含一些虚拟机和接口模块使用的工具。vdbeapi.c文件包含了虚拟机的外部接口,例如 sqlite3_bind_... 之类的函数。字符串,整数,浮点数,BLOB类型都被存在一个名为Mem的内部对象中,这个内部对象在vdbemem.c文件中实现。
    SQLite使用回调C语言函数的方法来实现SQL语句的功能。甚至内建的SQL功能也是通过这种方法来实现。大部分SQL内建的函数,例如 coalesce(),count(),substr()等等,在func.c中实现。日期和时间转换函数在date.c中实现。
$7 B树
    SQLite使用B树来实现数据库,B树在btree.c文件中实现。数据库中的每个表和索引都使用一个单独的B树。所有的B树都存放在一个磁盘文件中。该数据库文件格式的细节在btree.c文件开始部分的注释里详细描述。
    B树子系统的接口在头文件btree.h中定义。
$8 页缓存
    B树模块使用固定的块大小从磁盘中请求信息。缺省的块大小为1024B,但是可以从512到65536B调整。页缓存负责读,写和缓存这些块。页缓存也提 供了回滚和原子提交的功能抽象和数据库文件的锁操作。B树驱动程序从页缓存中取得页,并且通知页缓存程序何时修改,提交或回滚操作,页缓存处理所有的这些 麻烦细节,确保请求被快速,安全和高效地处理。
    实现页缓存机制的代码在单个C文件pager.c中。页缓存子系统的的接口在pager.h中定义。
$9 操作系统接口
    为了提高在POSIX和Win32系统中的可移植性,SQLite和操作系统的接口使用了一个抽象层。此抽象层的接口在os.h中定义。每个操作系统尤其 自己的实现:os_unix.c是Unix的,os_win.c是windows系统的,等等。每个操作系统相关的实现尤其自己的头文件: os_unix.h, os_win.h等等。
$10 工具程序
    内存分配和大小写不敏感的字符串比较函数在util.c文件中实现,语法分析器使用的符号表是hash表,此表在hash.c中实现。utf.c文件包含 Unicode转换函数。SQLite有它自己的printf()函数实现,这在printf.c中定义,和随机数函数实现,这在random.c中实 现。
$11 测试代码
    代码中有一半以上的是为测试服务的。在主要的代码文件中有许多assert()函数。test1.c到test5.c和md5.c都是用于测试的。os_test.c模拟验证电源失效后的页缓存机制的灾难恢复能力。

http://www.cnblogs.com/qiubole/archive/2007/11/21/966678.html

SQLite数据库的体系结构(翻译自sqlite.org)的更多相关文章

  1. Java操作Sqlite数据库-jdbc连接

    Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...

  2. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

  3. powershell玩转sqlite数据库

    脚本经常需要处理文本,有时候是行列整齐文本.那么powershell脚本处理行列文本有几种方法呢?一种是excel,另外的一些是?access?sqlite? sqlite是一个很小巧的,很方便嵌入到 ...

  4. iOS - OC SQLite 数据库存储

    前言 采用 SQLite 数据库来存储数据.SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些. 注意:写入数据库,字符串可以采用 char 方式,而从数据库中 ...

  5. iOS - Swift SQLite 数据库存储

    前言 采用 SQLite 数据库来存储数据.SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些. 注意:写入数据库,字符串可以采用 char 方式,而从数据库中 ...

  6. SQLite数据库简介(转)

    大家好,今天来介绍一下SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准 ...

  7. Android实例-操作sqlite数据库之Grid显示图片(XE8+小米2)

    结果: 1.数据库文件,记得打包到程序中(assets\internal\). 操作方法: 1.新建firemonkey mobile application①菜单->File->New- ...

  8. sqlite数据库方言配置

    1. application.properties配置sqlite数据库 spring.datasource.url = jdbc:sqlite:C:/test/sqlite/DB/sqlite.db ...

  9. sqlite数据库读写在linux下的权限问题

    近期在学linux,恰巧有个php项目要做.于是配置好环境打算在linux下做. 无奈站点执行后一片空白.经过调试发现是sqlite数据库的问题. 安装sqlite扩展 apt-get install ...

随机推荐

  1. Operating Cisco Router

    Operating Cisco Router consider the hardware on the ends of the serial link, in particular where the ...

  2. Microsoft Press Free eBook

    微软的免费的电子书, 都是Microsoft Press 出版的 有以下价格方面 Windows Server(大体上都是Windows Server 2012 ) Microsoft Azure(好 ...

  3. 项目文件包含 ToolsVersion="12.0" 设置,而此版本的 MSBuild 不支持该工具版本

    解决方法: 右键点击你的项目,选择属性,再点击配置属性中的常规,常规中有个平台工作集,把V120改成V100,点击应用即可.

  4. vim中执行shell命令小结

    vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...

  5. swift UIAlertController教程

    在iOS8中,UIAlertView与UIActionSheet都已经退休,取而代之的是UIAlertController!它的使用示范如下://弹出一个警告框,标题是“提示”,信息是“我的博客:oa ...

  6. 说说iOS中的手势及触摸

    一.响应链 在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应. 首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResp ...

  7. C/C++中的可变参函数

    可变参函数最好的实例:printf();参数可变 包含的头文件: C语言中:#include<stdarg.h> C++中的可变参的头文件:#include<cstdarg>, ...

  8. .NET核心代码保护策略-隐藏核心程序集

    经过之前那个道德指责风波过后也有一段时间没写博客了,当然不是我心怀内疚才这么久不写,纯粹是程序员的通病..怎一个懒字了得,本来想写一些长篇大论反讽一下那些道德高人的.想想还是算了,那样估计会引来新一波 ...

  9. 来吧,给你的Winform列表控件画个妆

    前言 以前看别人的控件好看只有羡慕的份:以前觉得控件重绘是个很复杂的东西:以前知道MSDN很全面很专业却一直没有好好用起来: 作为初级程序猿,不能原地踏步,来吧,让我们一起把 TreeView 美化一 ...

  10. html+css学习笔记 3[浮动]

    inline-block/float(浮动) 回顾:inline-block 特性:      1.块在一排显示 2.内联支持宽高 3.默认内容撑开宽度 4.标签之间的换行间隙被解析(问题) 5.ie ...