MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录 更多...
#include <record_manager.h>
Public 成员函数 | |
RC | init (DiskBufferPool &buffer_pool, PageNum page_num, bool readonly) |
初始化 更多... | |
RC | recover_init (DiskBufferPool &buffer_pool, PageNum page_num) |
数据库恢复时,与普通的运行场景有所不同,不做任何并发操作,也不需要加锁 更多... | |
RC | init_empty_page (DiskBufferPool &buffer_pool, PageNum page_num, int record_size) |
对一个新的页面做初始化,初始化关于该页面记录信息的页头PageHeader 更多... | |
RC | cleanup () |
操作结束后做的清理工作,比如释放页面、解锁 | |
RC | insert_record (const char *data, RID *rid) |
插入一条记录 更多... | |
RC | recover_insert_record (const char *data, const RID &rid) |
数据库恢复时,在指定位置插入数据 更多... | |
RC | delete_record (const RID *rid) |
删除指定的记录 更多... | |
RC | get_record (const RID *rid, Record *rec) |
获取指定位置的记录数据 更多... | |
PageNum | get_page_num () const |
返回该记录页的页号 | |
bool | is_full () const |
当前页面是否已经没有空闲位置插入新的记录 | |
Protected 成员函数 | |
void | fix_record_capacity () |
char * | get_record_data (SlotNum slot_num) |
获取指定槽位的记录数据 更多... | |
Protected 属性 | |
DiskBufferPool * | disk_buffer_pool_ = nullptr |
当前操作的buffer pool(文件) | |
Frame * | frame_ = nullptr |
当前操作页面关联的frame(frame的更多概念可以参考buffer pool和frame) | |
bool | readonly_ = false |
当前的操作是否都是只读的 | |
PageHeader * | page_header_ = nullptr |
当前页面上页面头 | |
char * | bitmap_ = nullptr |
当前页面上record分配状态信息bitmap内存起始位置 | |
友元 | |
class | RecordPageIterator |
负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录
当前定长记录模式下每个页面的组织大概是这样的:
RC RecordPageHandler::delete_record | ( | const RID * | rid | ) |
删除指定的记录
rid | 要删除的记录标识 |
|
inlineprotected |
前面在计算record_capacity时并没有考虑对齐,但第一个record需要8字节对齐 因此按此前计算的record_capacity,最后一个记录的部分数据可能会被挤出页面 所以需要对record_capacity进行修正,保证记录不会溢出
获取指定位置的记录数据
rid | 指定的位置 |
rec | 返回指定的数据。这里不会将数据复制出来,而是使用指针,所以调用者必须保证数据使用期间受到保护 |
|
inlineprotected |
获取指定槽位的记录数据
指定的记录槽位 |
RC RecordPageHandler::init | ( | DiskBufferPool & | buffer_pool, |
PageNum | page_num, | ||
bool | readonly | ||
) |
初始化
buffer_pool | 关联某个文件时,都通过buffer pool来做读写文件 |
page_num | 当前处理哪个页面 |
readonly | 是否只读。在访问页面时,需要对页面加锁 |
RC RecordPageHandler::init_empty_page | ( | DiskBufferPool & | buffer_pool, |
PageNum | page_num, | ||
int | record_size | ||
) |
对一个新的页面做初始化,初始化关于该页面记录信息的页头PageHeader
buffer_pool | 关联某个文件时,都通过buffer pool来做读写文件 |
page_num | 当前处理哪个页面 |
record_size | 每个记录的大小 |
RC RecordPageHandler::insert_record | ( | const char * | data, |
RID * | rid | ||
) |
插入一条记录
data | 要插入的记录 |
rid | 如果插入成功,通过这个参数返回插入的位置 |
RC RecordPageHandler::recover_init | ( | DiskBufferPool & | buffer_pool, |
PageNum | page_num | ||
) |
数据库恢复时,与普通的运行场景有所不同,不做任何并发操作,也不需要加锁
buffer_pool | 关联某个文件时,都通过buffer pool来做读写文件 |
page_num | 操作的页面编号 |
RC RecordPageHandler::recover_insert_record | ( | const char * | data, |
const RID & | rid | ||
) |
数据库恢复时,在指定位置插入数据
data | 要插入的数据行 |
rid | 插入的位置 |