实现内存中的最简单的数据表
首先要解释一下所谓最简单的数据表的定义,它满足以下几个功能:
- 支持两种操作:插入一行,打印所有行
- 仅驻留在内存中(对磁盘没有持久性)
- 支持单个硬编码表,所谓硬编码,即将数据直接写在代码(程序)中。
硬编码格式如下:
column | type |
---|---|
id | integer |
username | varchar(32) |
varchar(255) |
本次新增分页组件,但我们先从最简单的开始。以数组方式紧凑的分页,而不是使用B树,分页方法如下:
- 将行存储在称为页的内存块中
- 每个页面存储尽可能多的行
- 每行将行序列化为紧凑的表示形式
- 页面仅根据需要分配
- 保留指向页面的固定大小的指针数组
为了能够顺利地向内存写入数据,我们需要先定义一些常量核函数如下
//定义一个宏指令,实现读取Struct->Attribute类型的内存空间大小
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
//定义字段所占内存大小
const uint32_t ID_SIZE = size_of_attribute(Row, id);
const uint32_t EMAIL_SIZE = size_of_attribute(Row, email);
const uint32_t USERNAME_SIZE = size_of_attribute(Row, username);
//定义字段起始位置
const uint32_t ID_OFFSET = 0;
#define USERNAME_OFFSET ID_OFFSET+ID_SIZE
#define EMAIL_OFFSET USERNAME_OFFSET+USERNAME_SIZE
#define ROW_SIZE ID_SIZE+USERNAME_SIZE+EMAIL_SIZE
//定义分页属性
const uint32_t PAGE_SIZE = 4096;
#define TABLE_MAX_PAGES 100
#define ROWS_PER_PAGE PAGE_SIZE/ROW_SIZE
#define TABLE_MAX_ROWS ROWS_PER_PAGE*TABLE_MAX_PAGES
定义表的结构和显示功能:
//定义数据表结构:行数,页
typedef struct {
uint32_t num_rows;
void* pages[TABLE_MAX_PAGES];
}Table;
//创建新表
Table* new_table() {
Table* table = malloc(sizeof(Table));
table->num_rows = 0;
for (uint32_t i = 0; i < TABLE_MAX_PAGES; i++) {
table->pages[i] = NULL;
}
return table;