Boltdb源码分析----meta结构
Posted 月牙寂道长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Boltdb源码分析----meta结构相关的知识,希望对你有一定的参考价值。
boltdb是一个纯粹的key Value数据库,其宗旨是提供一个简单,快速,可信的数据库。此数据库广泛应用于各大开源组件中。
前面文章已经讲解了
page结构
node结构
本文分析meta结构
page结构中我们已经见识到了meta是其中的一种结构
要了解meta得从db的初始化开始
github.com/boltdb/bolt/db.go
以上是打开数据文件
文件锁,防止多个操作数据库文件
重点来了,如果文件大小是0的话,说明是一个新的数据库,则进行init。
如果不是0的话,说明是一个已有数据的数据库文件,则进行加载。加载中,加载了第一个pagesize。
接着是对数据库文件进行内存映射mmap。再往下就是freelist的初始化。
到目前我们还不知道meta是什么
那么我们从数据库从0开始init的时候来看
申请了一个4个page的buf。在pgid0,pgid1两个page上面初始化了meta
在pgid2上面初始化了freelist,pgid3上初始化了leafpage。
最后将buf写入文件中,其中offset为0。并将数据同步到了磁盘中。
这里的文件前4个page结构为
下面我们看看meta结构是如何的
这里面看看几个数据的含义
m := p.meta()
m.magic = magic 魔数,不解释
m.version = version 版本号
m.pageSize = uint32(db.pageSize) pagesize
m.freelist = 2 指向freelist的pgid2
m.root = bucket{root: 3} 指向bucket的pgid3
m.pgid = 4 正式数据是从pgid4开始的
m.txid = txid(i) 事务序列号
m.checksum = m.sum64() checksum
再看看如何将meta写入page中的
首先根据事务的id号计算page id
重新计算checksum,然后将meta内容copy到page中
龚浩华
月牙寂道长
QQ 29185807
2018年04月09日
以上是关于Boltdb源码分析----meta结构的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段