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写进参数返回
    1. 找一个空的slot
      1. 如果有已经用过但里面的东西不要的,直接用,不用登记新的slot,要用的空间是recLen
      2. 如果没有,就放到后面去,需要登记一个新的slot,要用的空间是recLen+sizeof(slot_t)
    2. 设置对应的offset和length
    3. 复制内存
    4. 将freePtr向后移
    5. 返回对应的rid(由page id和slot id组成)
  • deleteRecord:顾名思义
    1. 如果要删的record在尾巴(slotNo == slotCnt+1),不用处理
    2. 如果在中间,将所有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
原文地址:https://www.cnblogs.com/joyeecheung/p/3672090.html