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 "storage/record/lob_handler.h"
24#include "common/types.h"
25
26class LogHandler;
27class ConditionFilter;
29class LogHandler;
30class Trx;
31class Table;
32
68{
69 int32_t record_num;
70 int32_t column_num;
72 int32_t record_size;
75 int32_t data_offset;
76
77 string to_string() const;
78};
79
85{
86public:
89
96 void init(RecordPageHandler *record_page_handler, SlotNum start_slot_num = 0);
97
101 bool has_next();
102
108 RC next(Record &record);
109
113 bool is_valid() const { return record_page_handler_ != nullptr; }
114
115private:
116 RecordPageHandler *record_page_handler_ = nullptr;
117 PageNum page_num_ = BP_INVALID_PAGE_NUM;
119 SlotNum next_slot_num_ = 0;
120};
121
127{
128public:
129 RecordPageHandler(StorageFormat storage_format) : storage_format_(storage_format) {}
130 virtual ~RecordPageHandler();
131 static RecordPageHandler *create(StorageFormat format);
132
140 RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, ReadWriteMode mode,
141 LobFileHandler *lob_handler = nullptr);
142
149 RC recover_init(DiskBufferPool &buffer_pool, PageNum page_num);
150
159 RC init_empty_page(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, int record_size,
160 TableMeta *table_meta, LobFileHandler *lob_handler = nullptr);
161
170 RC init_empty_page(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, int record_size,
171 int col_num, const char *col_idx_data, LobFileHandler *lob_handler = nullptr);
172
176 RC cleanup();
177
184 virtual RC insert_record(const char *data, RID *rid) { return RC::UNIMPLEMENTED; }
185
186 virtual RC insert_chunk(const Chunk &chunk, int start_row, int &insert_rows) { return RC::UNIMPLEMENTED; }
187
194 virtual RC recover_insert_record(const char *data, const RID &rid) { return RC::UNIMPLEMENTED; }
195
201 virtual RC delete_record(const RID *rid) { return RC::UNIMPLEMENTED; }
202
207 virtual RC update_record(const RID &rid, const char *data) { return RC::UNIMPLEMENTED; }
208
215 virtual RC get_record(const RID &rid, Record &record) { return RC::UNIMPLEMENTED; }
216
223 virtual RC get_chunk(Chunk &chunk) { return RC::UNIMPLEMENTED; }
224
228 PageNum get_page_num() const;
229
233 bool is_full() const;
234
235protected:
243 {
245 while (last_record_offset > BP_PAGE_DATA_SIZE) {
247 last_record_offset -= page_header_->record_size;
248 }
249 }
250
256 char *get_record_data(SlotNum slot_num)
257 {
258 return frame_->data() + page_header_->data_offset + (page_header_->record_size * slot_num);
259 }
260
261protected:
264 Frame *frame_ = nullptr;
265 ReadWriteMode rw_mode_ = ReadWriteMode::READ_WRITE;
267 char *bitmap_ = nullptr;
268 StorageFormat storage_format_;
269 LobFileHandler *lob_handler_ = nullptr;
270
271protected:
272 friend class RecordPageIterator;
273};
274
286{
287public:
288 RowRecordPageHandler() : RecordPageHandler(StorageFormat::ROW_FORMAT) {}
289
290 virtual RC insert_record(const char *data, RID *rid) override;
291
292 virtual RC recover_insert_record(const char *data, const RID &rid) override;
293
294 virtual RC delete_record(const RID *rid) override;
295
296 virtual RC update_record(const RID &rid, const char *data) override;
297
304 virtual RC get_record(const RID &rid, Record &record) override;
305};
306
319{
320public:
321 PaxRecordPageHandler() : RecordPageHandler(StorageFormat::PAX_FORMAT) {}
322
330 virtual RC insert_record(const char *data, RID *rid) override;
331
332 // TODO: insert chunk only used in load_data
333 virtual RC insert_chunk(const Chunk &chunk, int start_row, int &insert_rows) override;
334
335 virtual RC delete_record(const RID *rid) override;
336
344 virtual RC get_record(const RID &rid, Record &record) override;
345
351 virtual RC get_chunk(Chunk &chunk) override;
352
353private:
354 // get the field data by `slot_num` and `column id`
355 char *get_field_data(SlotNum slot_num, int col_id);
356
357 // get the field length by `column id`, all columns are fixed length.
358 int get_field_len(int col_id);
359};
366{
367public:
368 RecordFileHandler(StorageFormat storage_format) : storage_format_(storage_format){};
370
376 RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, TableMeta *table_meta, LobFileHandler *lob_handler);
377
381 void close();
382
388 RC delete_record(const RID *rid);
389
397 RC insert_record(const char *data, int record_size, RID *rid);
398
399 RC insert_chunk(const Chunk &chunk, int record_size);
400
408 RC recover_insert_record(const char *data, int record_size, const RID &rid);
409
410 RC get_record(const RID &rid, Record &record);
411
412 RC visit_record(const RID &rid, function<bool(Record &)> updater);
413
414private:
418 RC init_free_pages();
419
420private:
421 DiskBufferPool *disk_buffer_pool_ = nullptr;
423 unordered_set<PageNum> free_pages_;
425 StorageFormat storage_format_;
426 TableMeta *table_meta_;
427 LobFileHandler *lob_handler_ = nullptr;
428};
429
436{
437public:
438 ChunkFileScanner() = default;
440
441 // TODO: not support filter and transaction
442 RC open_scan_chunk(Table *table, DiskBufferPool &buffer_pool, LogHandler &log_handler, ReadWriteMode mode);
443
447 RC close_scan();
448
452 RC next_chunk(Chunk &chunk);
453
454private:
455 Table *table_ = nullptr;
456
458 LogHandler *log_handler_ = nullptr;
459 ReadWriteMode rw_mode_ = ReadWriteMode::READ_WRITE;
460
463};
用于遍历BufferPool中的所有页面
Definition: disk_buffer_pool.h:168
遍历某个文件中所有记录,每次返回一个 Chunk
Definition: record_manager.h:436
RC next_chunk(Chunk &chunk)
每次调用获取一个页面中的所有记录。
Definition: record_manager.cpp:776
ReadWriteMode rw_mode_
遍历出来的数据,是否可能对它做修改
Definition: record_manager.h:459
Table * table_
当前遍历的是哪张表。
Definition: record_manager.h:455
DiskBufferPool * disk_buffer_pool_
当前访问的文件
Definition: record_manager.h:457
RC close_scan()
关闭一个文件扫描,释放相应的资源
Definition: record_manager.cpp:737
RecordPageHandler * record_page_handler_
处理文件某页面的记录
Definition: record_manager.h:462
BufferPoolIterator bp_iterator_
遍历buffer pool的所有页面
Definition: record_manager.h:461
A Chunk represents a set of columns.
Definition: chunk.h:23
Definition: condition_filter.h:31
BufferPool的实现
Definition: disk_buffer_pool.h:190
页帧
Definition: frame.h:66
管理LOB文件中的 LOB 对象
Definition: lob_handler.h:23
对外提供服务的CLog模块
Definition: log_handler.h:40
负责处理 PAX 存储格式的页面中各种操作
Definition: record_manager.h:319
virtual RC insert_record(const char *data, RID *rid) override
插入一条记录
Definition: record_manager.cpp:424
virtual RC get_chunk(Chunk &chunk) override
以 Chunk 格式获取整个页面中指定列的所有记录。
Definition: record_manager.cpp:475
virtual RC get_record(const RID &rid, Record &record) override
获取指定位置的记录数据
Definition: record_manager.cpp:464
virtual RC delete_record(const RID *rid) override
删除指定的记录
Definition: record_manager.cpp:440
管理整个文件中记录的增删改查
Definition: record_manager.h:366
RC delete_record(const RID *rid)
从指定文件中删除指定槽位的记录
Definition: record_manager.cpp:655
RC recover_insert_record(const char *data, int record_size, const RID &rid)
数据库恢复时,在指定文件指定位置插入数据
Definition: record_manager.cpp:640
RC init_free_pages()
初始化当前没有填满记录的页面,初始化free_pages_成员
Definition: record_manager.cpp:537
LogHandler * log_handler_
记录日志的处理器
Definition: record_manager.h:422
unordered_set< PageNum > free_pages_
没有填充满的页面集合
Definition: record_manager.h:423
RC insert_record(const char *data, int record_size, RID *rid)
插入一个新的记录到指定文件中,并返回该记录的标识符
Definition: record_manager.cpp:568
RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, TableMeta *table_meta, LobFileHandler *lob_handler)
初始化
Definition: record_manager.cpp:508
common::Mutex lock_
当编译时增加-DCONCURRENCY=ON 选项时,才会真正的支持并发
Definition: record_manager.h:424
void close()
关闭,做一些资源清理的工作
Definition: record_manager.cpp:527
Definition: record_log.h:82
负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录
Definition: record_manager.h:127
void fix_record_capacity()
Definition: record_manager.h:242
PageNum get_page_num() const
返回该记录页的页号
Definition: record_manager.cpp:414
RC recover_init(DiskBufferPool &buffer_pool, PageNum page_num)
数据库恢复时,与普通的运行场景有所不同,不做任何并发操作,也不需要加锁
Definition: record_manager.cpp:136
ReadWriteMode rw_mode_
当前的操作是否都是只读的
Definition: record_manager.h:265
RecordLogHandler log_handler_
当前操作的日志处理器
Definition: record_manager.h:263
virtual RC get_chunk(Chunk &chunk)
获取整个页面中指定列的所有记录。
Definition: record_manager.h:223
RC init(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, ReadWriteMode mode, LobFileHandler *lob_handler=nullptr)
初始化
Definition: record_manager.cpp:98
RC cleanup()
操作结束后做的清理工作,比如释放页面、解锁
Definition: record_manager.cpp:260
DiskBufferPool * disk_buffer_pool_
当前操作的buffer pool(文件)
Definition: record_manager.h:262
bool is_full() const
当前页面是否已经没有空闲位置插入新的记录
Definition: record_manager.cpp:422
virtual RC delete_record(const RID *rid)
删除指定的记录
Definition: record_manager.h:201
virtual RC get_record(const RID &rid, Record &record)
获取指定位置的记录数据
Definition: record_manager.h:215
virtual RC recover_insert_record(const char *data, const RID &rid)
数据库恢复时,在指定位置插入数据
Definition: record_manager.h:194
PageHeader * page_header_
当前页面上页面头
Definition: record_manager.h:266
virtual RC insert_record(const char *data, RID *rid)
插入一条记录
Definition: record_manager.h:184
Frame * frame_
当前操作页面关联的frame(frame的更多概念可以参考buffer pool和frame)
Definition: record_manager.h:264
RC init_empty_page(DiskBufferPool &buffer_pool, LogHandler &log_handler, PageNum page_num, int record_size, TableMeta *table_meta, LobFileHandler *lob_handler=nullptr)
对一个新的页面做初始化,初始化关于该页面记录信息的页头PageHeader
Definition: record_manager.cpp:163
char * bitmap_
当前页面上record分配状态信息bitmap内存起始位置
Definition: record_manager.h:267
char * get_record_data(SlotNum slot_num)
获取指定槽位的记录数据
Definition: record_manager.h:256
遍历一个页面中每条记录的iterator
Definition: record_manager.h:85
RC next(Record &record)
读取下一个记录到record中包括RID和数据,并更新下一个记录位置next_slot_num_
Definition: record_manager.cpp:84
bool is_valid() const
Definition: record_manager.h:113
common::Bitmap bitmap_
bitmap 的相关信息可以参考 RecordPageHandler 的说明
Definition: record_manager.h:118
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:119
bool has_next()
判断是否有下一个记录
Definition: record_manager.cpp:82
表示一个记录
Definition: record.h:101
负责处理行存页面中各种操作
Definition: record_manager.h:286
virtual RC recover_insert_record(const char *data, const RID &rid) override
数据库恢复时,在指定位置插入数据
Definition: record_manager.cpp:313
virtual RC delete_record(const RID *rid) override
删除指定的记录
Definition: record_manager.cpp:336
virtual RC insert_record(const char *data, RID *rid) override
插入一条记录
Definition: record_manager.cpp:275
virtual RC get_record(const RID &rid, Record &record) override
获取指定位置的记录数据
Definition: record_manager.cpp:395
表元数据
Definition: table_meta.h:29
Definition: table.h:44
事务接口
Definition: trx.h:141
Definition: bitmap.h:20
Definition: mutex.h:268
数据文件,按照页面来组织,每一页都存放一些记录/数据行
Definition: record_manager.h:68
int32_t record_size
每条记录占用实际空间大小(可能对齐)
Definition: record_manager.h:72
int32_t record_capacity
最大记录个数
Definition: record_manager.h:73
int32_t record_num
当前页面记录的个数
Definition: record_manager.h:69
int32_t record_real_size
每条记录的实际大小
Definition: record_manager.h:71
int32_t col_idx_offset
列索引偏移量
Definition: record_manager.h:74
int32_t column_num
当前页面记录所包含的列数
Definition: record_manager.h:70
int32_t data_offset
第一条记录的偏移量
Definition: record_manager.h:75
标识一个记录的位置 一个记录是放在某个文件的某个页面的某个槽位。这里不记录文件信息,记录页面和槽位信息
Definition: record.h:35