SQlite源碼分析-體系結構

體系結構

     在內部,SQLite由如下幾個組件組成:內核、SQL編譯器、後端以及附件。SQLite經過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展SQLite的內核變得更加方便。全部SQL語句都被編譯成易讀的、能夠在SQLite虛擬機中執行的程序集。SQLite支持大小高達2 TB的數據庫,每一個數據庫徹底存儲在單個磁盤文件中。這些磁盤文件能夠在不一樣字節順序的計算機之間移動。這些數據以B+樹(B+tree)數據結構的形式存儲在磁盤上。SQLite根據該文件系統得到其數據庫權限。SQLite的體系結構圖,如圖1-1所示:html

     (一)公共接口(Interface)git

SQLite庫的大部分公共接口由main.c, legacy.c和vdbeapi.c源文件中的函數來實現,這些函數依賴於分散在其餘文件中的一些程序,由於在這些文件中它們能夠訪問有文件做用域的數據結構。github

     (二)詞法分析器(Tokenizer)sql

當執行一個包含SQL語句的字符串時,接口程序要把這個字符串傳遞給tokenizer。Tokenizer的任務是把原有字符串分割成一個個標識符(token),並把這些標識符傳遞給解析器。Tokenizer是用手工編寫的,在C文件tokenize.c中。數據庫

     (三)語法分析器(Parser)後端

語法分析器的工做是在指定的上下文中賦予標識符具體的含義。SQLite的語法分析器使用Lemon LALR(1)分析程序生成器來產生,Lemon作的工做與YACC/BISON相同,但它使用不一樣的輸入句法,這種句法更不易出錯。Lemon還產生可重入的而且線程安全的語法分析器。Lemon定義了非終結析構器的概念,當遇到語法錯誤時它不會泄露內存。驅動Lemon的源文件可在parse.y中找到。api

     (四)代碼生成器(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和where.c。這些文件涵蓋了大部分最重要、最有意義的事情。expr.c處理SQL中表達式的代碼生成。where.c處理SELECT、UPDATE和DELETE語句中WHERE子句的代碼生成。文件attach.c, delete.c, insert.c, select.c, trigger.c, update.c和vacuum.c處理同名SQL語句的代碼生成(這些文件在必要時都調用expr.c和where.c中的例程)。全部其餘SQL語句的代碼由build.c生成。文件auth.c實現sqlite3_set_authorizer()的功能。安全

     (五)虛擬機(Virtual Machine)數據結構

代碼生成器生成的代碼由虛擬機來執行。總的來講,虛擬機實現一個專爲操做數據庫文件而設計的抽象計算引擎。它有一個存儲中間數據的存儲棧,每條指令包含一個操做碼和不超過三個額外的操做數。

     (六)B-樹(B-Tree)

一個SQLite數據庫使用B-樹的形式存儲在磁盤上,B-樹的實現位於源文件btree.c中。數據庫中的每一個表和索引使用一棵單獨的B-樹,全部的B-樹存放在同一個磁盤文件中。文件格式的細節被記錄在btree.c開頭的備註裏。B-樹子系統的接口在頭文件btree.h中定義。

     (七)頁面高速緩存(Page Cache)

B-樹模塊以固定大小的數據塊形式從磁盤上請求信息,默認的塊大小是1024個字節,可是能夠在512和65536個字節之間變化。頁面高速緩存負責讀、寫和緩存這些數據塊。頁面高速緩存還提供回滾和原子提交的抽象,而且管理數據文件的鎖定。B-樹驅動模塊從頁面高速緩存中請求特定的頁,當它想修改頁面、想提交或回滾當前修改時,它也會通知頁面高速緩存。頁面高速緩存處理全部麻煩的細節,以確保請求可以快速、安全而有效地被處理。
頁面高速緩存的代碼實現被包含在單一的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等。

     (九)實用工具(Utilities)

內存分配和字符串比較函數位於util.c中。語法分析器使用的符號表用Hash表來維護,其實現位於hash.c中。源文件utf.c包含Unicode轉換子程序。SQLite有本身的printf()實現(帶一些擴展功能),在printf.c中,還有本身的隨機數生成器,在random.c中。

      (十)測試代碼(Test Code)

若是你計算迴歸測試腳本,超過一半的SQLite代碼將被測試。主要代碼文件中有許多assert()語句。另外,源文件test1.c經過test5.c和md5.c實現只用於測試目的的一些擴展。os_test.c後端接口用來模擬斷電,以驗證頁面高速緩存的崩潰恢復機制。

 

http://huili.github.io/sqlite/system.html

相關文章
相關標籤/搜索