这篇文档主要描述了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 and
DELETE语句中WHERE子句的代码的生成。文件 attach.c, delete.c, insert.c, select.c,
trigger.c update.c,和vacuum.c处理SQL语句中具有同样名字的语句的代码的生成。(每个文件调用expr.c and
where.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
向后的接口程序用来模拟断电,来验证页面调度程序中的系统性事故恢复机制
分享到:
相关推荐
### Android 体系结构详解 #### 一、概述 Android 是一个基于 Linux 的开源移动设备操作系统,它由 Google 维护并主导开发。Android 不仅是一个操作系统(Operating System, OS),还包括中间件(Middleware)和...
SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎,实现了SQLite与SQLite数据库之间以及SQLite与异构数据库Oracle、MySQL、SQLServer...在文章中对SQLite DBSync 的体系结构、产品特色以及功能做了详细的介绍。
Android 技术体系结构 Android 技术体系结构是 Android 操作系统的核心架构,它由四个主要部分组成:Linux Kernel、Android Runtime、Libraries 和 Applications。 一、Linux Kernel Linux Kernel 是 Android ...
《基于QQ的软件体系结构剖析》 QQ作为中国乃至全球最为知名的即时通讯软件之一,其背后的软件体系结构设计是值得深入研究的。本篇将从QQ的架构设计、模块划分、通信机制、数据存储和安全策略等多个方面进行详细剖析...
在Windows操作系统中,驱动程序通常分为32位(x86)和64位(x64)两种版本,以适应不同体系结构的应用程序。"SQLITE-ODBC,含x86和x64驱动"这个压缩包提供了适用于32位和64位环境的SQLite ODBC驱动程序,确保无论你...
SQLite的体系结构包括接口程序、Tokenizer、Parser、代码发生器、虚拟机器、B-树、页面高速缓存、OS接口程序、Utilities和测试代码等多个部分。这些组件共同工作,使得SQLite能够高效地执行数据库操作。 与其他关系...
在标题中提到的“SQLite odbc驱动-x86(x64)”,表明该压缩包提供了适用于两种不同体系结构的驱动程序:32位(x86)和64位(x64)。这确保了无论用户的操作系统是32位还是64位,都能顺利安装并使用SQLite ODBC驱动来...
- 软件移植是指将原本针对X86架构开发的应用软件修改为能在其他体系结构(如ARM)上运行的过程。这通常涉及对源代码的适配和优化,以确保软件在目标平台上能正常运行。 2. **软件移植过程** - **环境搭建**:首先...
- **体系结构**: 详细描述了SQLite的内部结构,包括各个组件的功能和作用。 - **接口(Interface)**: 用户与SQLite交互的方式,包括命令行工具和编程接口。 - **编译器(Compiler)**: 将SQL语句转换成中间表示的...
#### 三、SQLite3 的体系结构 SQLite3的架构设计围绕以下几个主要组件: **1. 接口(Interface)** - 提供API供外部程序调用,实现数据库的创建、查询、更新等功能。 **2. 编译器(Compiler)** - 将SQL语句转换为...
8. **兼容性**:提及的库同时支持32位和64位系统,这意味着你的.NET应用可以在不同体系结构的机器上运行,无需担心兼容性问题。 9. **数据库设计工具**:压缩包中可能包含的数据库设计工具可以帮助你可视化地创建和...
源代码的结构通常分为多个模块,这些模块共同构成了SQLite的功能体系: 1. **Amalgamation**:压缩包中的"sqlite-amalgamation-3070800"是SQLite的一个特殊构建方式,将所有源代码整合到几个大文件中,便于一次性...
首先,我们将介绍Linux下的常见数据库技术,然后讨论嵌入式系统开发中对数据库的需求特点,接着对SQLite嵌入式数据库的体系结构和开发技术进行论述,最后结合ARM-Linux开发平台讲述具体的实现方法。 一、Linux下的...
### Android 体系结构详解 #### 一、概述 Android 作为一种广泛应用的移动设备操作系统平台,其内部架构设计决定了它的灵活性和高效性。Android 的体系结构可以分为四个主要层次:操作系统层(OS)、各种库...
SQLite的体系结构包括一系列组件:接口程序、Tokenizer、Parser、代码发生器、虚拟机、B-树、页面高速缓存、OS接口程序、Utilities和测试代码。这些组件共同协作,提供了完整的数据库操作能力。 在性能比较方面,...
32位和64位版本的System.Data.SQLite分别适用于不同体系结构的系统。32位版本适用于传统的32位操作系统或在32位模式下运行的64位操作系统,而64位版本则为64位操作系统设计,能更好地利用64位系统的内存资源。在选择...
标签"sqlite 64位 32位"进一步强调了这个主题是关于SQLite在不同体系结构下的兼容性问题。在开发跨平台的应用时,尤其是在Windows系统上,由于有32位和64位两种架构,开发者需要确保其使用的库和组件能在两种环境下...