From fae3641fabd8999a0c662c638495a3ead75dfe05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 3 May 2022 21:33:00 +0800 Subject: [PATCH] edit doc --- api/index.md | 2 +- api/table.md | 5 ++++- api/types.md | 4 ++-- src/table.c | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/api/index.md b/api/index.md index fe7acc3..bb08fc5 100644 --- a/api/index.md +++ b/api/index.md @@ -94,4 +94,4 @@ ## string > 查找速度为O(logn) -先将其哈希为int64再按int64进行查找。冲突时根据string表项附带存储的[下一个哈希相同的数据项的指针(uint64)](/api/types.md#字符串)进行遍历。 +先将其哈希为int64再按int64进行查找。具体哈希方法为取字符串`md5`的前8位作为小段`uint64`。冲突时,根据string表项附带存储的[下一个哈希相同的数据项的指针(uint64)](/api/types.md#字符串)可依次遍历到所有项目,然后找到真正与查询内容相同的项。 diff --git a/api/table.md b/api/table.md index 42fa2c6..04b7112 100644 --- a/api/table.md +++ b/api/table.md @@ -1,6 +1,6 @@ # 数据表格式 ## 表头 -如下所示,加上文件中附加的`ptr of next table`,表头永远是`4k`对齐的,其中行类型列表的No.1自动成为主键,强制应用`unique`+`nonnull`类型修饰符;`data blocks`可以为任意数据,如索引,表项等。由于数据块均为定长,增加时直接添加或重用已删除区块,修改时直接覆盖,删除时直接在索引中移除该项,将块首地址附加到已删除块的链表即可。 +如下所示,加上文件中附加的`ptr of next table`,表头永远是`4k`对齐的,且长度不超过一页,其中行类型列表的No.1自动成为主键,强制应用`unique`+`nonnull`类型修饰符;`data blocks`可以为任意数据,如索引,表项等。增加时直接添加或重用已删除区块,修改时直接覆盖,删除时直接在索引中移除该项,将块首地址附加到已删除块的链表即可。 ``` ┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐ │ 0 - 7 │ 8 - 15 │ 16 -- 23 │ 24 -- 31 │ 32 -- 39 │ 40 -- 47 │ 48 -- 55 │ 56 -- 63 │ @@ -32,6 +32,9 @@ 详见[索引格式](/api/index.md)。 ### 表项 > 区块长度固定,为`8+len(row 1)+len(row 2)+...+len(row N)`字节 + +> 由于存在可变长的 string 和 binary,不同区块长度有可能不同 + 为方便遍历,数据表项以uint64的指针开头,代表下一项的地址。接下来按照[数据类型](/api/types.md)中规定的存储格式依次附加第一项、第二项直到第N项的值。 #### 表项的增加 优先附加到上一个表项末尾。如无法实现,则从空区块选取一个,或附加到整个文件末尾。 diff --git a/api/types.md b/api/types.md index 3156648..181f1ba 100644 --- a/api/types.md +++ b/api/types.md @@ -15,14 +15,14 @@ | 5 | double | 直接存储 | ## 字符串 -> 字符串为定长的带索引的字节数组,长度最大不超过uint32(65535字节)。 +> 字符串为变长的可索引的字节数组,长度最大不超过uint32(65535字节)。 ### 类型列表 | 类型代号 | 类型 | 存储方式 | | --- | --- | --- | | 6 | string | 下一个哈希相同的数据项的指针+uint32长度+该长度的数据(字节数组) | ## 二进制数据块 -> 二进制数据块为定长(不超过uint64)的不参与索引的字节数组。 +> 二进制数据块为变长的不参与索引的字节数组,长度最大不超过uint64。 ### 类型列表 | 类型代号 | 类型 | 存储方式 | | --- | --- | --- | diff --git a/src/table.c b/src/table.c index dd2201b..91b3208 100644 --- a/src/table.c +++ b/src/table.c @@ -115,7 +115,7 @@ void* create_table(int fd, char* buf, const char* name, uint16_t row_len, ...) { va_end(list); len += (int)row_len*(8+1) + 8*foreign_cnt; - if(len > PAGESZ-2) { + if(len > PAGESZ) { errno = EFBIG; return NULL; }