1
0
mirror of https://github.com/fumiama/fumidb.git synced 2026-06-05 00:32:44 +08:00

finish page & file

This commit is contained in:
源文雨
2022-05-01 17:42:11 +08:00
parent 1463c1f606
commit eda10fba91
8 changed files with 546 additions and 35 deletions

View File

@@ -3,23 +3,21 @@
由于文件内普遍以uint64作为指针因此理论最大支持文件大小为`16384PB`,在现有条件下完全足够使用。
## 文件头
文件最开头填充了固定的8字节ascii编码`FUMIDB\1\0`。前6字节必须为`FUMIDB`,表明本文件为`fumidb`数据库文件格式。7, 8字节`\1\0`作为数据库的版本是一个小端的uint16在这里表示第1版之后将依次递增。今后可能会在文件头增加更多字段,由于其后的`ptr of first table`不一定要求其指向的第一个表头紧跟文件头,字段的增加将不影响之前版本的解析。在目前实现时,为`possible other header data`空出16字节
文件最开头填充了固定的8字节ascii编码`FUMIDB\1\0`。前6字节必须为`FUMIDB`,表明本文件为`fumidb`数据库文件格式。7, 8字节`\1\0`作为数据库的版本是一个小端的uint16在这里表示第1版之后将依次递增。今后可能会在文件头增加更多字段。
```
0 8 16
┌───────────────────┬───────────────────┐
│ FUMIDB\1\0 │ ptr of unused blk │
├───────────────────┼───────────────────┤
│ ptr of first table│ ptr of next table
│ ptr of next table ...... ......
├───────────────────┴───────────────────┤
│ possible other header data │
├───────────────────────────────────────┤
│ first table head │
├───────────────────────────────────────┤
│ ...... ...... ...... │
├───────────────────────────────────────┤
│ some possible padding to fit 4096Byte │
├───────────────────┬───────────────────┤
│ ptr of next table │ second table head │
│ ptr of next table │ first table head
├───────────────────┴───────────────────┤
│ ...... ...... ...... │
├───────────────────────────────────────┤
@@ -34,12 +32,12 @@
#### 新建
空闲块不会被主动新建,而是源于分配时富余的部分以及删除后的剩余。
#### 合并
受限于记录长度的数字为uint16一块未被使用的空闲空间大小最大为`65535`,实际使用时不使其超过`4096`。如果确有连续的超过`4096`字节的空闲,应当划分为多个块。块应当是`4k`对齐的。
受限于记录长度的数字为uint16一块未被使用的空闲空间大小最大为`65535`,实际使用时不使其超过`4096`。如果确有连续的超过`4096`字节的空闲,应当划分为多个块。`4096`字节的块应当是`4k`对齐的。
#### 使用
使用时优先从第一个块遍历比较其大小以及页对齐是否符合要求。当使用后仍有剩余对于小于10字节的块直接舍弃不用否则更新块大小与相关链表指针。
### 表
#### 新建
在新建表时将计算表头大小,优先选取一块未被使用的足够大的对齐部分写入表头。当找不到时,在文件末尾附加表头(留出新的对齐)。接下来将上一个表头开头的`下一个表头的指针`指向新表头的开头,然后建立相应数据结构,填充表头字段。
在新建表时将计算表头大小,优先选取一块未被使用的足够大的`4k`对齐部分写入表头。当找不到时,在文件末尾附加表头(留出新的对齐)。接下来将上一个表头开头的`下一个表头的指针`指向新表头的开头,然后建立相应数据结构,填充表头字段。
#### 修改
一旦创建数据表,将不支持修改。可以先删除表再重新创建,但这样数据将会丢失。
#### 删除