SQLite剖析(5):體繫結構

來源:互聯網
上載者:User

本文整理自http://sqlite.org/arch.html。
本文描述SQLite庫的體繫結構。這些內容對於那些想瞭解和修改SQLite內部結構的人將會非常有用。在探索前我們先下載源碼包sqlite-src-3071400.zip,在其src目錄下包含了所有源碼檔案。注意若要編譯SQLite庫則下載單一檔案版本sqlite-amalgamation-3071400.zip。

是一個體繫結構圖,顯示了SQLite的主要組件以及各組件之間是如何相互關聯的。接下來的內容將簡要的介紹每個組件。注意這裡描述SQLite 3.0版,它和2.8版以及早期的版本基本相似,但在一些細節上是有區別的。

圖1 SQLite體繫結構

在內部,SQLite由以下幾個組件組成:核心、SQL編譯器、後端以及附件。SQLite通過利用虛擬機器和虛擬資料庫引擎(VDBE),使調試、修改和擴充SQLite的核心變得更加方便。所有SQL語句都被編譯成易讀的、可以在SQLite虛擬機器中執行的程式集。SQLite支援大小高達2 TB的資料庫,每個資料庫完全儲存在單個磁碟檔案中。這些磁碟檔案可以在不同位元組順序的電腦之間移動。這些資料以B+樹(B+tree)資料結構的形式儲存在磁碟上。SQLite根據該檔案系統獲得其資料庫許可權。
1、公用介面(Interface)
SQLite庫的大部分公用介面由main.c, legacy.c和vdbeapi.c源檔案中的函數來實現,這些函數依賴於分散在其他檔案中的一些程式,因為在這些檔案中它們可以訪問有檔案範圍的資料結構。sqlite3_get_table()常式在table.c中實現,sqlite3_mprintf()可在printf.c中找到,sqlite3_complete()則位於tokenize.c中。Tcl介面在tclsqlite.c中實現。SQLite的C介面資訊可參考http://sqlite.org/capi3ref.html。
為了避免和其他軟體的名字衝突,SQLite庫的所有外部符號都以sqlite3為首碼,這些被用來做外部使用的符號(換句話說,這些符號用來形成SQLite的API)是以sqlite3_開頭來命名的。
2、詞法分析器(Tokenizer)
當執行一個包含SQL語句的字串時,介面程式要把這個字串傳遞給tokenizer。Tokenizer的任務是把原有字串分割成一個個標識符(token),並把這些標識符傳遞給解析器。Tokenizer是用手工編寫的,在C檔案tokenize.c中。
在這個設計中需要注意的一點是,tokenizer調用parser。熟悉YACC和BISON的人們也許會習慣於用parser調用tokenizer。SQLite的作者已經嘗試了這兩種方法,並發現用tokenizer調用parser會使程式啟動並執行更好。YACC會使程式更滯後一些。
3、文法分析器(Parser)
文法分析器的工作是在指定的上下文中賦予標識符具體的含義。SQLite的文法分析器使用Lemon LALR(1)剖析器產生器來產生,Lemon做的工作與YACC/BISON相同,但它使用不同的輸入句法,這種句法更不易出錯。Lemon還產生可重新進入的並且安全執行緒的文法分析器。Lemon定義了非終結析構器的概念,當遇到語法錯誤時它不會泄露記憶體。驅動Lemon的源檔案可在parse.y中找到。
因為lemon是一個在開發機器上不常見的程式,所以lemon的原始碼(只是一個C檔案)被放在SQLite的"tool"子目錄下。 lemon的文檔放在"doc"子目錄下。
4、代碼產生器(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()的功能。
5、虛擬機器(Virtual Machine)
代碼產生器產生的程式碼由虛擬機器來執行。關於虛擬機器更詳細的資訊可參考http://sqlite.org/opcode.html。總的來說,虛擬機器實現一個專為操作資料庫檔案而設計的抽象計算引擎。它有一個儲存中間資料的儲存棧,每條指令包含一個作業碼和不超過三個額外的運算元。
虛擬機器本身被完整地包含在一個單獨的檔案vdbe.c中,它也有自己的標頭檔,其中vdbe.h定義虛擬機器與SQLite庫其他部分之間的介面,vdbeInt.h定義虛擬機器私人的資料結構。檔案vdbeaux.c包含被虛擬機器使用的一些工具,和被庫的其他部分用來構建VM程式的一些介面模組。檔案vdbeapi.c包含虛擬機器的外部介面,例如sqlite3_bind_...族的函數。單獨的值(字串、整數、浮點數、BLOB對象)被儲存在一個叫Mem的內部對象中,在vdbemem.c中可找到它的實現。
SQLite使用回調風格的C語言程式來實現SQL函數,每個內建的SQL函數都用這種方式來實現。大多數內建的SQL函數(例如coalesce(), count(), substr(), 等等)可在func.c中找到。日期和時間轉換函式可在date.c中找到。
6、B-樹(B-Tree)
一個SQLite資料庫使用B-樹的形式儲存在磁碟上,B-樹的實現位於源檔案btree.c中。資料庫中的每個表和索引使用一棵單獨的B-樹,所有的B-樹存放在同一個磁碟檔案中。檔案格式的細節被記錄在btree.c開頭的備忘裡。B-樹子系統的介面在標頭檔btree.h中定義。
7、頁面快取(Page Cache)
B-樹模組以固定大小的資料區塊形式從磁碟上請求資訊,預設的塊大小是1024個位元組,但是可以在512和65536個位元組之間變化。頁面快取負責讀、寫和緩衝這些資料區塊。頁面快取還提供復原和原子提交的抽象,並且管理資料檔案的鎖定。B-樹驅動模組從頁面快取中請求特定的頁,當它想修改頁面、想提交或復原當前修改時,它也會通知頁面快取。頁面快取處理所有麻煩的細節,以確保請求能夠快速、安全而有效地被處理。
頁面快取的代碼實現被包含在單一的C源檔案pager.c中。頁面快取子系統的介面在標頭檔pager.h中定義。
8、OS介面
為了在POSIX和Win32作業系統之間提供移植性,SQLite使用一個抽象層來提供作業系統介面。OS抽象層的介面在os.h中定義,每種支援的作業系統有各自的實現:Unix使用os_unix.c,Windows使用os_win.c,等等。每個特定作業系統的實現通常都有自己的標頭檔,如os_unix.h, os_win.h等。
9、工具 + 生產力(Utilities)
記憶體配置和字串比較函數位於util.c中。文法分析器使用的符號表用Hash表來維護,其實現位於hash.c中。源檔案utf.c包含Unicode轉換子程式。SQLite有自己的printf()實現(帶一些擴充功能),在printf.c中,還有自己的隨機數產生器,在random.c中。
10、測試代碼(Test Code)
如果你計算迴歸測試指令碼,超過一半的SQLite代碼將被測試。主要代碼檔案中有許多assert()語句。另外,源檔案test1.c通過test5.c和md5.c實現只用於測試目的的一些擴充。os_test.c後端介面用來類比斷電,以驗證頁面快取的崩潰恢複機制。
註:
本來想結合原始碼對SQLite 3的體繫結構做一番分析,後來發現網上已經有比較好的分析文章。可參考:
SQLite入門與分析:http://www.cnblogs.com/hustcat/category/175618.html。它對SQLite 3的各組件做了深入地分析。在http://sqlite.com.cn/上也有對該系列文章的轉載。
SQLite學習手冊:http://www.cnblogs.com/stephen-liu74/category/348367.html。也介紹得比較詳細,偏向於SQLite的使用介紹。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.