国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQLite > 正文

Sqlite虛擬機VDBE原理

2024-09-07 00:09:56
字體:
來源:轉載
供稿:網友

VDBE (virtual database engine)是一個運行他自己的虛擬機語言組成的程序的虛擬機。每條程序都是用來查詢或者操作數據庫的。出于這個目的,VDBE的機器語言被設計用來進行搜索,讀和修改數據庫。
每一條VDBE 說明包括一個OPCODE 和3個OPRANDS分別為P1,P2和P3。P1,P2 為整數,P3是一個指向數據結構或者字符串的指針,有可能為空。大多數說明只用到1-2個OPRANDS,只有少數 說明用到了全部3個OPRANDS。有很多非常重要的說明根本沒有用到任何OPRANDS但是卻能讀取數據并且將結果寫入運行時棧當中。
一段VDBE代碼從說明0開始運行,直到
1。遇到致命錯誤;
2。執行了停止說明;
3。整段代碼運行完畢,所有打開的數據庫都已經關閉,所有內存都已經釋放,棧為空。
example:
1.建立一個數據表,并且插入一個數據
CREATE TABLE examp(one text,two int);
INSERT INTO examp VALUES( 'Hello,World!'99);
VDBE將這樣解釋并執行這兩條語句
addr opcode p1 p2 p3
---- ------------ ----- ----- -----------------------------------
0 Transaction 0 0
1 VerifyCookie 0 81
2 Transaction 1 0
3 Integer 0 0
4 OpenWrite 0 3 examp
5 NewRecno 0 0
6 String 0 0 Hello, World!
7 Integer 99 0 99
8 MakeRecord 2 0
9 PutIntKey 0 1
10 Close 0 0
11 Commit 0 0
12 Halt 0 0
整個操作被分解為12條VDBE說明,前3條和最后2條是系統的標準步驟,所以真正完成我們的工作的是中間7條說明。這段代碼中沒有跳轉語句,所有整個代碼段從上到下執行一遍。
0 Transaction 0 0
1 VerifyCookie 0 81
2 Transaction 1 0

Transaction 開始一項交互活動。直到 遇到Commit 或者Rollback 時停止。P1參數是交互開始的數據庫文件的索引。0號索引是主文件,1代表這個文件存放的是臨時表。如果P2參數不為0,則開始一個寫交互。當交互開始之 后,對應的數據庫文件獲得"write lock"狀態。在這項交互進行當中其他進程將無法讀取這個文件。一項交互必須在任何對數據文件的修改動作之前進行。如果P2是0這文件將獲得一個 "read lock"
VerifyCookie 檢查數據庫0號參數(計劃版本)以確保它=P2,P1是數據庫編號,0代表主數據庫文件,1代表文件擁有臨時表,其他更大的數字代表附加數據庫。
在建立VerifyCookie之前,必須有一個Transaction已經開始,或者已經建立了一個read lock.
第2個Transaction語句開始一項交互,應用對象是數據庫1 (一個臨時數據表)。
3 Integer 0 0
4 OpenWrite 0 3 examp
Integer 將整數P1 (0)壓入堆棧。0是下面 OpenWrite 所要用到的數據庫的編號,如果P3不為0 ,那么它就是一個代表相同整數的字符串,執行這條語句后,堆??雌饋硎沁@樣
(integer) 0

OpenWrite 創建一個新的讀/寫指針,指向P1(0)也就是數據庫中的主文件“examp”,他的根頁(節點)是P2(3),因為數據庫文件第一頁是空的,第二頁存放 的是數據表的索引。從第3頁開始存放每個數據表當中的數據。P3("examp")是被打開的表的名字,這個參數是不被使用的,只是使代碼更容易閱讀而 已。這條語句將棧頂元素彈出(0) ,所以之后,堆棧為空。

5 NewRecno 0 0
NewRecno 為指針P1指向的數據表創建一個整型的新的紀錄號。這個紀錄好并不是一個用在表里的鍵值。新的紀錄號被壓入堆棧。這個動作之后,堆??雌饋硎沁@樣:
(integer) new record key

6 String 0 0 Hello, World!
String 將它的P3參數壓入堆棧,之后,堆棧應該是這樣:
(string) "Hello World!"
(integer) new record key

7 Integer 99 0 99
動作之后,堆棧應該是這樣:
(integer) 99
(string) "Hello, World!"
(integer) new record key

8 MakeRecord 2 0
MakeRecord 將棧頂的P1個元素取出( 2個),并且將他們轉換成二進制,然后再把新生成的結構壓回堆棧。之后,堆棧應該是這樣:
(record) "Hello, World!", 99
(integer) new record key
9 PutIntKey 0 1
PutIntKey 將棧頂的2個元素作為一個entry寫入P1所指的表中,如果表中元素不存在,那么將被創建。如果已經存在,則會被覆蓋。數據是棧頂元素,鍵是下面的元 素。這條語句當中,進行2次出棧操作。P2參數用來判定是否修改表中當前rowID,P2=1則rowID 1,并且由 last_insert_rowID()函數返回,如果rowID=0,則行號不變,仍未當前ID.(這就解釋了"表中元素不存在,那么將被創建。如果已 經存在,則會被覆蓋").這條語句是文件操作上的insert.

10 Close 0 0
Close 關閉之前打開的一個文件指針(0)(對應于前面的OpenWrite), 如果文件指針當前并沒有打開,這條語句不被執行。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝城县| 会同县| 临沧市| 长宁区| 雷州市| 钟山县| 柳江县| 长葛市| 安吉县| 滕州市| 通化市| 广汉市| 武平县| 伊宁市| 威海市| 谢通门县| 清苑县| 滨州市| 托克逊县| 盐山县| 南安市| 宁乡县| 宜章县| 苏州市| 南汇区| 永年县| 峨边| 海晏县| 延安市| 甘肃省| 沅陵县| 香河县| 玉门市| 长葛市| 剑阁县| 都江堰市| 双辽市| 津南区| 墨玉县| 仁怀市| 休宁县|