1
0
mirror of https://github.com/fumiama/fumidb.git synced 2026-06-05 08:40:30 +08:00
Files
fumidb/api/dbfile.md
2022-04-26 15:58:02 +08:00

4.5 KiB
Raw Blame History

数据库文件格式

fumidb的数据库文件扩展名一般为.fdb,不做强制要求

由于文件内普遍以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字节。

0                   8                  16
┌───────────────────┬───────────────────┐
│     FUMIDB\1\0    │ ptr of unused blk │
├───────────────────┼───────────────────┤
│ ptr of first 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 │
├───────────────────┴───────────────────┤
│    ......      ......      ......     │
├───────────────────────────────────────┤
│ some possible padding to fit 4096Byte │
├───────────────────────────────────────┤
│            data blocks ...            │
└───────────────────────────────────────┘

空闲块

链表格式

对于空闲块其开头将有一个8字节指针指向下一块空闲块没有则置0。第一块未被使用的空闲块的指针被记录在文在最开头的ptr of unused blk同样没有则置0。对于除了文件头之外的每个空闲块指针在指针之后紧跟一个uint16的数字指示了本块空闲块的长度以字节为单位该长度包括指针和数字。因此能加入链表的空闲块最短应为10字节小于这个长度的未被使用部分将不再使用。

新建

空闲块不会被主动新建,而是源于分配时富余的部分以及删除后的剩余。

合并

受限于记录长度的数字为uint16一块未被使用的空闲空间大小最大为65535,一般则不使其超过32768。如果确有连续的超过32768字节的空闲,应当划分为多个块。特别地,如果确有连续的超过32768字节的空闲且其后的空间不足4096字节,应当适当减小前一块的大小,使后一块大小超过4096字节。

使用

使用时优先从第一个块遍历比较其大小以及页对齐是否符合要求。当使用后仍有剩余对于小于10字节的块直接舍弃不用否则更新块大小与相关链表指针。

新建

在新建表时将计算表头大小,优先选取一块未被使用的足够大的对齐部分写入表头。当找不到时,在文件末尾附加表头(留出新的对齐)。接下来将上一个表头开头的下一个表头的指针指向新表头的开头,然后建立相应数据结构,填充表头字段。

修改

一旦创建数据表,将不支持修改。可以先删除表再重新创建,但这样数据将会丢失。

删除

根据表头遍历所有表项,回收空间到空闲块,然后再回收表头,更新表头链表的指针,完成删除。