標籤:使用 執行 字串 esc print hive iframe hash 檔案格式
$1 簡介
本文檔描述了SQLite庫的體繫結構,這些資訊對那些想理解和修改SQLite的內部工作機制的人是有用的。
顯示了SQLite的主要組成組件及其相互關係,下面的內容將描述每一個組件。(具體的圖參見http://www.sqlite.org/arch2.gif)
本文檔描述SQLite 3.0版本,2.8版或更早期的版本與此相似,只是細節上有所不同。
$2 介面
雖然有些函數分布在其它的檔案中,但是主要的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://www.sqlite.org/capi3ref.html中描述了。
為避免和其它軟體的命名衝突,SQLite庫中所有的外部符號都以sqlite3為首碼。這些符號目的就是為外部使用,換句話說,所有以sqlite3_開始的符號,形成了SQLite的API。
$3 詞法分析器
當一個SQL語句執行時,介面首先把包含該SQL語句的字串傳給詞法分析器來進行處理。詞法分析器負責把字串分成一個一個的詞法單元,然後把詞法單元 傳遞給文法分析器,詞法分析器是在tokenize.c檔案中實現,這個代碼是手編的,而不是使用lex之類的工具產生的。
需要注意的是,在本設計中,詞法分析器調用文法分析器,熟悉YACC和BISON的人一般總是在文法分析器中調用詞法分析器,SQLite的作者這兩種方法都試過,發現在詞法分析器中調用文法分析器更好。
$4 文法分析器
文法分析器根據上下文對詞法分析出來的單元理解其涵義。SQLite的文法分析器是使用Lemon(http://www.hwaci.com/sw/lemon/)的LALR (1)工具產生器產生的。Lemon和YACC/BISON工具差不多,但是Lemon使用一種不同的輸入文法,這種文法更難以出錯。Lemon能產生一 個可重新進入和安全執行緒的文法分析器,Lemon定義了一種非終結符析構器,以致在文法出現錯誤時不至於出現記憶體流失。Lemon分析器的輸入檔案在 parse.y中定義。
由於Lemon不是一個常見的程式,其完整的原始碼僅一個C檔案在SQLite的tool子目錄中。Lemon的文檔在doc子目錄中。
$5 代碼產生器
在文法分析器分析完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處理運算式的代碼產生,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()函數的功能。
$6 虛擬機器
代碼產生器產生的程式在虛擬機器上運行,該虛擬機器的資訊在文檔http://www.sqlite.org/opcode.html中 描述。概括來講,虛擬機器實現了一個抽象的計算引擎,這個計算引擎用來操作資料庫檔案。虛擬機器有一個棧用於儲存計算的中間狀態,每條指令包括一個作業碼和最 多三個運算元。虛擬機器在vdbe.c中實現。虛擬機器有它自己的標頭檔:vdbe.h檔案定義了虛擬機器和SQLite庫的介面,vdbeInt.h檔案定義 了虛擬機器的結構。vdbeaux.c檔案中包含一些虛擬機器和介面模組使用的工具。vdbeapi.c檔案包含了虛擬機器的外部介面,例如 sqlite3_bind_... 之類的函數。字串,整數,浮點數,BLOB類型都被存在一個名為Mem的內部對象中,這個內部對象在vdbemem.c檔案中實現。
SQLite使用回調C語言函數的方法來實現SQL語句的功能。甚至內建的SQL功能也是通過這種方法來實現。大部分SQL內建的函數,例如 coalesce(),count(),substr()等等,在func.c中實現。日期和時間轉換函式在date.c中實現。
$7 B樹
SQLite使用B樹來實現資料庫,B樹在btree.c檔案中實現。資料庫中的每個表和索引都使用一個單獨的B樹。所有的B樹都存放在一個磁碟檔案中。該資料庫檔案格式的細節在btree.c檔案開始部分的注釋裡詳細描述。
B樹子系統的介面在標頭檔btree.h中定義。
$8 頁緩衝
B樹模組使用固定的塊大小從磁碟中請求資訊。預設的塊大小為1024B,但是可以從512到65536B調整。頁緩衝負責讀,寫和緩衝這些塊。頁緩衝也提 供了復原和原子提交的功能抽象和資料庫檔案的鎖操作。B樹驅動程式從頁緩衝中取得頁,並且通知頁緩衝程式何時修改,提交或復原操作,頁緩衝處理所有的這些 麻煩細節,確保請求被快速,安全和高效地處理。
實現頁緩衝機制的代碼在單個C檔案pager.c中。頁緩衝子系統的的介面在pager.h中定義。
$9 作業系統介面
為了提高在POSIX和Win32系統中的可移植性,SQLite和作業系統的介面使用了一個抽象層。此抽象層的介面在os.h中定義。每個作業系統尤其 自己的實現:os_unix.c是Unix的,os_win.c是windows系統的,等等。每個作業系統相關的實現尤其自己的標頭檔: os_unix.h, os_win.h等等。
$10 工具程式
記憶體配置和大小寫不敏感的字串比較函數在util.c檔案中實現,文法分析器使用的符號表是hash表,此表在hash.c中實現。utf.c檔案包含 Unicode轉換函式。SQLite有它自己的printf()函數實現,這在printf.c中定義,和隨機數函數實現,這在random.c中實 現。
$11 測試代碼
代碼中有一半以上的是為測試服務的。在主要的代碼檔案中有許多assert()函數。test1.c到test5.c和md5.c都是用於測試的。os_test.c類比驗證電源失效後的頁緩衝機制的災難恢複能力。
http://www.cnblogs.com/qiubole/archive/2007/11/21/966678.html
SQLite資料庫的體繫結構(翻譯自sqlite.org)