sqlite源码分析之路(一) 分散文件的源码编译成easySqlite

         这两天下了决心,要好好地看一下sqlite的源码。于是从官网上下载了源码。很认真地看了,但看不下去。为什么?这已经是一个很成熟的项目,从2000年的第1版到2019年的3.29.0版,进化得已经很成熟,代码量也有几十万行了。光用文本工具看源代码是看不下去了。

         想到的办法是先看官网上的文档(https://www.sqlite.org/docs.html)。sqlite官网上的文档写得好啊。好在不藏私,不怕麻烦,写得详细,很详细。只可惜是用英文写的,看起来不免慢了些。但总比不看文档就直接去看源码要好。

       Sqlite源码给我的第一印象是写得好,尤其是注释写得好,生怕别人看不懂,不厌其烦地注释。开放源码的项目见得多了,开放思想的见得太少。好多项目虽然开放了源码,但不开放思想,让人猜不透。Sqlite是既开放源码,又开放思想。可以称为裸开。若无济世度人之心者,绝对开放不了这么彻底。

       为了这次sqlite源码分析之路能顺利走下去。还是把sqlite的版权声明复制在此处吧:

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的技术路线有了一个大致的了解,接下来要做的工作就是让sqlite的源码跑起来。不光跑起来,还要可以进行调试,死的源码才会活过来。

         第一步,按照官方文档指引,下载sqlite-amalgamation-3280000.zip。解压出来得到4个源文件,如下图所示:

         用vs2010新建一个win32控制台应用程序,注意不要包含“预编译头”。另外由于现在的代码需要支持C99标准的编译器,所以vc6.0编译时会出现错误,尽量选版本高一些的编译软件吧。

         将以上4个文件添加到项目中去,没有什么意外,编译通过,通过调试运行就会弹出一个win32控制台应用程序的窗口。如下图所示:

sqlite源码分析之路(一) 分散文件的源码编译成easySqlite_第1张图片

         可见在windows下编译sqlite3真的是很简单的事情,但是事情并没有完。Sqlite3.c是合并了很多源代码文件得到的一个单独的文件,大小约为7.5M,包含22万行代码。我的天哪!这么大的块头,怎么方便调试与分析呢?

         根据官方文档的介绍,将很多的c语言文件合并成一个大文件,可以提高编译质量,让程序运行得更快。可是对源代码的阅读者来说就不方便了。

         官网上也提供了分散文件的版本,但是如果直接把这个版本下的文件加入到vc2010的项目中去,编译肯定通不过。因为要做很多很多的工作才能得到一个可以直接编译的sqlite3.c文件。Sqlite的作者为了完成这个工作,还专门引入了不少tcl脚本。在sqlite实际运行时,并不依赖这些tcl脚本,这些tcl脚本的主要作用就是将分散的文件合并成一个大的单独的sqlite3.c文件。在官方技术文档的描述中,即使想对源代码做修改,最好也不要跳过合并生成sqlite3.c这一步。也就是说,sqlite官方并没有提供可供直接编译运行的由分散的源文件组成的版本。

         为了sqlite源码分析之路能接着走下去,只好自已动手,丰衣足食。

 

第二步,按照官方文档指引,下载ZIP-archive。这下解压出来的内容就不少了:

sqlite源码分析之路(一) 分散文件的源码编译成easySqlite_第2张图片

其中src文件夹中的文件有一百多个。

按文档指示,在源码树顶级目录执行

nmake /f Makefile.msc sqlite3.c

这一步很容易出错,它有两个依赖项,第一,要求能在命令行执行nmake。第二,要求能在命令行执行tclsh。

其实只要安装了visual studio,nmake工具就安好了,但是nmake.exe所在的目录不一定设置到环境变量path中,所以为了确保第一步能完成,要将name.exe所在的目录添加到环境变量path中。在我做实验的电脑上,这个目录是:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin ,在其它的电脑上当然要做相应的调整。

为了能够在windows操作系统上运行tcl脚本,比较简单的一个办法是下载ActiveTcl。以ActiveTcl为关键词很容易搜索到官网。目前而言,如果是64位电脑,可以下载ActiveTcl8.6。这个版本不支持32位电脑,因此32位电脑可下载ActiveTcl8.5。它的默认安装目录是C:\ActiveTcl。

因此将C:\ActiveTcl\bin加入到path。就可以在命令行执行tclsh。

做好这两步准备工作后,在Makefile.msc文件所在的目录打开cmd窗口,

运行nmake /f Makefile.msc sqlite3.c

一通眼花缭乱的操作后,原来的目录中就会出现期待已久的sqlite3.c文件,当然还有不少其它的文件。

 其实我并不需要这个sqlite3.c文件,要得到这个,直接下载不就完了,费这么多事。粗粗地浏览了makefile.msc文件及相关的tcl脚本文件后,发现在生成sqlite3.c地过程中,将所有需要的源文件放在了临时生成的tsrc目录中。但这个目录中的源文件并不是简单地将文件从src目录复制到tsrc目录。比如src目录中的parse.y文件是一个语法规则定义文件,但在合并脚本的作用下,在tsrc目录中生成了对应的parse.c文件。

 

第三步,用vs2010建立一个win32控制台应用的空项目,将tsrc中的所有文件加入了这个项目。在生成工程的过程中,发现有很多很多的错误。

        这些错误主要是找不到包含文件,有常量未定义等等。我想合成后的sqlite3.h,sqlite3ext.h,shell.c可以编译通过,为什么分散文件就不能通过呢。因此用sublime 打开sqlite3.h,sqlite3ext.h,shell.c所在的文件夹,通过查找功能,分析为什么在合成的大文件中能通过编译,找到相应的 条件编译选项,增加一些相应的定义,移除一些过时的源文件。

总之一句话,凡是出现编译错误的地方都做对照性的调整。如是重复尝试多次,编译通过,再次出现了控制台界面。

         考虑到是为了分析学习sqlite的源码,先尽量精简掉一些文件,然后再给一些文件做简写,只保留最主要的功能。在简写的过程中阅读理解源码,反过来理解后又能更好地简写源码。目前做了如下的一些删减工作:

1,去掉了fts1*,fts3*,fts5* ,这是做fulltext search 的功能模块,与主线关系不太。因此先删除了。

2.去掉了hwtime.h,从介绍来看,这是提高执行效率的文件,暂时不用,就移除掉。

3.去掉了rtree.h

4.去掉了sqliteicu.h,icu.c

5.去掉了vxworks.h,去掉了在其它文件中对其的引用(删除相关的#include行)

6.去掉wal.h,wal.c 时出现了编译错误:暂时不将这两个文件移除,以后对源码理解更深入后再处理

7.去掉了json1.c

8.去掉了os_unix.c

        做完以上这些后,给这个新的win32控制台项目命名为easySqlite,表明这是一个用于学习的简化版本。做这样一个精简版  完全是出于学习研究sqlite的源代码这样一个目的,如果直接用官方提供的合成版源码,单个文件体积太大,不方便调试运行,也不方便阅读分析。因此才做了这样一个由独立文件组成,只保留核心功能的精简版。所以千万不要将此版本用于管理真实数据库。补充说明一下: 简化前的源码压缩文件包大小约为12M,展开后约为99M,  简化后的源码压缩文件包大小约为2M,展开后约为6M。

下面是easySqlite的运行截图:

sqlite源码分析之路(一) 分散文件的源码编译成easySqlite_第3张图片

画红线处是我添上去的EasySqlite的版本号0.000000001。期待着再进一步简化,能变成0.00001,0.001,0.1。

完整的项目文件可在csdn资源上进行->下载

如有朋友可以告知上传资源后如何更改所需要的积分就好了。上传后默认就是需要5个积分才能下载。我想改成0分。

欲知后事如何,且听下回分解!!!

 

你可能感兴趣的:(数据库,sqlite源码分析之路)