SQLite体系架构和源码结构-4

\color{green}{文章付费是对Copyleft精神的亵渎,阅后点赞、关注才是对作者最大的奖赏!---Devil}


May you do good and not evil.
May you find forgiveness for yourself and forgive others.
May you share freely, never taking more than you give.

体系结构

 关于SQLite的体系结构,官网有详细介绍,作为源码剖析系列文章,本不应该有如此多的废话,而应该直奔主题上代码。但基于本人的经验,源码阅读前最好能够先简单实用过该软件,清楚该软件的体系结构,清晰的了解源代码的分布,在开始阅读源码时才能更加顺畅,So,推荐一读SQLite体系结构

SQLite体系结构

 就这张完美的图片,简单一讲:SQLite数据库将数据按照作者设计好的存储结构以文件方式存储到文件系统上,用户通过SQL语句实现数据的CURD,必要的步骤为:

  1. Interface接口接受用于输入的CURD请求,请求严格遵守SQL标准;
  2. 拿到SQL语句后,需要由分词器Tokenizer把原有字符串分割成一个个标识符(token),并把这些标识符传递给解析器,Tokenizer是用手工编写的;
  3. 解析器(Parser)拿到一个个Token后,进行语法分析。SQLite的语法分析器使用Lemon LALR(1)分析程序生成器来产生,代码非常精简,后续我们将认真分析;
  4. 语法分析一旦产生了规约(专业术语,后续文章详细讨论),就要调用代码生成器(Code Generator),生成虚拟机代码,以执行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。这些文件涵盖了大部分最重要、最有意义的事情。
  5. 代码生成器生成的代码由虚拟机(VDBE)来执行,参考阅读:SQLite虚拟机原理。虚拟机实现一个专为操作数据库文件而设计的抽象计算引擎。它有一个存储中间数据的存储栈,每条指令包含一个操作码和不超过三个额外的操作数,它就像一个发动机,驱动着将用户的意图转换成实际的动作,向数据库文件拿或存用户想要的数据。
  6. 虚拟机指令的动作,驱动了Page模块向数据库文件增删改查数据,而数据库文件核心存储结构是B-树,因此,其动作需要遵守B-树结构的指导进行。
  7. 数据库文件被抽象出了一个个页面(Page)存在硬盘中,每一页都是B-树(及其变种)的一个Node,操作系统提供标准文件操作接口供用户访问,SQLite通过内部计算后有目的的向文件的特定位置进行读取和写入。
  8. 由此,完成了整个数据操作过程。

代码结构

 不多说,直接上表格:

所属模块 文件名称 备注
API main.c SQLite Library的大部分接口
legacy.c sqlite3_exec的实现
table.c the sqlite3_get_table() and sqlite3_free_table()的实现,它们是sqlite3_exec的包装
preprare.c 主要实现sqlite3_prepare()
分词器部分(Tokenizer) tokenize.c 分词器的实现
语法分析器部分(Parser) parser.c 分析器的实现,由Lemon自动生成
parser.h 分析器内部定义的关键字
代码生成器(Code Generator) update.c 处理UPDATTE语句
delete.c 处理DELETE语句
insert.c 处理INSERT语句
trigger.c 处理TRIGGER语句
attach.c 处理ATTACHT 和DEATTACH语句
select.c 处理SELECT语句
where.c 处理WHERE语句
vacuum.c 处理VACUUM语句
pragma.c 处理PRAGMA命令
expr.c 处理SQL语句中的表达式
auth.c 主要实现sqlite3_set_authorizer()
analyze.c 实现ANALYZE命令
alter.c 实现ALTER TABLE功能
build.c 处理以下语法:CREATE TABLE, DROP TABLE, CREATE INDEX,DROP INDEX,creating ID lists,BEGIN TRANSACTION,COMMIT,ROLLBACK
func.c 实现SQL语句的函数语句
date.c 与日期和时间转换有关的函数
虚拟机(Virtual Machine) vdbeapi.c 虚拟机提供上层模块调用的API实现部分
vdbe.c 虚拟机的主要实现部分
vdbe.h 定义了VDBE的接口,VdbeOp结构体(代表一条指令)
vdbeaux.c Vdbe.h的接口的实现
vdbeInt.h Vdbe.c的私有头文件,定义了VDBE常用的数据结构:Cursor——虚拟机中使用的游标, Mem——vdbe在内部把所有的SQL值当作一个Mem数据结构来处理,Vdbe——虚拟机数据结构
vdbemem.c 操作”Mem”数据结构的函数
vdbefifo.c
B-Tree部分 btree.h 头文件,定义了B-tree提供的操作接口
btree.c B-Tree部分的主要实现,并定义了以下数据结构:Btree——Btree handler,BtCursor——使用的游标, BtLock——锁, BtShared——包含了一个打开的数据库的所有信息,MemPage——文件在内存存放在该数据结构中,aCellInfo
OS Interface部分 os.h 定义了为上层模块提供的操作函数,并定义了以下数据结构:OsFile——描述一个文件;ioMethod——OsFile所支持的操作函数(对所有架构都适用的OS Interface)
os.c 对IoMethod中的函数的包装
os_win.c Windows平台下的OS Interface
os_unix.c Unix平台下的OS Interface
os_os2.c OS2平台下的OS Interface
其它部分 utf.c 与UTF编码有关的函数
util.c 一些实用函数,比如:sqlite3Malloc(),sqlite3FreeX()
sqlite3.h SQLite的头文件,定义了提供给应用使用的API和数据结构。
sqliteInt.h 定义了SQLite内部使用的接口和数据结构
printf.c 主要实现与printf有关的函数
random.c 随机数生成
hash.c SQLite使用的hash表
hash.h Hash 表头文件

 有了对SQLite源码从整体角度上的理解,我们源码分析算是已经开了一个头了,后面的文章我们就将直接就某一块代码展开分析,感兴趣的同学请持续关注!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,065评论 1 32
  • 本文译自《Architecture of SQLite》 介绍 这篇文档描述了SQLite库的架构。如果想理解SQ...
    NJUShenbin阅读 2,254评论 0 1
  • 01 10月17日发表了最近的一篇文章之后,就暂别了简书,没有写一个文字,也没有在简书遨游各位的文章,也没有发表任...
    回声520阅读 370评论 3 1
  • 01.上午7点,到口腔医院排队取号,1号,8点半进的诊室。刚进去,医生们就认出了亮宝。 医生甲:这就是上次那个很勇...
    澜绣阅读 170评论 0 0
  • 你可以不漂亮,不出众,但是你必须要有自己的气质,有自己的睿智,有自己的想法。
    不骄不躁等风来阅读 210评论 0 0