MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
载入中...
搜索中...
未找到
record_manager.h
1
2/* Copyright (c) 2021 Xie Meiyi(xiemeiyi@hust.edu.cn) and OceanBase and/or its affiliates. All rights reserved.
3miniob is licensed under Mulan PSL v2.
4You can use this software according to the terms and conditions of the Mulan PSL v2.
5You may obtain a copy of Mulan PSL v2 at:
6 http://license.coscl.org.cn/MulanPSL2
7THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10See the Mulan PSL v2 for more details. */
11
12//
13// Created by Meiyi & Longda on 2021/4/13.
14//
15#pragma once
16
17#include <sstream>
18#include <limits>
19#include "storage/buffer/disk_buffer_pool.h"
20#include "storage/trx/latch_memo.h"
21#include "storage/record/record.h"
22#include "common/lang/bitmap.h"
23
24class ConditionFilter;
26class Trx;
27class Table;
28
64{
65 int32_t record_num;
67 int32_t record_size;
70};
71
77{
78public:
81
88 void init(RecordPageHandler &record_page_handler, SlotNum start_slot_num = 0);
89
93 bool has_next();
94
100 RC next(Record &record);
101
105 bool is_valid() const { return record_page_handler_ != nullptr; }
106
107private:
108 RecordPageHandler *record_page_handler_ = nullptr;
109 PageNum page_num_ = BP_INVALID_PAGE_NUM;
110 common::Bitmap bitmap_;
111 SlotNum next_slot_num_ = 0;
112};
113
125{
126public:
127 RecordPageHandler() = default;
129
137 RC init(DiskBufferPool &buffer_pool, PageNum page_num, bool readonly);
138
145 RC recover_init(DiskBufferPool &buffer_pool, PageNum page_num);
146
154 RC init_empty_page(DiskBufferPool &buffer_pool, PageNum page_num, int record_size);
155
159 RC cleanup();
160
167 RC insert_record(const char *data, RID *rid);
168
175 RC recover_insert_record(const char *data, const RID &rid);
176
182 RC delete_record(const RID *rid);
183
190 RC get_record(const RID *rid, Record *rec);
191
195 PageNum get_page_num() const;
196
200 bool is_full() const;
201
202protected:
210 int32_t last_record_offset = page_header_->first_record_offset +
212 while(last_record_offset > BP_PAGE_DATA_SIZE) {
214 last_record_offset -= page_header_->record_size;
215 }
216 }
217
223 char *get_record_data(SlotNum slot_num)
224 {
225 return frame_->data() + page_header_->first_record_offset + (page_header_->record_size * slot_num);
226 }
227
228protected:
230 Frame *frame_ = nullptr;
231 bool readonly_ = false;
233 char *bitmap_ = nullptr;
234
235private:
236 friend class RecordPageIterator;
237};
238
245{
246public:
247 RecordFileHandler() = default;
249
255 RC init(DiskBufferPool *buffer_pool);
256
260 void close();
261
267 RC delete_record(const RID *rid);
268
276 RC insert_record(const char *data, int record_size, RID *rid);
277
285 RC recover_insert_record(const char *data, int record_size, const RID &rid);
286
297 RC get_record(RecordPageHandler &page_handler, const RID *rid, bool readonly, Record *rec);
298
306 RC visit_record(const RID &rid, bool readonly, std::function<void(Record &)> visitor);
307
308private:
312 RC init_free_pages();
313
314private:
315 DiskBufferPool *disk_buffer_pool_ = nullptr;
316 std::unordered_set<PageNum> free_pages_;
317 common::Mutex lock_;
318};
319
326{
327public:
328 RecordFileScanner() = default;
330
340 RC open_scan(Table *table, DiskBufferPool &buffer_pool, Trx *trx, bool readonly, ConditionFilter *condition_filter);
341
345 RC close_scan();
346
351 bool has_next();
352
360 RC next(Record &record);
361
362private:
367
372
373private:
374 // TODO 对于一个纯粹的record遍历器来说,不应该关心表和事务
375 Table *table_ = nullptr;
377 Trx *trx_ = nullptr;
378 bool readonly_ = false;
379
385};
用于遍历BufferPool中的所有页面
Definition: disk_buffer_pool.h:173
Definition: condition_filter.h:31
BufferPool的实现
Definition: disk_buffer_pool.h:193
页帧
Definition: frame.h:62
管理整个文件中记录的增删改查
Definition: record_manager.h:245
RC init(DiskBufferPool *buffer_pool)
初始化
Definition: record_manager.cpp:296
RC delete_record(const RID *rid)
从指定文件中删除指定槽位的记录
Definition: record_manager.cpp:430
RC get_record(RecordPageHandler &page_handler, const RID *rid, bool readonly, Record *rec)
获取指定文件中标识符为rid的记录内容到rec指向的记录结构中
Definition: record_manager.cpp:456
RC recover_insert_record(const char *data, int record_size, const RID &rid)
数据库恢复时,在指定文件指定位置插入数据
Definition: record_manager.cpp:415
RC init_free_pages()
初始化当前没有填满记录的页面,初始化free_pages_成员
Definition: record_manager.cpp:319
RC insert_record(const char *data, int record_size, RID *rid)
插入一个新的记录到指定文件中,并返回该记录的标识符
Definition: record_manager.cpp:350
std::unordered_set< PageNum > free_pages_
没有填充满的页面集合
Definition: record_manager.h:316
RC visit_record(const RID &rid, bool readonly, std::function< void(Record &)> visitor)
与get_record类似,访问某个记录,并提供回调函数来操作相应的记录
Definition: record_manager.cpp:472
common::Mutex lock_
当编译时增加-DCONCURRENCY=ON 选项时,才会真正的支持并发
Definition: record_manager.h:317
void close()
关闭,做一些资源清理的工作
Definition: record_manager.cpp:311
遍历某个文件中所有记录
Definition: record_manager.h:326
DiskBufferPool * disk_buffer_pool_
当前访问的文件
Definition: record_manager.h:376
RC open_scan(Table *table, DiskBufferPool &buffer_pool, Trx *trx, bool readonly, ConditionFilter *condition_filter)
打开一个文件扫描。
Definition: record_manager.cpp:497
BufferPoolIterator bp_iterator_
遍历buffer pool的所有页面
Definition: record_manager.h:380
RC close_scan()
关闭一个文件扫描,释放相应的资源
Definition: record_manager.cpp:605
RC next(Record &record)
获取下一条记录
Definition: record_manager.cpp:622
RecordPageIterator record_page_iterator_
遍历某个页面上的所有record
Definition: record_manager.h:383
RC fetch_next_record_in_page()
获取一个页面内的下一条记录
Definition: record_manager.cpp:570
Record next_record_
获取的记录放在这里缓存起来
Definition: record_manager.h:384
RC fetch_next_record()
获取该文件中的下一条记录
Definition: record_manager.cpp:527
bool readonly_
遍历出来的数据,是否可能对它做修改
Definition: record_manager.h:378
Table * table_
当前遍历的是哪张表。这个字段仅供事务函数使用,如果设计合适,可以去掉
Definition: record_manager.h:375
RecordPageHandler record_page_handler_
处理文件某页面的记录
Definition: record_manager.h:382
ConditionFilter * condition_filter_
过滤record
Definition: record_manager.h:381
Trx * trx_
当前是哪个事务在遍历
Definition: record_manager.h:377
bool has_next()
判断是否还有数据
Definition: record_manager.cpp:620
负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录
Definition: record_manager.h:125
void fix_record_capacity()
Definition: record_manager.h:209
PageNum get_page_num() const
返回该记录页的页号
Definition: record_manager.cpp:282
RC recover_init(DiskBufferPool &buffer_pool, PageNum page_num)
数据库恢复时,与普通的运行场景有所不同,不做任何并发操作,也不需要加锁
Definition: record_manager.cpp:115
RC init(DiskBufferPool &buffer_pool, PageNum page_num, bool readonly)
初始化
Definition: record_manager.cpp:82
RC recover_insert_record(const char *data, const RID &rid)
数据库恢复时,在指定位置插入数据
Definition: record_manager.cpp:215
RC cleanup()
操作结束后做的清理工作,比如释放页面、解锁
Definition: record_manager.cpp:170
DiskBufferPool * disk_buffer_pool_
当前操作的buffer pool(文件)
Definition: record_manager.h:229
RC get_record(const RID *rid, Record *rec)
获取指定位置的记录数据
Definition: record_manager.cpp:264
bool is_full() const
当前页面是否已经没有空闲位置插入新的记录
Definition: record_manager.cpp:290
RC insert_record(const char *data, RID *rid)
插入一条记录
Definition: record_manager.cpp:185
PageHeader * page_header_
当前页面上页面头
Definition: record_manager.h:232
RC delete_record(const RID *rid)
删除指定的记录
Definition: record_manager.cpp:238
bool readonly_
当前的操作是否都是只读的
Definition: record_manager.h:231
RC init_empty_page(DiskBufferPool &buffer_pool, PageNum page_num, int record_size)
对一个新的页面做初始化,初始化关于该页面记录信息的页头PageHeader
Definition: record_manager.cpp:142
Frame * frame_
当前操作页面关联的frame(frame的更多概念可以参考buffer pool和frame)
Definition: record_manager.h:230
char * bitmap_
当前页面上record分配状态信息bitmap内存起始位置
Definition: record_manager.h:233
char * get_record_data(SlotNum slot_num)
获取指定槽位的记录数据
Definition: record_manager.h:223
遍历一个页面中每条记录的iterator
Definition: record_manager.h:77
RC next(Record &record)
读取下一个记录到record中包括RID和数据,并更新下一个记录位置next_slot_num_
Definition: record_manager.cpp:67
void init(RecordPageHandler &record_page_handler, SlotNum start_slot_num=0)
初始化一个迭代器
Definition: record_manager.cpp:57
bool is_valid() const
Definition: record_manager.h:105
common::Bitmap bitmap_
bitmap 的相关信息可以参考 RecordPageHandler 的说明
Definition: record_manager.h:110
SlotNum next_slot_num_
当前遍历到了哪一个slot
Definition: record_manager.h:111
bool has_next()
判断是否有下一个记录
Definition: record_manager.cpp:65
表示一个记录 当前的记录都是连续存放的空间(内存或磁盘上)。 为了提高访问的效率,record通常直接记录指向页面上的内存,但是需要保证访问这种数据时,拿着锁资源。 为了方便,也提供了复制内存的方法。可...
Definition: record.h:92
Definition: table.h:37
事务接口
Definition: trx.h:142
数据文件,按照页面来组织,每一页都存放一些记录/数据行
Definition: record_manager.h:64
int32_t record_size
每条记录占用实际空间大小(可能对齐)
Definition: record_manager.h:67
int32_t record_capacity
最大记录个数
Definition: record_manager.h:68
int32_t record_num
当前页面记录的个数
Definition: record_manager.h:65
int32_t first_record_offset
第一条记录的偏移量
Definition: record_manager.h:69
int32_t record_real_size
每条记录的实际大小
Definition: record_manager.h:66
标识一个记录的位置 一个记录是放在某个文件的某个页面的某个槽位。这里不记录文件信息,记录页面和槽位信息
Definition: record.h:35