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 "common/lang/bitmap.h"
18#include "common/lang/sstream.h"
19#include "storage/buffer/disk_buffer_pool.h"
20#include "storage/common/chunk.h"
21#include "storage/record/record.h"
22#include "storage/record/record_log.h"
23#include "common/types.h"
24
25class LogHandler;
26class ConditionFilter;
28class LogHandler;
29class Trx;
30class Table;
31
67{
68 int32_t record_num;
69 int32_t column_num;
71 int32_t record_size;
74 int32_t data_offset;
75
76 string to_string() const;
77};
78
84{
85public:
88
95 void init(RecordPageHandler *record_page_handler, SlotNum start_slot_num = 0);
96
100 bool has_next();
101
107 RC next(Record &record);
108
112 bool is_valid() const { return record_page_handler_ != nullptr; }
113
114private:
115 RecordPageHandler *record_page_handler_ = nullptr;
116 PageNum page_num_ = BP_INVALID_PAGE_NUM;
118 SlotNum next_slot_num_ = 0;
119};
120
126{
127public:
128 RecordPageHandler(StorageFormat storage_format) : storage_format_(storage_format) {}
129 virtual ~RecordPageHandler();
130 static RecordPageHandler *create(StorageFormat format);
131
139 RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, ReadWriteMode mode);
140
147 RC recover_init(DiskBufferPool &buffer_pool, PageNum page_num);
148
158 DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, int record_size, TableMeta *table_meta);
159
168 RC init_empty_page(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, int record_size,
169 int col_num, const char *col_idx_data);
170
174 RC cleanup();
175
182 virtual RC insert_record(const char *data, RID *rid) { return RC::UNIMPLEMENTED; }
183
190 virtual RC recover_insert_record(const char *data, const RID &rid) { return RC::UNIMPLEMENTED; }
191
197 virtual RC delete_record(const RID *rid) { return RC::UNIMPLEMENTED; }
198
203 virtual RC update_record(const RID &rid, const char *data) { return RC::UNIMPLEMENTED; }
204
211 virtual RC get_record(const RID &rid, Record &record) { return RC::UNIMPLEMENTED; }
212
219 virtual RC get_chunk(Chunk &chunk) { return RC::UNIMPLEMENTED; }
220
224 PageNum get_page_num() const;
225
229 bool is_full() const;
230
231protected:
239 {
241 while (last_record_offset > BP_PAGE_DATA_SIZE) {
243 last_record_offset -= page_header_->record_size;
244 }
245 }
246
252 char *get_record_data(SlotNum slot_num)
253 {
254 return frame_->data() + page_header_->data_offset + (page_header_->record_size * slot_num);
255 }
256
257protected:
260 Frame *frame_ = nullptr;
261 ReadWriteMode rw_mode_ = ReadWriteMode::READ_WRITE;
263 char *bitmap_ = nullptr;
264 StorageFormat storage_format_;
265
266protected:
267 friend class RecordPageIterator;
268};
269
281{
282public:
283 RowRecordPageHandler() : RecordPageHandler(StorageFormat::ROW_FORMAT) {}
284
285 virtual RC insert_record(const char *data, RID *rid) override;
286
287 virtual RC recover_insert_record(const char *data, const RID &rid) override;
288
289 virtual RC delete_record(const RID *rid) override;
290
291 virtual RC update_record(const RID &rid, const char *data) override;
292
299 virtual RC get_record(const RID &rid, Record &record) override;
300};
301
314{
315public:
316 PaxRecordPageHandler() : RecordPageHandler(StorageFormat::PAX_FORMAT) {}
317
325 virtual RC insert_record(const char *data, RID *rid) override;
326
327 virtual RC delete_record(const RID *rid) override;
328
336 virtual RC get_record(const RID &rid, Record &record) override;
337
343 virtual RC get_chunk(Chunk &chunk) override;
344
345private:
346 // get the field data by `slot_num` and `column id`
347 char *get_field_data(SlotNum slot_num, int col_id);
348
349 // get the field length by `column id`, all columns are fixed length.
350 int get_field_len(int col_id);
351};
358{
359public:
360 RecordFileHandler(StorageFormat storage_format) : storage_format_(storage_format){};
362
368 RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, TableMeta *table_meta);
369
373 void close();
374
380 RC delete_record(const RID *rid);
381
389 RC insert_record(const char *data, int record_size, RID *rid);
390
398 RC recover_insert_record(const char *data, int record_size, const RID &rid);
399
400 RC get_record(const RID &rid, Record &record);
401
402 RC visit_record(const RID &rid, function<bool(Record &)> updater);
403
404private:
408 RC init_free_pages();
409
410private:
411 DiskBufferPool *disk_buffer_pool_ = nullptr;
413 unordered_set<PageNum> free_pages_;
415 StorageFormat storage_format_;
416 TableMeta *table_meta_;
417};
418
425{
426public:
427 ChunkFileScanner() = default;
429
430 // TODO: not support filter and transaction
431 RC open_scan_chunk(Table *table, DiskBufferPool &buffer_pool, LogHandler &log_handler, ReadWriteMode mode);
432
436 RC close_scan();
437
441 RC next_chunk(Chunk &chunk);
442
443private:
444 Table *table_ = nullptr;
445
447 LogHandler *log_handler_ = nullptr;
448 ReadWriteMode rw_mode_ = ReadWriteMode::READ_WRITE;
449
452};
用于遍历BufferPool中的所有页面
Definition: disk_buffer_pool.h:167
遍历某个文件中所有记录,每次返回一个 Chunk
Definition: record_manager.h:425
RC next_chunk(Chunk &chunk)
每次调用获取一个页面中的所有记录。
Definition: record_manager.cpp:744
ReadWriteMode rw_mode_
遍历出来的数据,是否可能对它做修改
Definition: record_manager.h:448
Table * table_
当前遍历的是哪张表。
Definition: record_manager.h:444
DiskBufferPool * disk_buffer_pool_
当前访问的文件
Definition: record_manager.h:446
RC close_scan()
关闭一个文件扫描,释放相应的资源
Definition: record_manager.cpp:705
RecordPageHandler * record_page_handler_
处理文件某页面的记录
Definition: record_manager.h:451
BufferPoolIterator bp_iterator_
遍历buffer pool的所有页面
Definition: record_manager.h:450
A Chunk represents a set of columns.
Definition: chunk.h:23
Definition: condition_filter.h:31
BufferPool的实现
Definition: disk_buffer_pool.h:189
页帧
Definition: frame.h:66
对外提供服务的CLog模块
Definition: log_handler.h:40
负责处理 PAX 存储格式的页面中各种操作
Definition: record_manager.h:314
virtual RC insert_record(const char *data, RID *rid) override
插入一条记录
Definition: record_manager.cpp:417
virtual RC get_chunk(Chunk &chunk) override
以 Chunk 格式获取整个页面中指定列的所有记录。
Definition: record_manager.cpp:454
virtual RC get_record(const RID &rid, Record &record) override
获取指定位置的记录数据
Definition: record_manager.cpp:447
virtual RC delete_record(const RID *rid) override
删除指定的记录
Definition: record_manager.cpp:423
管理整个文件中记录的增删改查
Definition: record_manager.h:358
RC delete_record(const RID *rid)
从指定文件中删除指定槽位的记录
Definition: record_manager.cpp:623
RC recover_insert_record(const char *data, int record_size, const RID &rid)
数据库恢复时,在指定文件指定位置插入数据
Definition: record_manager.cpp:608
RC init_free_pages()
初始化当前没有填满记录的页面,初始化free_pages_成员
Definition: record_manager.cpp:511
LogHandler * log_handler_
记录日志的处理器
Definition: record_manager.h:412
unordered_set< PageNum > free_pages_
没有填充满的页面集合
Definition: record_manager.h:413
RC insert_record(const char *data, int record_size, RID *rid)
插入一个新的记录到指定文件中,并返回该记录的标识符
Definition: record_manager.cpp:542
RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, TableMeta *table_meta)
初始化
Definition: record_manager.cpp:484
common::Mutex lock_
当编译时增加-DCONCURRENCY=ON 选项时,才会真正的支持并发
Definition: record_manager.h:414
void close()
关闭,做一些资源清理的工作
Definition: record_manager.cpp:501
Definition: record_log.h:82
负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录
Definition: record_manager.h:126
void fix_record_capacity()
Definition: record_manager.h:238
PageNum get_page_num() const
返回该记录页的页号
Definition: record_manager.cpp:407
RC recover_init(DiskBufferPool &buffer_pool, PageNum page_num)
数据库恢复时,与普通的运行场景有所不同,不做任何并发操作,也不需要加锁
Definition: record_manager.cpp:134
ReadWriteMode rw_mode_
当前的操作是否都是只读的
Definition: record_manager.h:261
RecordLogHandler log_handler_
当前操作的日志处理器
Definition: record_manager.h:259
virtual RC get_chunk(Chunk &chunk)
获取整个页面中指定列的所有记录。
Definition: record_manager.h:219
RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, ReadWriteMode mode)
初始化
Definition: record_manager.cpp:98
RC cleanup()
操作结束后做的清理工作,比如释放页面、解锁
Definition: record_manager.cpp:254
DiskBufferPool * disk_buffer_pool_
当前操作的buffer pool(文件)
Definition: record_manager.h:258
bool is_full() const
当前页面是否已经没有空闲位置插入新的记录
Definition: record_manager.cpp:415
virtual RC delete_record(const RID *rid)
删除指定的记录
Definition: record_manager.h:197
virtual RC get_record(const RID &rid, Record &record)
获取指定位置的记录数据
Definition: record_manager.h:211
virtual RC recover_insert_record(const char *data, const RID &rid)
数据库恢复时,在指定位置插入数据
Definition: record_manager.h:190
PageHeader * page_header_
当前页面上页面头
Definition: record_manager.h:262
RC init_empty_page(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, int record_size, TableMeta *table_meta)
对一个新的页面做初始化,初始化关于该页面记录信息的页头PageHeader
Definition: record_manager.cpp:161
virtual RC insert_record(const char *data, RID *rid)
插入一条记录
Definition: record_manager.h:182
Frame * frame_
当前操作页面关联的frame(frame的更多概念可以参考buffer pool和frame)
Definition: record_manager.h:260
char * bitmap_
当前页面上record分配状态信息bitmap内存起始位置
Definition: record_manager.h:263
char * get_record_data(SlotNum slot_num)
获取指定槽位的记录数据
Definition: record_manager.h:252
遍历一个页面中每条记录的iterator
Definition: record_manager.h:84
RC next(Record &record)
读取下一个记录到record中包括RID和数据,并更新下一个记录位置next_slot_num_
Definition: record_manager.cpp:84
bool is_valid() const
Definition: record_manager.h:112
common::Bitmap bitmap_
bitmap 的相关信息可以参考 RecordPageHandler 的说明
Definition: record_manager.h:117
void init(RecordPageHandler *record_page_handler, SlotNum start_slot_num=0)
初始化一个迭代器
Definition: record_manager.cpp:74
SlotNum next_slot_num_
当前遍历到了哪一个slot
Definition: record_manager.h:118
bool has_next()
判断是否有下一个记录
Definition: record_manager.cpp:82
表示一个记录
Definition: record.h:101
负责处理行存页面中各种操作
Definition: record_manager.h:281
virtual RC recover_insert_record(const char *data, const RID &rid) override
数据库恢复时,在指定位置插入数据
Definition: record_manager.cpp:306
virtual RC delete_record(const RID *rid) override
删除指定的记录
Definition: record_manager.cpp:329
virtual RC insert_record(const char *data, RID *rid) override
插入一条记录
Definition: record_manager.cpp:269
virtual RC get_record(const RID &rid, Record &record) override
获取指定位置的记录数据
Definition: record_manager.cpp:388
表元数据
Definition: table_meta.h:29
Definition: table.h:42
事务接口
Definition: trx.h:141
Definition: bitmap.h:20
Definition: mutex.h:268
数据文件,按照页面来组织,每一页都存放一些记录/数据行
Definition: record_manager.h:67
int32_t record_size
每条记录占用实际空间大小(可能对齐)
Definition: record_manager.h:71
int32_t record_capacity
最大记录个数
Definition: record_manager.h:72
int32_t record_num
当前页面记录的个数
Definition: record_manager.h:68
int32_t record_real_size
每条记录的实际大小
Definition: record_manager.h:70
int32_t col_idx_offset
列索引偏移量
Definition: record_manager.h:73
int32_t column_num
当前页面记录所包含的列数
Definition: record_manager.h:69
int32_t data_offset
第一条记录的偏移量
Definition: record_manager.h:74
标识一个记录的位置 一个记录是放在某个文件的某个页面的某个槽位。这里不记录文件信息,记录页面和槽位信息
Definition: record.h:35