
实现一个简单的Database9(译文)
译注:cstack在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第九篇,主要是实现B-tree的二叉搜索并解决主键重复问题
Part 9 二叉搜索与主键重复
上次注意到我们的 B 树存储 key 时仍然是非排序的。现在我们来解决这个问题,并检测和拒绝主键的重复(插入)。
现在我们的 execute_insert() 函数在插入时,选择的位置是在表的结尾处。作为替换,我们需要搜索表(树)中正确的插入位置,然后把 key 插入到这个位置上。如果 key 在这个位置上已经存在,那么就返回(键重复)报错。
这样的话,我们就不再需要 table_end() 函数了。
我们用一个方法替换 table_end() 函数,方法实现使用给定的 key 来搜索 Btree。
我先把内部节点实现的分支存根,因为我还没有实现内部节点(internal node)。我们可以在叶子节点中使用二叉搜索法来进行搜索。
这将返回:
- key 的位置
- 如果我们需要插入一个新的 key,需要移动 key 的话,返回这个 key 的位置
- 超出最后一个 key 的位置
因为我们现在会检查节点的类型,所以需要一个函数在节点中获取和设置节点的类型值。
需要先把值转为 uint8_t 类型来确保它作为一个序列化的单字节。 还需要初始化节点的类型。
最后,我们需要创建并处理一个新的错误码。
有了这些修改,我们的测试可以更改为检查排序顺序:
并且我们能够为重复键增加一个新的测试:
就是这样!接下来:实现拆分叶节点和创建内部节点。
Enjoy GreatSQL :)
文章转载自公众号: GreatSQL社区
