`
julyboxer
  • 浏览: 221009 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQLite的体系结构介绍

阅读更多

这篇文档主要描述了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.cmd5.c 执行只为测试用的扩展名。os_test.c 向后的接口程序用来模拟断电,来验证页面调度程序中的系统性事故恢复机制

分享到:
评论

相关推荐

    Android 体系结构介绍

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

    SQLite数据库同步指南

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

    Android技术体系结构

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

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

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

    SQLITE-ODBC,含x86和x64驱动

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

    SQLite odbc驱动-x86(x64)

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

    SQLite 全面解析

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

    SQLite移植和使用

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

    sqlite3权威指南_v100.pdf

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

    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的一个特殊构建方式,将所有源代码整合到几个大文件中,便于一次性...

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

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

    Android 体系结构介绍.doc

    ### Android 体系结构详解 #### 一、概述 Android 作为一种广泛应用的移动设备操作系统平台,其内部架构设计决定了它的灵活性和高效性。Android 的体系结构可以分为四个主要层次:操作系统层(OS)、各种库...

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

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

    System.Data.SQLite

    32位和64位版本的System.Data.SQLite分别适用于不同体系结构的系统。32位版本适用于传统的32位操作系统或在32位模式下运行的64位操作系统,而64位版本则为64位操作系统设计,能更好地利用64位系统的内存资源。在选择...

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

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

    SQLite的权威指南

    该章节还介绍了SQLite的发展历史、用户群体、体系结构和特色,如零配置、兼容性、紧凑性、简单、适应性、不受拘束的授权、可靠性和易用性等。这些特色使得SQLite在众多数据库管理系统中脱颖而出。 第2章主要介绍...

Global site tag (gtag.js) - Google Analytics