SQLite源码研究心路历程(一)

在完全没有数据库支持,只具备编程能力的情况下,研究sqlite的源码。学习的心路历程。在Redis和Sqlite中选择sqlite,原因感觉更有用一点对自己的工作。

sqlite分两种源码结构,一种是比较常见的sqlite3.c 一个文件十几万行代码。另一种是,将各个模块分离出的源码结构。

选择第二种研究源码,帮助是可以提高读码的效率。另外一个问题是,只读代码担心有理解的片面性,应该同时写些测试程序。一,便于理解,二,验证理解,并深化理解。

学习采用自上而下的学习方式。另外一点,学习sqlite3源码所必须遵循的是:到底要在这里学习到什么?什么是最重要的?可以看懂每一行代码,在整体上未必了解它为什么这么做,或者这样做有什么好处?它如此实现舍弃了什么,又得到了什么?

做这个学习的目的是,了解数据库的工作原理,比如ACID是如何支持。同时了解ACID能做到什么大部分数据库是如何定义自己的支持级别的。SQL是如何解析的?如何能写出优秀的SQL。
对数据库基本原理的支持。本源码中有哪些优秀的技术实现。

一般经验:

分层结构,

1)在看一层实现时,不关注另外一层的细节处理。只关注本层实现,可以总结使用的底层的函数接口。这些接口是如何定义的,不必了解全部机理。类似使用操作系统函数CreateFile,只要了解次接口的定义,不需要了解文件系统是如何工作,操作系统是如何工作,磁盘又是如何工作,硬件是如何控制的。这样会混淆一些概念。

2)了解本层实现时,应关注本层实现解决了那些问题,实现了哪些功能?能够和数据库原理结合来看,能了解具体实现功能的意义更好。

 

从架构图上看,最上层的应该是Interface:

Much of the C-language Interface is found in source files main.c, legacy.c, and vdbeapi.c though some routines are scattered about in other files where they can have access to data structures with file scope. The sqlite3_get_table() routine is implemented in table.c. The sqlite3_mprintf() routine is found in printf.c. The sqlite3_complete() interface is in tokenize.c. The TCL Interface is implemented by tclsqlite.c.

To avoid name collisions, all external symbols in the SQLite library begin with the prefix sqlite3. Those symbols that are intended for external use (in other words, those symbols which form the API for SQLite) add an underscore, and thus begin with sqlite3_. Extension APIs sometimes add the extension name prior to the underscore; for example: sqlite3rbu_ or sqlite3session_.

 

posted @ 2017-06-08 10:57  AnAn2017  阅读(6903)  评论(0编辑  收藏  举报