$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. java之javadoc命令

    [javadoc命令的用法] 1.java源文件里,注释以/**开始 并以*/结束,里面可以包含普通文件,HTML标记和javaDoc标记.这些将构成javaDoc文档. 2.javadoc命令只能处 ...

  2. php用户注册

    前言 网站用户注册与登录是很常用的一个功能,本节教材就以此来演示一下 PHP 中如何开发用户注册与登录模块. 本节需要用到的重点 PHP 基础知识: PHP 中预定义 $_POST 和 $_GET 全 ...

  3. VBS基础篇 - 常量

    常量:指的是在程序运行过程中其值保持不变的量,它用来保存固定不变的数值,字符串等常数 . 常量的定义:在vbscript中使用使用 Const 指令可以创建名称具有一定含义的字符串型或数值型常量,并给 ...

  4. python学习小结4:类

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 类和对象是面向对象编程的两个主要方面.类:创建一个新类型,而对象是这个类的实例,类使用class关键字创建.类的域和方法被列在一个 ...

  5. LintCode-Median II

    Numbers keep coming, return the median of numbers at every time a new number added. Example For numb ...

  6. Careercup - Facebook面试题 - 4909367207919616

    2014-05-01 01:23 题目链接 原题: WAP to modify the array such that arr[I] = arr[arr[I]]. Do this in place i ...

  7. windows 2008 怎么对外开放端口

    服务器已经运行了程序,但是android客户端连接不上, 网上提示说用: start /min telnet 192.168.3.42 2121 查看,但是我的提示tenlet找不到命令,估计是端口的 ...

  8. php输出错误屏蔽的函数

    /** * 设置默认值方法 * @param mult $data * @param string $key key值 * @param string $default 默认值 */ public s ...

  9. 【BZOJ】【2253】【WC 2010 BeijingWC】纸箱堆叠

    树套树 Orz zyf 我的树套树不知道为啥一直WA……只好copy了zyf的写法TAT 这题还可以用CDQ分治来做……但是蒟蒻不会…… //y坐标的树状数组是按权值建的……所以需要离散化…… /** ...

  10. 【娱乐】高端小游戏Manufactoria

    Manufactoria 是一款游戏.游戏中,一家生产机器人的工厂内部出了一 些问题,生产出来的机器人有很多不合格的.一个机器人可以用一个含有红色和 蓝色的颜色串来描述,只有颜色串符合某种规律的机器人 ...