`
peng2251
  • 浏览: 12621 次
  • 性别: Icon_minigender_1
  • 来自: 国内
最近访客 更多访客>>
社区版块
存档分类
最新评论

SQLite 体系结构

阅读更多

                   SQLite体系结构

简介
      这份文档描述了sqlite数据库的体系结构,这些信息对想理解或者修改内部工作原理的朋友们会很有用。


 

    上图中包含了sqlite的主要的模块以及它们是怎么关联的。下面就简要介绍一下每个模块。
  (这份文档描述的是sqlite 3.0版本的,2.8以及以前的大体相似只是细节上有点不同)

 

接口
     大部分sqlite的接口在main.c,legacy.c,vdbeapi.c源文件中实现,但是有些常规性的分散在其他的文件中,因为它们可以在文件作用域内访问一些数据结构。比如,sqlite3_get_table() 在table.c中实现,sqlite3_mprintf() 在printf.c中实现,sqlite3_complete()在tokenizer.c中实现,tcl接口在tclsqlite.c中实现,更多关于sqlite的c接口可以访问
     为了避免与其他的软件产生命名冲突,所有的对外符号都以sqlite3作为前缀。(也就是说,这些符号构成了sqlite的api)

 

分词器
     当一个包含sql语句的字符串执行的时候,接口把字符串传递给分词器。分词器的工作就是把原始的字符串分割成标记,然后一个一个的传给语法分析器。这个分词器在tokenizer.c中用c实现。

     注意在这个设计里面,分词器调用语法分析器。那些熟悉YACC或者BISON的朋友们习惯用另一种方式设计-----用语法分析器调用分词器。sqlite的作者分别用这两种方法实现过,最后发现第一种方法工作效率比较高。YACC有很多局限性。

 

语法分析器
     语法分析器是一个根据环境给符号赋予意义的模块。这个分析器用了lemo的LALR(1)分析器生成。lemon跟YACC/BISON差不多,但是它用了一种很少产生错误的输入句法(syntax),而且lemon可以产生一个可重入(reentrant)和线程安全(thread-safe)的分析器。lemon可以定义无端点的破坏(non-terminal destructor)的概念,所以当出现错误句法时不会出现内存泄露。
     由于lemon是一个一般不会经常使用的程序,lemon完整的源文件(就一个c文件)在sqlite发布版本的tool文件夹下。关于lemon的文档在doc文件夹下。

 

代码生成器
      在分析器把符号翻译(assemble)成完整的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。这些文件是大部分古怪魔法(serious magic)发生的地方。expr.c处理表达式的代码生成,where.c 处理select,update,delete语句中where子句的代码生成,attach.c,delete.c insert.c select.c trigger.c update.c 和 vacuum.c 处理跟它们名字有关语句的代码生成(当有必要时,这些文件调用expr.c和where.c中常用的函数)。其余的sql 语句在build.c中生成。auth.c文件实现sqlite3_set_authorizer()接口.
 
虚拟机
   由代码生成器生成的代码被虚拟机执行。更多的关于虚拟的的信息可以访问————。摘要而言,虚拟机实现了一个专门处理数据库文件的抽象的计算引擎(abstract computing engine)。这个虚拟机包含了一个作为中间存储器的栈,每条指令包含一个操作码和多达3个的操作数。
    这个虚拟机完全在vdbe.c中实现,它有自己的头文件vdbe.h,里面定义了虚拟机和其他的模块的接口。vdbeInt.h里面定义了虚拟机里面私有的数据结构,vdbeaux.c里面包含了虚拟机常用的工具,也包含了其余为构造虚拟机程序的库的接口模块。vdbeapi.c 包含了虚拟机对外的接口比如sqlite3_bind_... 的函数族。数据类型(individual values)(strings,integer,floating point numbers,和BLOBs)存储在一个内部的叫做“mem”对象当中,在vdbemen.c中。
    sqlite用回调c语言函数(c-language routines)的方法实现sql 函数。甚至内建的sql函数都是用这种方式实现的。很多内建的sql函数(比如coalesce(),count(),substr(),还有很多),在func.c中实现,数据和时间的转换函数在date.c中实现。

 

B-Tree
   sqlite数据库在硬盘上用B-tree实现,具体代码在btree.c中。在数据库中的每个表和索引都使用单独的b-tree。所有的b-tree存储在用一个文件中。文件格式的细节在btree.c开头的一大段注释中记录。
   b-tree的接口在btree.h头文件中记录。

 

页缓存
  B-tree模块需要以一个固定大小的块从硬盘读取数据。默认的块大小是1024个字节,可以在512和65536个字节间变化。页缓存的任务是读,写,缓存块。页缓存提供回滚,原子委托抽象(atomic commit abstraction),处理数据文件的锁。b-tree需要从页缓存请求特殊的页,当修改页,委托,回滚时通知页缓存,页缓存处理所以的细节以确定快速,安全,高效的处理请求。

  实现页缓存的代码在pager.c中,页缓存子系统的接口在pager.h头文件中定义。

 

操作系统接口
   为了在POSIX和win32操作系统之间移植,sqlite用了一个抽象的层作为与操作系统间的接口。实现OS抽象层的接口在os.h中定义,每一种支持的系统有它们自己的实现方式,os_unix.c为unix,os_win.c为windows,当然也有自己相应的头文件os_unix.h和os_win.h,等等。

工具
  内存配置和字符串比较的功能在util.c中,语法分析器用到的符号表用hash 表实现,具体代码在hash.c中。utf.c包含了Unicode转换子程序。sqlite有它自己printf()实现(增加了很多功能),在printf.c中。也有自己的随机数生成的实现,在random.c中。
  
测试代码
    如果你依赖测试脚本,一多半sqlite的代码是为了测试用的。很多assert()语句在主代码文件中。另外,从test1.c到test5.c和md5.c只是为测试实现的,os_test.c中的接口是为了模拟断电时,核实页中错误恢复机制的。
 
  
  (注:第一次翻译,深刻体会到翻译是多么困难的一件事,也感觉到自己的英语,写作水平太菜了。原文:http://www.sqlite.org/arch.html
 
 
 

分享到:
评论

相关推荐

    Android技术体系结构

    Android 技术体系结构 Android 技术体系结构是 Android 操作系统的核心架构,它由四个主要部分组成:Linux Kernel、Android Runtime、Libraries 和 Applications。 一、Linux Kernel Linux Kernel 是 Android ...

    基于QQ的软件体系结构剖析.zip

    《基于QQ的软件体系结构剖析》 QQ作为中国乃至全球最为知名的即时通讯软件之一,其背后的软件体系结构设计是值得深入研究的。本篇将从QQ的架构设计、模块划分、通信机制、数据存储和安全策略等多个方面进行详细剖析...

    嵌入式WEB服务器BOA的应用研究

    ##### 3.2 SQLite体系结构简介 SQLite采用了一种优化的B树结构,以减少对磁盘的访问次数。它的体系结构由标记处理器(Tokenize)、解析器(Parser)、虚拟数据库引擎(VDBE)等多个部分组成。这些组件协同工作,...

    SQLite数据库同步指南

    SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎,实现了SQLite与SQLite数据库之间以及SQLite与异构数据库Oracle、MySQL、SQLServer...在文章中对SQLite DBSync 的体系结构、产品特色以及功能做了详细的介绍。

    arm-linux-compile.pdf

    **7.2 SQLite体系结构** SQLite采用自包含的服务器模型,不需要单独的服务器进程或线程。 **7.3 SQLite在ARM-Linux下的移植** 移植SQLite到ARM-Linux平台涉及对源码的编译配置和编译过程。 **7.4 SQLite常用的...

    SQLITE-ODBC,含x86和x64驱动

    在Windows操作系统中,驱动程序通常分为32位(x86)和64位(x64)两种版本,以适应不同体系结构的应用程序。"SQLITE-ODBC,含x86和x64驱动"这个压缩包提供了适用于32位和64位环境的SQLite ODBC驱动程序,确保无论你...

    sqlite3权威指南_v100.pdf

    - **体系结构**: 详细描述了SQLite的内部结构,包括各个组件的功能和作用。 - **接口(Interface)**: 用户与SQLite交互的方式,包括命令行工具和编程接口。 - **编译器(Compiler)**: 将SQL语句转换成中间表示的...

    SQLite odbc驱动-x86(x64)

    在标题中提到的“SQLite odbc驱动-x86(x64)”,表明该压缩包提供了适用于两种不同体系结构的驱动程序:32位(x86)和64位(x64)。这确保了无论用户的操作系统是32位还是64位,都能顺利安装并使用SQLite ODBC驱动来...

    SQLite 全面解析

    SQLite的体系结构包括接口程序、Tokenizer、Parser、代码发生器、虚拟机器、B-树、页面高速缓存、OS接口程序、Utilities和测试代码等多个部分。这些组件共同工作,使得SQLite能够高效地执行数据库操作。 与其他关系...

    SQLite3 权威指南 pdf

    #### 三、SQLite3 的体系结构 SQLite3的架构设计围绕以下几个主要组件: **1. 接口(Interface)** - 提供API供外部程序调用,实现数据库的创建、查询、更新等功能。 **2. 编译器(Compiler)** - 将SQL语句转换为...

    .NET SQLite开发工具

    8. **兼容性**:提及的库同时支持32位和64位系统,这意味着你的.NET应用可以在不同体系结构的机器上运行,无需担心兼容性问题。 9. **数据库设计工具**:压缩包中可能包含的数据库设计工具可以帮助你可视化地创建和...

    sqlite 3.7.8 C源代码

    源代码的结构通常分为多个模块,这些模块共同构成了SQLite的功能体系: 1. **Amalgamation**:压缩包中的"sqlite-amalgamation-3070800"是SQLite的一个特殊构建方式,将所有源代码整合到几个大文件中,便于一次性...

    SQLite移植和使用

    - 软件移植是指将原本针对X86架构开发的应用软件修改为能在其他体系结构(如ARM)上运行的过程。这通常涉及对源代码的适配和优化,以确保软件在目标平台上能正常运行。 2. **软件移植过程** - **环境搭建**:首先...

    基于ARM-Linux实现SQLite嵌入式数据库.pdf

    首先,我们将介绍Linux下的常见数据库技术,然后讨论嵌入式系统开发中对数据库的需求特点,接着对SQLite嵌入式数据库的体系结构和开发技术进行论述,最后结合ARM-Linux开发平台讲述具体的实现方法。 一、Linux下的...

    Android 体系结构介绍

    ### Android 体系结构详解 #### 一、概述 Android 是一个基于 Linux 的开源移动设备操作系统,它由 Google 维护并主导开发。Android 不仅是一个操作系统(Operating System, OS),还包括中间件(Middleware)和...

    C:\Temp\sqlite兼容64位和32位方案\sqlite兼容64位和32位方案

    标签"sqlite 64位 32位"进一步强调了这个主题是关于SQLite在不同体系结构下的兼容性问题。在开发跨平台的应用时,尤其是在Windows系统上,由于有32位和64位两种架构,开发者需要确保其使用的库和组件能在两种环境下...

    [★★★★★]全面解析SQLite.pdf

    SQLite的体系结构包括一系列组件:接口程序、Tokenizer、Parser、代码发生器、虚拟机、B-树、页面高速缓存、OS接口程序、Utilities和测试代码。这些组件共同协作,提供了完整的数据库操作能力。 在性能比较方面,...

Global site tag (gtag.js) - Google Analytics