|
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, const char *storage_engine="heap") |
| 初始化一个数据库实例 更多... | |
| RC | create_table (const char *table_name, span< const AttrInfoSqlNode > attributes, const vector< string > &primary_keys, const StorageFormat storage_format=StorageFormat::ROW_FORMAT) |
| 创建一个表 更多... | |
| 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。会记录到磁盘中。 | |
| string | storage_engine_ |
一个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 vector< string > & | primary_keys, | ||
| const StorageFormat | storage_format = StorageFormat::ROW_FORMAT |
||
| ) |
创建一个表
| table_name | 表名 |
| attributes | 表的属性 |
| storage_format | 表的存储格式 |
| RC Db::init | ( | const char * | name, |
| const char * | dbpath, | ||
| const char * | trx_kit_name, | ||
| const char * | log_handler_name, | ||
| const char * | storage_engine = "heap" |
||
| ) |
初始化一个数据库实例
从指定的目录下加载指定名称的数据库。这里就会加载dbpath目录下的数据。
| name | 数据库名称 |
| dbpath | 当前数据库放在哪个目录下 |
| trx_kit_name | 使用哪种类型的事务模型 |
| storage_engine | 存储引擎,目前只支持heap table 和 lsm-tree 两种 |
| RC Db::sync | ( | ) |
将所有内存中的数据,刷新到磁盘中。
注意,这里也没有并发控制,需要由上层来保证当前没有正在进行的事务。