MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
一个DB实例负责管理一批表 更多...
#include <db.h>
Public 成员函数 | |
RC | init (const char *name, const char *dbpath, const char *trx_kit_name, const char *log_handler_name) |
初始化一个数据库实例 更多... | |
RC | create_table (const char *table_name, span< const AttrInfoSqlNode > attributes, const StorageFormat storage_format=StorageFormat::ROW_FORMAT, const StorageEngine storage_engine=StorageEngine::HEAP) |
创建一个表 更多... | |
Table * | find_table (const char *table_name) const |
根据表名查找表 | |
Table * | find_table (int32_t table_id) const |
根据表ID查找表 | |
const char * | name () const |
当前数据库的名称 | |
void | all_tables (vector< string > &table_names) const |
列出所有的表 | |
RC | sync () |
将所有内存中的数据,刷新到磁盘中。 更多... | |
LogHandler & | log_handler () |
获取当前数据库的日志处理器 | |
BufferPoolManager & | buffer_pool_manager () |
获取当前数据库的buffer pool管理器 | |
TrxKit & | trx_kit () |
获取当前数据库的事务管理器 | |
string | path () const |
oceanbase::ObLsm * | lsm () |
Private 属性 | |
string | name_ |
数据库名称 | |
string | path_ |
数据库文件存放的目录 | |
unordered_map< string, Table * > | opened_tables_ |
当前所有打开的表 | |
unique_ptr< BufferPoolManager > | buffer_pool_manager_ |
当前数据库的buffer pool管理器 | |
unique_ptr< LogHandler > | log_handler_ |
当前数据库的日志处理器 | |
unique_ptr< TrxKit > | trx_kit_ |
当前数据库的事务管理器 | |
oceanbase::ObLsm * | lsm_ |
当前数据库的 LSM-Tree 存储引擎 | |
int32_t | next_table_id_ = 0 |
给每个table都分配一个ID,用来记录日志。这里假设所有的DDL都不会并发操作,所以相关的数据都不上锁 | |
LSN | check_point_lsn_ = 0 |
当前数据库的检查点LSN。会记录到磁盘中。 | |
一个DB实例负责管理一批表
当前DB的存储模式很简单,一个DB对应一个目录,所有的表和数据都放置在这个目录下。 启动时,从指定的目录下加载所有的表和元数据。 一个DB实例会有一个BufferPoolManager,用来管理所有的数据页,以及一个LogHandler,用来管理所有的日志。 这样也就约束了事务不能跨DB。buffer pool的内存管理控制也不能跨越Db。 也可以使用MiniOB非常容易模拟分布式事务,创建两个数据库,然后写一个分布式事务管理器。
NOTE: 数据库对象没有做完整的并发控制。比如在查找某张表的同时删除这个表,会引起访问冲突。这个控制是由使用者 来控制的。如果要完整的实现并发控制,需要实现表锁或类似的机制。
RC Db::create_table | ( | const char * | table_name, |
span< const AttrInfoSqlNode > | attributes, | ||
const StorageFormat | storage_format = StorageFormat::ROW_FORMAT , |
||
const StorageEngine | storage_engine = StorageEngine::HEAP |
||
) |
创建一个表
table_name | 表名 |
attributes | 表的属性 |
storage_format | 表的存储格式 |
RC Db::init | ( | const char * | name, |
const char * | dbpath, | ||
const char * | trx_kit_name, | ||
const char * | log_handler_name | ||
) |
初始化一个数据库实例
从指定的目录下加载指定名称的数据库。这里就会加载dbpath目录下的数据。
name | 数据库名称 |
dbpath | 当前数据库放在哪个目录下 |
trx_kit_name | 使用哪种类型的事务模型 |
RC Db::sync | ( | ) |
将所有内存中的数据,刷新到磁盘中。
注意,这里也没有并发控制,需要由上层来保证当前没有正在进行的事务。