分析一個具體的sqlite文件的內容
準備工作
sudo make install
安裝最新版本的sqlite 如果安裝成功呻引,可以通過命令行sqlite3 進入的時候扶叉,可以參看sqlite版本北滥。也可以通過vim查看二進制格式驗證,后面后方法~
開始動手
- 創(chuàng)建一個sqlite文件,對源碼壕曼,
sudo make install
使用最新版本
CREATE TABLE reading(
id int primary key,
fname text,
name text
);
INSERT INTO reading VALUES (1,"btreeint.c","zhou");
INSERT INTO reading VALUES (2,"btree.c","yao");
INSERT INTO reading VALUES (3,"sqlite.html","zhouyao");
- 分析這個sqlite文件的結果。
注意等浊,一定要注意sqlite版本
開始分析sqlite
對照官方文檔腮郊,說明和源代碼,二進制文件解剖截屏如下
注意btree 開始的第一個字節(jié)筹燕。表明這個page用途的16進制為0D
實際上轧飞,這個與常量,or運算庄萎,最終結果來決定是否是內部頁踪少。或者決定糠涛,是否為btree 還是b+tree page type first
PTF_ZERODATA
內部page具體fomate說明源碼
btree 分為始終
interior table b-tree (B+ tree)
lead table b-tree(B+tree)
interiror index b-tree(B-tree)
leaf index b-tree (B-tree)
variable-length integer 編碼的代碼
util.c
putVarint64
具體查看varint 這個函數是怎么實現的
二進制格式的解析
filehead 與page head 解析
cell內部信息
------- 思想草稿筆記分割線-------
sqlite源碼閱讀
關于援奢,sqlite結構的理解,在btreeint.h的文件中
page大小
最大64k一頁忍捡,默認是1k(最新的3.16.2默認為4K)
記錄了以頁為單位的數據庫大小
schemacookie 當sqlstatement被編譯的時候集漾,會檢查這個是否相同,如果相同才會被執(zhí)行
可以把sqltie數據庫砸脊,單獨當一個程序的格式具篇。sqlite很多時候,不是一個完美的自定義程序格式凌埂,但是在大多數情況下驱显,比自己設計一個程序格式要好的多。字段中有應用程序字節(jié)瞳抓,可以定制化~
to-do 怎么設計一個自定義的程序格式埃疫?從而讓特定的程序打開?
可能存在的應用孩哑。我自己設計一個桌面端應用栓霜。為了方便應用之間方便的拷貝,可以用sqlite作為程序格式
todo----但是横蜒,現在胳蛮,很多時候都用xml來作為程序格式 有什么優(yōu)缺點销凑?
btree page中的head
head中的信息flag,決定了仅炊,這個page的內容是什么斗幼。為leaf,
page中的cell的個數
地址茂洒,從頭部開始孟岛。btree內部,都是經過排序的cell
cell中存放了哪些東西督勺?
cell的大小是可變的
cell的變長整數