青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長網

17站長網 首頁 數據庫 SQLite教程 查看內容

Sqlite虛擬機VDBE原理

2023-3-21 15:29| 查看: 2188 |來源: 互聯網

VDBE (virtual database engine)是一個運行他自己的虛擬機語言組成的程序的虛擬機。每條程序都是用來查詢或者操作數據庫的。出于這個目的,VDBE的機器語言被設計 ...

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), 如果文件指針當前并沒有打開,這條語句不被執行。

本文最后更新于 2023-3-21 15:29,某些文章具有時效性,若有錯誤或已失效,請在網站留言或聯系站長:[email protected]
·END·
站長網微信號:w17tui,關注站長、創業、關注互聯網人 - 互聯網創業者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!

17站長網微信二維碼

始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!

掃一掃,關注站長網微信

大家都在看

熱門排行

最近更新

返回頂部
主站蜘蛛池模板: 在线精品视频免费观看 | 2021国产在线视频 | 动漫成年美女黄漫网站 | asian极品呦女xx农村 | 秋秋影视午夜福利高清 | 成人中文字幕在线观看 | 十二月综合缴缴情 | 打扑克床上视频不用下载免费观看 | 无码欧美XXXXX在线观看裸 | 嫩草影院地址一二三 | 日本aa大片| 无码专区久久综合久综合字幕 | 日韩午夜欧美精品一二三四区 | 欧美性FREE玩弄少妇 | 国产亚洲精品久久久久苍井松 | 最近最新的日本字幕MV | 亚洲欧美中文字幕网站大全 | 无码欧美喷潮福利XXXX | 扒开双腿疯进出爽爽爽动态图 | 极品 女神校花 露脸91 | 性欧美videosex18嫩 | 张开腿我尝尝你的草莓 | 精品国产自在自线官方 | 国产99九九久久无码熟妇 | 久久亚洲人成网站 | 久久中文字幕无线观看 | 娇小8一12xxxx第一次 | 亚洲一区在线观看视频 | 大桥未久在线看 | 国产伦精品一区二区三区免费观看 | 久久久久久久久亚洲 | 国产免费不卡 | 动漫美女和男人下载 | 亚洲va在线va天堂XX xX | 蜜臀亚洲AV永久无码精品老司机 | 伸进同桌奶罩里摸她胸作文 | 韩日午夜在线资源一区二区 | 精品无码无人网站免费视频 | 麻豆官网md.pub | 日本美国群交P片内射捆绑 日本毛片久久国产精品 | 色戒2小时38分在线观看 |