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

17站長網

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

Sqlite虛擬機VDBE原理

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

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站長網微信二維碼

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

掃一掃,關注站長網微信

大家都在看

熱門排行

最近更新

返回頂部
主站蜘蛛池模板: 天天躁日日躁狠狠躁AV麻豆 | 超熟女专门志 | 精品夜夜澡人妻无码AV | 99精品无码AV在线播放 | 精品亚洲麻豆1区2区3区 | 91精品免费久久久久久久久 | 色噜噜狠狠色综合中文字幕 | 国产精品1卡二卡三卡四卡乱码 | np高h肉辣一女多男 no视频在线观看 | 亚洲人人为我我为人人 | 日韩av无码在线直播 | 日日噜噜夜夜躁躁狠狠 | 高清bblxx手机在线观看 | 久久热这里面只有精品 | 白丝女仆被啪到深夜漫画 | 国产国产成年在线视频区 | 快播最新电影网站 | WWW亚洲精品久久久无码 | 抽插H浊水H嫩B父皇 虫族bl文全肉高h | 亚洲AV无码一区二区色情蜜芽 | 亚洲欧美日韩在线观看一区二区三区 | https黄视| 国语大学生自产拍在线观看 | 亚洲精品有码在线观看 | 偷拍国产精品在线播放 | 一道精品视频一区二区三区 | jizz教师| 国产最新精品亚洲2021不卡 | 精品国产麻豆免费人成网站 | 国色天香视频在线社区 | 99久久就热视频精品草 | 亚洲 天堂 国产在线播放 | 久久精品亚洲精品国产欧美 | 污文乖不疼的 | 久久99精品国产自在自线 | 久久精品热99看二 | 亚洲 欧美 清纯 校园 另类 | 99视频免视看 | 99热在线播放| 国产乱码精品AAAAAAAA | 精品无码久久久久久久动漫 |