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:创建新的数据库,接收名字和页的数量
- 拷贝数据库名
- 打开文件
- 将整个文件按照页的数量进行扩张,写满0(用lseek扩张,write写0)
- 用buffer manager的pinPage创建header_page,page id为0,empty=true(这里使用了强制转换)
- 初始化这个header page里的dir page,unpin掉它
- 将后面所有的bit map都填满1
- DB(没有num_pages):打开已有数据库
- 打开文件
- pin住header page,设置empty=false,这样buffer manager会把文件里的第0页读进指针
- 根据读到的内容设置好数据库信息,unpin
- db_destroy:干掉数据库
- 关闭文件
- 用unlink删掉文件
- allocate_page:给一堆页分配连续空间
- pin住每个bit map所在的page
- pin完之后在这个map里找足够长的run,对应足够多的空page
- 如果找得到,将起始页的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的更多相关文章
- MINIBASE源代码阅读笔记之buffer manager
BufDesc frame 们的 descriptor(见BufHashTbl注释),包括 pageNo: 这个 frame 在文件里的id,page number prevframe: -1 表示此 ...
- MINIBASE源代码阅读笔记之heapfile
Heapfile 用来管理heap file里的dir page们 成员 _firstDirPageId:这个文件的第一个dir page _ftype:文件类型 _file_deleted:删除的时 ...
- MINIBASE源代码阅读笔记之HFPage
HFPage heap file的page的类 成员 slot_t:用来表示页里的slot,包括offset和length slot[]:倒着生长的slot array slotCnt:有多少已用sl ...
- Mongodb源代码阅读笔记:Journal机制
Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODAT ...
- CI框架源代码阅读笔记5 基准測试 BenchMark.php
上一篇博客(CI框架源代码阅读笔记4 引导文件CodeIgniter.php)中.我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的.这些组件类似于一个一个单独的模块,不同的模块完毕不同的 ...
- CI框架源代码阅读笔记3 全局函数Common.php
从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...
- CI框架源代码阅读笔记2 一切的入口 index.php
上一节(CI框架源代码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程.这里再次贴出流程图.以备參考: 作为CI框架的入口文件.源代码阅读,自然由此開始. 在源代码阅读的 ...
- Spark源代码阅读笔记之DiskStore
Spark源代码阅读笔记之DiskStore BlockManager底层通过BlockStore来对数据进行实际的存储.BlockStore是一个抽象类,有三种实现:DiskStore(磁盘级别的持 ...
- Java Jdk1.8 HashMap源代码阅读笔记二
三.源代码阅读 3.元素包括containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a ...
随机推荐
- 使用pt-ioprofile监控数据库io文件读写情况
我们在做IO密集型的应用程序的时候,比如MySQL数据库,通常系统的表现取决于workload的类型. 比如我们要调优,我们就必须非常清楚的知道数据的访问规律,收集到足够的数据,用来做调优的依据. 有 ...
- 【OpenCV】SIFT原理与源码分析:关键点搜索与定位
<SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一步<DoG尺度空间构造>,我们得到了 ...
- poj3613Cow Relays
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7683 Accepted: 3017 Descri ...
- select、poll和epoll多路I/O复用
一.三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被 ...
- i针对网段开放端口 (命令行设置)
针对网段开放端口 -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 1234 -j ACCEPT 命令行设置iptables iptables -I I ...
- 基于javaWeb阶段下的Cookie和Session总结
1. 会话技术 就是用户在使用浏览器浏览界面的时候,去访问多个页面后一次性关闭浏览器,这个过程叫会话,学习会话技术就是在客户端与服务器进行交互的时候为了能更好的保存数据.在java中会话技术只有C ...
- 前端PHP入门-035-Session的实例
登陆例子:(请注意一定要自己敲一遍,不要CV大法) 首先上一下成果图,激起同学们写的欲望,登录页如下: 点击登陆之后如下: 说明哦了,么问题.接下来自己实现一下. 首先数据库信息: 新建一个名为 ...
- 前端PHP入门-016-静态变量
如果我想知道函数被调用了多少次怎么办?在没有学习静态变量的时候,我们没有好的办法来解决. 静态变量的特点是:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行. ...
- UVA 12520 Square Garden
https://vjudge.net/problem/UVA-12520 题意:n*n网格中染色m个格子,染色格子的最长轮廓线 贪心 将格子分为4类 1.隔一个选一个,互不相邻的格子 2.4个角上的格 ...
- uva 1636 Headshot
https://vjudge.net/problem/UVA-1636 首先在手枪里随机装一些子弹,然后抠了一枪,发现没有子弹.你希望下一枪也没有子弹,是应该直接再抠一枪(输出SHOOT)呢,还是随机 ...