日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

SQLite是一個非常受歡迎的數(shù)據(jù)庫,在數(shù)據(jù)庫排行榜中已經(jīng)進入前十的行列。這主要是因為該數(shù)據(jù)庫非常小巧,而且可以支持linux、windows、IOS和Andriod的主流的操作系統(tǒng)。

知其然更要知其所以然,聊聊SQLite軟件架構(gòu)

 

SQLite非常簡單,是一個進程內(nèi)的動態(tài)庫數(shù)據(jù)庫。其最大的特點是可以支持不同的語言來使用,比如C、C++、JAVA等等。同時,SQLite還是一個開源的數(shù)據(jù)庫,也就是開發(fā)者可以根據(jù)自己的需求來修改數(shù)據(jù)的功能特性。

SQLite雖然非常小巧,但功能卻非常豐富,正所謂“麻雀雖小,五臟俱全”。SQLite不僅具備基本的SQL特性,還具備索引、觸發(fā)器、視圖和事務等特性。

SQLite的主要API

SQLite提供兩種訪問接口,一種是通過sqlite命令行工具,另外一種是通過動態(tài)庫,也就是API函數(shù)。在學習SQLite架構(gòu)之前,我們有必要對其API進行一個簡要的介紹。其實SQLite的API很簡單,主要包括三個,分別是sqlite3_open、sqlite3_execsqlite3_close三個函數(shù)。其中sqlite3_exec則是用于執(zhí)行SQL語句的函數(shù)。

也就是說sqlite3_exec是SQLite功能的關(guān)鍵入口,我們后面分析代碼也應該以此函數(shù)作為突破點。其它函數(shù)相對簡單,也沒那么重要。

SQLite整體架構(gòu)

首先我們從整體架構(gòu)上介紹一下SQLIte。其架構(gòu)如圖所示,包括接口層、SQL命令處理器和存儲后端等。

知其然更要知其所以然,聊聊SQLite軟件架構(gòu)

 

最為核心的不是就是SQLite內(nèi)核了。其中包括接口層、SQL命令處理器和虛擬機三部分。SQL命令處理器負責對用戶的SQL進行預處理,最終生成適用于虛擬機執(zhí)行的代碼。

其下是后端部分,后端部分相當于存儲引擎。下面我們簡要的介紹一下每個模塊的功能。

接口

SQLIte庫的使用通過函數(shù)調(diào)用實現(xiàn)。為了避免與其它庫出現(xiàn)沖突,SQLite的函數(shù)都以sqlite3作為前綴。接口部分的實現(xiàn)在文件main.c,legacy.c和vdbeapi.c中。其中main.c中包含其主要的接口,包括sqlite3_open、sqlite3_config和sqlite3_close等等。SQLite中最終的函數(shù)不在main.c中,而是在legacy.c中,該文件中只包含這一個接口的實現(xiàn)。

詞法分析器

詞法分析器對SQL語句字符串進行解析,最終生成單詞(token)序列。并且將生成的單詞序列傳給解析器進行下一步的動作。該功能的具體實現(xiàn)在文件tokenize.c中,核心入口函數(shù)為sqlite3RunParser。

解析器

SQLite的解析器基于Lemon實現(xiàn),它實現(xiàn)將SQL語句字符串解析成語法樹。Lemon是一個與YACC/BISON類似的詞法分析庫。該庫的源代碼在tool目錄中。

代碼生成器

代碼生成器用于生成與SQL語句對應,可以在虛擬機執(zhí)行的代碼。代碼生成器實現(xiàn)比較復雜,包含的文件有:build.c, delete.c, attach.c, expr.c, insert.cpragma.cselect.c, auth.c等等。通過文件名可以看出,這里很多文件其實分別對應著一個SQL語句,比如delete,insert和select等。

虛擬機

SQL的具體執(zhí)行在一個稱為虛擬機的組件中進行的,這個在前面架構(gòu)圖中已經(jīng)有所展示。虛擬機執(zhí)行的代碼有前面代碼生成器產(chǎn)生。虛擬機的實現(xiàn)在文件vdbe.h和vdbe.c中。

B-樹

SQLite的數(shù)據(jù)通過B樹進行組織管理。每個表或者索引都有一個對應的B樹。所有的B樹存儲在一個數(shù)據(jù)庫文件中。B樹的具體實現(xiàn)在btree.c和btree.h文件中。

頁緩存

SQLite的文件被劃分為等份大小,B樹也是以該大小為粒度來對數(shù)據(jù)進行管理。頁緩存是該粒度對應的內(nèi)存內(nèi)容,通過該內(nèi)存實現(xiàn)對數(shù)據(jù)塊的讀寫等訪問。頁緩存相關(guān)的實現(xiàn)在pager.c和pcache.c等文件中。

操作系統(tǒng)接口

SQLite是一個跨平臺的數(shù)據(jù)庫,其存儲數(shù)據(jù)需要兼容Windows和Linux的文件系統(tǒng)API。為了方便,SQLite實現(xiàn)了一個抽象層。這樣對于SQLite業(yè)務邏輯來說,只需要調(diào)用該抽象層的接口即可,而不用關(guān)心操作系統(tǒng)。

基礎庫

包含一個被各個模塊都可能使用到的基礎庫,比如內(nèi)存分配,字符串處理等。

SQLite文件格式

前文我們簡要的介紹了一下SQLite的軟件架構(gòu)以及每個組件的基本功能。接下來我們介紹一下數(shù)據(jù)庫文件的相關(guān)功能。

在SQLite中一個文件承載著一個數(shù)據(jù)庫實例,這個文件稱為主庫文件(main database file)。除了主庫文件外,還可能有一些其它文件,比如用于事務的日志文件等。本文主要集中介紹主庫文件,其它文件后續(xù)介紹。

數(shù)據(jù)庫文件由多個頁構(gòu)成,每個頁的大小在512到65536字節(jié)之間,且大小必須是2的冪。頁通過編號進行標記,起始值為1,最大編號為2的31次冪-2。頁的默認大小是4KB,本文以默認大小為例進行介紹。

知其然更要知其所以然,聊聊SQLite軟件架構(gòu)

 

在數(shù)據(jù)庫中的每個頁都有一個特定的用途,這些用途包括:

  • 鎖字節(jié)頁(Lock-byte page)
  • 剩余 頁
  • B樹 頁
  • 指針映射頁
  • 有效負載溢出頁

數(shù)據(jù)庫文件的第一個頁是比較特殊的,它包含整個數(shù)據(jù)庫文件的描述信息,這里稱為數(shù)據(jù)庫頭信息。

數(shù)據(jù)庫頭

數(shù)據(jù)庫頭包含100個字節(jié)的內(nèi)容,其中每一個成員的偏移,大小和功能如下圖所示。

知其然更要知其所以然,聊聊SQLite軟件架構(gòu)

 

我們可以創(chuàng)建一個數(shù)據(jù)庫實例,然后對照文件內(nèi)容與數(shù)據(jù)庫頭的格式進行理解。比如數(shù)據(jù)庫頭的第一個成員為一個魔數(shù),用于標識該文件為SQLite數(shù)據(jù)庫文件及版本。在下圖中可以找到該信息,可以看出兩者完全匹配(SQLite format 3)。

知其然更要知其所以然,聊聊SQLite軟件架構(gòu)

 

除了上述數(shù)據(jù)庫頭的格式外,每個不同的頁都有不同的布局。限于篇幅,本文暫時不過多介紹,后面結(jié)合實例專門寫一篇文章介紹各種不同的頁的布局。

 

參考內(nèi)容

[1] https://www.cnblogs.com/YSPXIZHEN/p/5792459.html

[2] https://sqlite.org/index.html

[3] https://www.runoob.com/sqlite/sqlite-c-cpp.html

[4] https://sqlite.org/fileformat.html

分享到:
標簽:架構(gòu) 軟件 SQLite
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定