`
gaofen100
  • 浏览: 1192376 次
文章分类
社区版块
存档分类
最新评论

SQLite数据库的体系结构

 
阅读更多

$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模拟验证电源失效后的页缓存机制的灾难恢复能力。

分享到:
评论

相关推荐

    SQLite数据库同步指南

    SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎,实现了SQLite与SQLite数据库之间以及SQLite与异构数据库Oracle、MySQL、SQLServer之间的增量的、双向的数据同步功能。在文章中对SQLite DBSync 的体系结构、...

    基于SQLite数据库的温湿度实时存储程序的设计

    文中设计了基于SQLITE数据库的温湿度实时存储程序。在该程序的设计过程中利用了嵌入式Linux平台和SQLITE体系结构特点,并考虑温湿度实时存储的要求,分别进行了系统时间的表创建、动态数据实时插入等程序的设计。在...

    SQLite嵌入式数据库及图象处理技术研究

    对嵌入式数据库特性及体系结构分析的基础上,使用c语言作为调用SQLite数据库的嵌入式语句,设计出了一种嵌入 式数据库SQLite图象处理方法,并将SQLite的源代码直接嵌入到应用程序中,使它们共用相同的进程空间,实现...

    Android创建和使用数据库SQLIte

    一、关系型数据库SQLIte  每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—...SQLite体系结构图如下:    编译器包括Tokenizer(词法分析器)、 Parser(语法分

    SQLite最全资料-完美书签

    部分PDF文件书签 ...SQLite 的体系结构简介 22 简介 22 接口程序 22 Tokenizer 22 Parser 23 代码发生器 23 虚拟机器 23 B-树 23 页面高速缓存 24 OS 接口程序 24 Utilities 24 测试代码 24

    SQLite嵌入式数据库系统的研究与实现

    本文在对嵌入式数据库特性研究的基础上,设计出一种嵌入式数据库系统的体系结构。结合嵌入式数据库的特点,运用SQLite在ARM-Linux平台上构建嵌入式数据库系统。

    Android-Architecture-Components:其中包含有关Android体系结构主题的个人说明

    该图显示了此体系结构的基本形式。 实体:使用架构组件时,该实体是一个带注释的类,它描述数据库表。 SQLite数据库:在设备上,数据存储在SQLite数据库中。 Room持久性库为您创建并维护此数据库。 DAO:数据访问...

    SQLite嵌入式数据库及图象处理技术研究 (2012年)

    对嵌入式数据库特性及体系结构分析的基础上,使用C语言作为调用SQLite数据库的嵌入式语句,设计出了一种嵌入式数据库SQLite图象处理方法,并将SQLite的源代码直接嵌入到应用程序中,使它们共用相同的进程空间,实现...

    SQLite学习手册_中文全本

    SQLite具有多方面的...分析器、分词器、虚拟机、Btree算法、高整缓存、程序体系结构,通过这些内容可以搞清楚很多计算机科学的经典概念。SQLite的模块化、小型化和简易性,使你可以很容易地专门研究其中的一个问题。

    Android数据存储与访问

    1、简单存储 2、建立存储设置界面 3、文件存储 4、数据库存储 ...SQLite数据库的特点和体系结构;SQLite数据库的建立和操作方法;ContentProvider的用途和原理;ContentProvider的创建与使用方法。

    android-database-sqlcipher:基于SQLCipher的Android SQLite API

    适用于AndroidSQLCipher在armeabi-v7a , x86 , x86_64和arm64_v8a体系结构的Android 4.1–Android 10上运行。 会费 我们欢迎您为AndroidSQLCipher做出贡献,需要提交。 所有提交都应基于master分支。 说明性终端...

    Android体系结构组件的示例。-Android开发

    感知房间生命周期的组件ViewModels LiveData样本构架组件和这些样本Android构架组件样本使用体系结构组件的样本集合:机房生命周期感知组件ViewModels LiveData分页导航ViewBinding WorkManager Samples BasicSample...

    嵌入式系统/ARM技术中的SQLite嵌入式数据库系统的研究与实现

    引 言  随着嵌入式系统的广泛应用及用户对数据处理... 1 嵌入式数据库系统的体系结构  嵌入式数据库将数据库系统与操作系统和具体应用集成在一起,运行在各种智能嵌入式设备上。与传统的数据库系统相比,它一般体

    Android数据存储和访问实验报告

    3.了解SQLite数据库的特点和体系结构; 4.掌握SQLite数据库的建立和操作方法; 5.理解ContentProvider的用途和原理; 6.掌握ContentProvider的创建与使用方法。 源码和整个工程会上传到博客中,若有需要可下载。 该...

    SQLite在嵌入式Web服务器中的应用.pdf

    和体系结构。在arm-linux 平台上成功移植了SQLite,。结合表单和CGI 技术,并利用SQLite 提供的C 语言API,成功地实现了客户与SQLite 嵌入式数据库系统的动态交互。此方案可 以广泛应用在工业设备远程控制、远程家庭...

    CertStreamMonitor:监视为特定域字符串和相关联生成的证书,将数据存储到sqlite3数据库中,并在站点联机时提醒您

    CertStreamMonitor体系结构依赖于3个脚本: certstreammonitor.py 该脚本作为守护程序运行。 阅读certstream feed,它选择符合您的条件的证书覆盖的主机名(conf中的SearchKeyWords参数)。 它将这些主机名及其与...

    通讯录管理系统的设计与实现(论文+源码)-kaic.pdf

    4.1 系统体系结构 4.1.1 系统模块图 4.2 数据库概念结构设计 4.3 数据库逻辑结构设计 第五章 详细设计 5.1 用户管理模块 5.1.1 功能描述 5.1.2 界面设计 5.1.3 程序流程图 5.1.4 程序代码 5.2 用户登录模块 5.2.1 ...

    Architecture-components-samples:Android体系结构组件的示例

    Android体系结构组件示例 使用的样本集合: 样品 显示如何使用SQLite数据库和Room持久化数据。 还使用ViewModels和LiveData。 显示如何使用Room通过内容提供程序公开数据。 在Kotlin中使用架构组件Dagger和Github ...

    一种新型网络网关中实时数据库设计与选择

    在多数据链网关Rosetta系统中,...该文简要的介绍了Rosetta的体系结构,设计了与数据库操作相关的表格和操作线程,测试了SQLite3和Oracle 8i的操作时耗,并结合数据库自身的特点讨论了在不同应用场合下实时数据库的选择。

    ANDROID移动开发基础案例教程

    第3~8章主要讲解Android中的数据存储以及四大组件,包括文件存储、SharedPreferences、SQLite数据库、Activity、BroadcastReceiver、Service、ContentProvider等。第9章主要讲解Android中的网络编程,包括HTTP协议...

Global site tag (gtag.js) - Google Analytics