SQLite的架構(The Architecture Of SQLite)

SQLite的架構(The Architecture Of SQLite)

官方介紹:http://www.sqlite.org/arch.htmlhtml

最近要研究SQLite,學習過程當中翻譯了這篇官網的架構介紹,但願對其餘想要學習的人有所幫助,因爲本人能力有限,如有任何不合適的地方,歡迎提醒與評論以便更加完善。sql

SQLite的組件與它們之間的關係數據庫

介紹(Introduction

    此文檔描述了SQLite的架構,對那些想要理解與修改SQLite原理的提供幫助。後端

    上述框圖代表了SQlite的主要組件和他們之間的聯繫。下面的文本將對這些組件提供一個快速的概述。api

接口(Interface

    SQLite的不少對外接口的實現函數在main.clegacy.cvdbeapi.c中。還有一些散落在其餘文件中,sqlite3_get_table()函數實如今table.csqlite3_mprintf()函數在printf.csqlite3_complete()tokenize.c中。SQLite的更多接口請訪問available separatelyhttp://www.sqlite.org/capi3ref.html)。緩存

    爲了避免和其餘代碼產生命名衝突,全部的SQLite API命名以sqlite3_爲前綴。安全

詞法分析器(Tokenizer

    當一個SQL語句被執行時,接口程序把這個字符串傳遞給分詞器。分詞器的任務是把原有的字符串分紅一個個單獨的詞法單元,並把這些詞彙傳遞給語法分析器。分詞器的代碼存儲在tokenizer.c中。架構

語法分析器(Parser

    語法分析器根據上下文對詞法分析出來的詞法單元進行語法分析,生成語法樹。SQLite的語法分析器是由Lemon LALR(1) parser generator產生的,這個語法分析器是可重入的而且線程安全的。Lemon定義了無終端解除程序的概念,因此即便遇到語法錯誤的狀況,也不會發生內存泄漏的問題。dom

    源文件在parse.cparse.h中。函數

代碼生成器(Code Generator

    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.cWHERE(含有SELECT, UPDATE and DELETE語句)生成機器代碼;attach.c, delete.c, insert.c, select.c, trigger.c update.c, and vacuum.c爲相應的SQL語句生成機器代碼。(每一個文件必要地調用在expr.cwhere.c其餘全部的SQL語句在build.c中進行編碼。auth.c做爲函數sqlite3_set_authorizer()的接口。

虛擬機(Virtual Machine

    也能夠稱之爲虛擬數據庫引擎(VDBE)。

    代碼生成器產生的虛擬機器碼由虛擬機來運行。虛擬機是一個爲操做數據庫而設計的抽象的計算引擎,機器中包含了存儲中間數據的存儲棧(或寄存器),每條VDBE指令包含一個操做碼和三個操做數。

    在不少方面上,虛擬機數據庫引擎是SQLite的核心部分,全部位於它上層的模塊的工做是爲了生成VDBE程序,VDBE執行該程序,而位於其下層的模塊的工做則是完成數據的存儲及查找。

    虛擬機自己文件存在於vdbe.c

    也有它本身的頭文件:vdbe.h,定義了在虛擬機與其它SQLite庫之間的接口;vdbeInt.h定義了虛擬機的私有文件;vdbeaux.h包含了被虛擬機使用的工具程序與剩餘的去構造虛擬機程序的庫文件的接口模塊。

    vdbeapi.c文件包含了對虛擬機外部的接口,例如sqlite_bind...系列函數。

    獨立的類型(如strings,integer,floating,point numbers,BLOBs)被存儲在名爲「Mem」的內部對象中,被vdbemem.c實現。

    SQLite接口SQL函數使用回調到C語言的方法。甚至內置SQL函數。大多數的內置SQL函數(如coalesce(), count(), substr(), and so forth)存儲在func.c中。日期和時間轉換函數存儲在date.c中。

B樹(B-Tree

    SQLite使用B樹來實現數據庫文件的存儲,源碼存儲於btree.c之中。數據庫中的每個表和索引都使用一個單獨的B樹(表結構採用B+樹,索引結構採用B-樹),全部的B樹都存放在一個磁盤文件中。文件格式的細節在btree.c的開始部分有一個詳細的解釋。

    B樹子系統的接口在btree.h中被定義。

頁面高速緩存(Page Cache

    B樹模塊使用固定的塊大小從磁盤中請求信息。默認的塊大小是1024 bytes,可是會在51265536 bytes之間變化。頁緩存負責讀,寫和緩存這些塊。頁緩存也提供了回滾和原子提交的功能抽象和數據庫文件的鎖操做。B樹運行時要從頁面緩存中請求特殊的頁,而且當它想要修改、提交或回滾改變操做時須要通知頁面緩存頁緩存處理全部的繁瑣細節,確保請求被快速、安全和高效地處理。

    實現頁面緩存的源代碼包含在pager.c中。頁面緩存的接口被定義在pager.h中。

   (數據庫是按照B樹的結構在磁盤上進行存儲操做的,經過可調整的頁面緩存(pager)能夠得到對數據的快速查找和存儲。)

OS接口程序(OS Interface

    爲了在不一樣的操做系統中提供可移植性,SQLiteOS接口程序提供了一個用於隱藏不一樣模塊間差別的抽象層,OS抽象層的接口被定義在os.h中,每個支持的操做系統有它本身的實現(os_unix.c對應Unixos_win.c對應Windows等等),每個操做細節的實現一般有它本身的頭文件:os_unix.hos_win.h等等。

工具程序(Utilities

    工具程序負責內存分配、字符串比較、編碼轉換等工做,該模塊基本上能夠看成一個回收站模塊供其它模塊共享使用。測試碼負責大量的迴歸測試,是SQLite提供可靠性的重要保證。

    內存分配和字符串比較實現的源代碼在util.c中。

    被語法分析器parser使用的符號表使用hash表維持,源代碼爲hash.c

    utf.c源代碼包含編碼轉換子程序。

    SQLite有它本身的私有函數printf()printf.c中,而且有本身的隨機數字生成器在random.c

 

測試代碼(Test Code

    若是算上回歸測試腳本,超過一半的SQLite的代碼是用來專門測試。在主要的代碼文件中有大量的assert()聲明。另外,源文件test1.ctest5.c連同md5.c實現擴展僅用於測試目的。os_test.c後端接口是用來模擬斷電狀況,來驗證在尋呼機中的崩潰恢復機制。

 

 

 

 

我的理解一下:該文檔詳細介紹了SQLite的架構結構,看完文章咱們會發現其實整個系統核心分爲三大子系統:

「前段(SQL編譯器)」 「中層(虛擬機)」 「後端(存取、緩衝、操做系統抽象)」