MINIBASE源代码阅读笔记之HFPage
HFPage
heap file的page的类
成员
- slot_t:用来表示页里的slot,包括offset和length
- slot[]:倒着生长的slot array
- slotCnt:有多少已用slot,注意是倒着数的
- freePtr:data[]中第一个free的byte的offset
- freeSpace:data[]里一共有多少free bytes
- type:里面数据的类型
- prevPage,nextPage,curPage:各种page id
方法
- init:初始化,设置好一堆变量
- insertRecord:接收要写的record的指针和长度,将写进page里的record对应的rid写进参数返回
- 找一个空的slot
- 如果有已经用过但里面的东西不要的,直接用,不用登记新的slot,要用的空间是recLen
- 如果没有,就放到后面去,需要登记一个新的slot,要用的空间是recLen+sizeof(slot_t)
- 设置对应的offset和length
- 复制内存
- 将freePtr向后移
- 返回对应的rid(由page id和slot id组成)
- 找一个空的slot
- deleteRecord:顾名思义
- 如果要删的record在尾巴(slotNo == slotCnt+1),不用处理
- 如果在中间,将所有byte向开头shift过去,改掉所有slot的offset,将freePtr向前移,设置对应的slot的length为-1,offset为0即对应slot为空
- firstRecord:返回这页的第一个record的rid,如果没有record返回done
- 暴力查找。。
- nextRecord:接收curRid,将下一个record的Rid写进参数返回
- 不断向后找直到找到第一个不为空的slot
- getRecord:接收rid和长度,写好内容到给定的指针里
- 从给的rid里抓出slot id,再去slot[]里找到对应的offset和length,写内存
- returnRecord:返回对应record的实际指针(暴露?)
- 找到对应的offset和length之后把在data[]里的地址写进指针的引用返回
- returnOffset:返回rid对应record的offset
- 依然是转换slot id到offset