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

17站長網

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

Sqlite虛擬機VDBE原理

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

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,某些文章具有時效性,若有錯誤或已失效,請在網站留言或聯系站長:17tui@17tui.com
·END·
站長網微信號:w17tui,關注站長、創業、關注互聯網人 - 互聯網創業者營銷服務中心

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

17站長網微信二維碼

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

掃一掃,關注站長網微信

大家都在看

熱門排行

最近更新

返回頂部
主站蜘蛛池模板: 亚洲 天堂 欧美 日韩 国产 | 国产成人ae在线观看网站站 | 野花香在线观看免费高清播放视频 | 97在线观看免费视频 | 国产精品私人玩物在线观看 | 午夜性爽视频男人的天堂在线 | 外女思春台湾三级 | 国产一区二区三区在线看片 | 国产免费怕怕免费视频观看 | [高清无码] 波多野结衣| 野花影院手机在线观看 | 超清无码波多野吉衣与黑人 | 亚瑟天堂久久一区二区影院 | 亚洲网站视频在线观看 | 久久久久久久久久久福利观看 | 亚洲精品资源网在线观看 | 嗯啊快停下我是你老师啊H 嗯啊快拔出来我是你老师视频 | 天天摸夜添狠狠添高 | 后式大肥臀国产在线 | 午夜DJ国产精华日本无码 | 日韩精品一区二区三区色欲AV | 成人性视频全过程 | 中文字幕国产在线观看 | 亚洲蜜芽在线观看精品一区 | 99国内偷揿国产精品人妻 | 日韩精品无码久久一区二区三 | 色拍拍噜噜噜久久蜜桃 | 久久9精品区-无套内射无码 | 日韩熟女精品一区二区三区 | 女人被弄到高潮叫床免 | 国产精品高潮呻吟AV久久96 | 91桃色污无限免费看 | 快播免费电影 | 欧美在线看欧美视频免费 | 被黑人群jian又粗又大H | 国产精品亚洲在钱视频 | 久久婷五月综合色啪网 | 女人高潮久久久叫人喷水 | 我和妽妽在厨房里的激情区二区 | 中文字幕不卡免费高清视频 | 色影音先锋av资源网 |