• MINIBASE源代码阅读笔记之DB


    DB

    管理数据库的类

    • file_entry:dir page的元素,保存不同文件对应的page
    • directory_page:dir page的专用结构体,里面有个初始长度为0的variable sized array用来保存file entry
    • first_page:保存整个数据库的信息,包括整个数据库有多少page和dir page的结构体

    整个数据库构造是这样的:整个数据库是一个超大文件,第0页是header page,包含整个数据库的全局信息;第1页是dir page,后面的page保存的是表示整个数据库中分配了空间的page的bit map

    • DB:创建新的数据库,接收名字和页的数量
      1. 拷贝数据库名
      2. 打开文件
      3. 将整个文件按照页的数量进行扩张,写满0(用lseek扩张,write写0)
      4. 用buffer manager的pinPage创建header_page,page id为0,empty=true(这里使用了强制转换)
      5. 初始化这个header page里的dir page,unpin掉它
      6. 将后面所有的bit map都填满1
    • DB(没有num_pages):打开已有数据库
      1. 打开文件
      2. pin住header page,设置empty=false,这样buffer manager会把文件里的第0页读进指针
      3. 根据读到的内容设置好数据库信息,unpin
    • db_destroy:干掉数据库
      1. 关闭文件
      2. 用unlink删掉文件
    • allocate_page:给一堆页分配连续空间
      1. pin住每个bit map所在的page
      2. pin完之后在这个map里找足够长的run,对应足够多的空page
      3. 如果找得到,将起始页的id写进参数返回
    • deallocate_page:顾名思义
    • add_file_entry:给dir page增加file entry,接收文件名和文件对应第一页的page id
      • 找有足够空间的dir page和它对应的header page,找不到就新建
      • 将这个file entry的起始页id和对应文件名设好
      • unpin
    • delete_file_entry:顾名思义
      • 找遍每个dir page的每一个entry,直到找到文件名对的为止
      • 找到之后通过修改内容清空里面的数据,和删掉一样
    • get_file_entry:找到对应文件的第一页的page id
      • 也是找找找。。。
    • read_page:将制定page id的内容读进pageptr
      • 用lseek在文件里定位到这一页的起始处(pageno*pagesize)
      • 读进对应长度的内容
    • write_page:将pageptr的内容写进page id
      • 和read_page差不多
    • set_bits:批量设置bit map
      • 各种位操作看不懂> <
    • init_dir_page:初始化dir page
      • 自己的next_page和entry里所有的pagenum都设为INVALID_PAGE
  • 相关阅读:
    git track
    npm 升级到最新版本
    三行代码实现垂直居中和cube
    布局之定位
    MongoDB的安装问题
    正则表达式
    javascript表单验证
    Oracle中创建表,行级触发器,序列
    查找某个字符在字符串中出现的次数
    oracle表中有一列id她是自动增长的,插入一条数据时怎么取得id的值
  • 原文地址:https://www.cnblogs.com/joyeecheung/p/3672143.html
Copyright © 2020-2023  润新知