sqlite 3.16.2 二进制文件分析

分析一个具体的sqlite文件的内容

准备工作

sudo make install 安装最新版本的sqlite 如果安装成功,可以通过命令行sqlite3 进入的时候,可以参看sqlite版本。也可以通过vim查看二进制格式验证,后面后方法~

《sqlite 3.16.2 二进制文件分析》 版本验证

开始动手

  1. 创建一个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");
  1. 分析这个sqlite文件的结果。

《sqlite 3.16.2 二进制文件分析》 实验过程
《sqlite 3.16.2 二进制文件分析》 创建结果

注意,一定要注意sqlite版本

开始分析sqlite

对照官方文档,说明和源代码,二进制文件解剖截屏如下

注意btree 开始的第一个字节。表明这个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)

《sqlite 3.16.2 二进制文件分析》 具体的源码

variable-length integer 编码的代码

util.c putVarint64
具体查看varint 这个函数是怎么实现的

《sqlite 3.16.2 二进制文件分析》 具体实现

二进制格式的解析

filehead 与page head 解析

《sqlite 3.16.2 二进制文件分析》

cell内部信息

《sqlite 3.16.2 二进制文件分析》 cell contents

——- 思想草稿笔记分割线——-

sqlite源码阅读

关于,sqlite结构的理解,在btreeint.h的文件中

page大小

最大64k一页,默认是1k(最新的3.16.2默认为4K)

记录了以页为单位的数据库大小

schemacookie 当sqlstatement被编译的时候,会检查这个是否相同,如果相同才会被执行

可以把sqltie数据库,单独当一个程序的格式。sqlite很多时候,不是一个完美的自定义程序格式,但是在大多数情况下,比自己设计一个程序格式要好的多。字段中有应用程序字节,可以定制化~

to-do 怎么设计一个自定义的程序格式?从而让特定的程序打开?

可能存在的应用。我自己设计一个桌面端应用。为了方便应用之间方便的拷贝,可以用sqlite作为程序格式

todo—-但是,现在,很多时候都用xml来作为程序格式 有什么优缺点?

btree page中的head

head中的信息flag,决定了,这个page的内容是什么。为leaf,
page中的cell的个数
地址,从头部开始。btree内部,都是经过排序的cell

cell中存放了哪些东西?

cell的大小是可变的
cell的变长整数

    原文作者:zhouyao
    原文地址: https://www.jianshu.com/p/15f02edd083f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞