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

MINIBASE源代码阅读笔记之DB的更多相关文章

  1. MINIBASE源代码阅读笔记之buffer manager

    BufDesc frame 们的 descriptor(见BufHashTbl注释),包括 pageNo: 这个 frame 在文件里的id,page number prevframe: -1 表示此 ...

  2. MINIBASE源代码阅读笔记之heapfile

    Heapfile 用来管理heap file里的dir page们 成员 _firstDirPageId:这个文件的第一个dir page _ftype:文件类型 _file_deleted:删除的时 ...

  3. MINIBASE源代码阅读笔记之HFPage

    HFPage heap file的page的类 成员 slot_t:用来表示页里的slot,包括offset和length slot[]:倒着生长的slot array slotCnt:有多少已用sl ...

  4. Mongodb源代码阅读笔记:Journal机制

    Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODAT ...

  5. CI框架源代码阅读笔记5 基准測试 BenchMark.php

    上一篇博客(CI框架源代码阅读笔记4 引导文件CodeIgniter.php)中.我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的.这些组件类似于一个一个单独的模块,不同的模块完毕不同的 ...

  6. CI框架源代码阅读笔记3 全局函数Common.php

    从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...

  7. CI框架源代码阅读笔记2 一切的入口 index.php

    上一节(CI框架源代码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程.这里再次贴出流程图.以备參考: 作为CI框架的入口文件.源代码阅读,自然由此開始. 在源代码阅读的 ...

  8. Spark源代码阅读笔记之DiskStore

    Spark源代码阅读笔记之DiskStore BlockManager底层通过BlockStore来对数据进行实际的存储.BlockStore是一个抽象类,有三种实现:DiskStore(磁盘级别的持 ...

  9. Java Jdk1.8 HashMap源代码阅读笔记二

    三.源代码阅读 3.元素包括containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a ...

随机推荐

  1. 埃及分数&&The Rotation Game&&骑士精神——IDA*

    IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...

  2. 【单调队列】【P3957】 跳房子

    传送门 Description 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 $n$ 个格子,这些格子都 ...

  3. Python3 字典 clear()方法

     Python3 字典 描述 Python 字典 clear() 函数用于删除字典内所有元素. 语法 clear()方法语法: dict.clear() 参数 NA. 返回值 该函数没有任何返回值. ...

  4. php前后端分离项目跨域问题解决办法

    由于之前一直没有做过前后端分离项目,导致走了不少弯路,而且还采用了一种及其不优雅的方法 (在第一次请求的时候把服务器返回的session id保存起来,后续请求的时候把该session id作为参数传 ...

  5. STL源码分析-iterator

    http://note.youdao.com/noteshare?id=4efcb6441063dae956c226f91c161897

  6. H5禁止手机虚拟键盘弹出

    点击输入框弹出自定义弹窗,输入框是input标:但是在移动端,input会默认触发手机的虚拟键盘,如何阻止手机虚拟键盘弹起呢?目前我试过有两个方案,一个是给input添加readonly属性,另一个就 ...

  7. Scratch编程小案例:愤怒的小牛

    愤怒的小鸟曾经很热门,网上还说他是程序员最喜欢玩的游戏.最先我是WIKIOI的评测页面看到他的,后来在2014年全国信息学奥林匹克联赛第一天第三题飞扬的小鸟也看到了它.因此,突然想做一个类似愤怒的小鸟 ...

  8. ubuntu系统安装mysql二进制压缩包(tar.gz)以及navicat远程连接服务器(linux系统)

    一.ubuntu安装mysql5.6二进制压缩包(tar.gz) 准备 0. 获取 mysql-5.5.15-linux2.6-i686.tar.gz 二进制安装文件 mysql 官网下载页面选择 L ...

  9. SpringCloud学习(5)——Feign负载均衡

    Feign概述 Feign是声明式的Web服务客户端, 使得编写Web服务客户端变的非常容易, 只需要创建一个接口, 然后在上面添加注解即可. Feign旨在使编写Java Http客户端变的更容易. ...

  10. Debian sudo自动补全

    解决 debian sudo TAB 键不能自动补全命令的原因 一般情况,命令行输入 sudo apt-get ins 按 tab ,它后面会自动补全为 install 如果右面写了包的名的一部分,按 ...