private void writeHead() {
data.reset();
data.writeByte((byte) Page.TYPE_DATA_NODE);
data.writeShortInt(0);
if (SysProperties.CHECK2) {
if (data.length() != START_PARENT) {
DbException.throwInternalError();
}
}
data.writeInt(parentPageId);
data.writeVarInt(index.getId()); //索引对像id
data.writeInt(rowCountStored); //行数
data.writeShortInt(entryCount); //leaf的页数
}
[8, 7, 9, 10, 11, 12, 13, 14, 0, 0, 0, 0]
最基本的注意点: PageDataNode的子结点要么全是PageDataNode,要是全是PageDataLeaf,不会混合两者。
类图:
与org.h2.index.PageDataLeaf类似
类图:
org.h2.util.CacheObject (此类中的pos字段就是PageDataNode的pageId)
org.h2.store.Page
org.h2.index.PageData
org.h2.index.PageDataNode
CacheObject的直接子类只有org.h2.util.CacheHead和org.h2.store.Page
org.h2.store.Page类定义了8种页面类型,分别对应8个子类:
页面类型id 页面名称 对应的类
------------------------------------------------------------------
0 TYPE_EMPTY 有没类,主要用于异常或其他情况
1 TYPE_DATA_LEAF org.h2.index.PageDataLeaf
2 TYPE_DATA_NODE org.h2.index.PageDataNode
3 TYPE_DATA_OVERFLOW org.h2.index.PageDataOverflow
4 TYPE_BTREE_LEAF org.h2.index.PageBtreeLeaf
5 TYPE_BTREE_NODE org.h2.index.PageBtreeNode
6 TYPE_FREE_LIST org.h2.store.PageFreeList
7 TYPE_STREAM_TRUNK org.h2.store.PageStreamTrunk
8 TYPE_STREAM_DATA org.h2.store.PageStreamData
------------------------------------------------------------------
PageDataLeaf、PageBtreeLeaf、PageBtreeNode这三者的可以在业面类型字段中加上FLAG_LAST
FLAG_LAST表示此页是最后一页。
org.h2.util.CacheObject的字段有:
public CacheObject cachePrevious
public CacheObject cacheNext
public CacheObject cacheChained
private int pos
private boolean changed
org.h2.store.Page的字段有:
protected int changeCount;
两个抽象方法:
moveTo(Session, int) //移动当前page到新的位置
write() //写当前页面的数据到硬盘
提供了三类static方法,add、insert、remove,用于从数据中给原有元素加上一个(可能是负值)、增加一个新元素、删除一个元素
这类方法多用于在rows数组和offsets、keys数组中,rows用于放记录,offsets用于放记录在page中的相对位置,keys用于放记录的key。
org.h2.index.PageData的字段有:
protected final PageDataIndex index
protected int parentPageId
protected final Data data
protected int entryCount
protected long[] keys;
protected boolean written
protected int memoryEstimated
org.h2.index.PageDataNode的字段有:
private int[] childPageIds;
private int rowCountStored = UNKNOWN_ROWCOUNT; // -1;
private int rowCount = UNKNOWN_ROWCOUNT; // -1;
private int length;
以下是格式分析
------------------------------------------------------------------
字节数 代表什么
头
=======================
1 type Page.TYPE_DATA_NODE
2 checksum 预先写0,在写完page后回填(见org.h2.store.PageStore.writePage(int, Data))
4 parentPageId
VarInt index对象id(实际是表对象id)
4 rowCountStored
2 entryCount 分隔点的个数(keys数组的有效个数),也等于子节点个数-1
体:
=======================
4 rightmost child page id (最右边的子页id)
entryCount个
{
4 child page id
VarLong key
}