github地址:https://github.com/viktorika/vDB.git
参考资料
这份代码是参考APUE写的,采用的结构跟书里是一模一样,不一样的只是代码风格以及部分细节上的区别,所以本文下面所说的实现则是解释一下APUE是怎么做的。
数据库文件类型
首先得讲讲这个数据库会生成两个文件。
1.索引文件.idx
2.数据文件.dat
数据库文件存储结构
再来讲讲里面的结构,索引文件采用的是hash表结构。采用链表来解决冲突,所以每个节点都会有一个指针会指向下一个节点,这个指针在文件中表现为偏移量,这里我们统一称呼它为ptr结构。
首先我们将.idx文件分成两部分
1.前半部分,空闲链表头节点+hash表所有节点的头节点
2.后半部分,一个个index记录,不管是空闲的节点还是非空闲的节点他们都是一个index记录。
假设我们一 个ptr的大小为ptr_size,hash表的大小为hash_table_size,那么前半部分占用的字节数就为(hash_table_size + 1) * ptr_size。
这里我们表示空白的话是用空白符' '来填充的。
再来说说一个index记录的结构
这个记录我们分成三部分
1.刚刚所说的ptr。
2.真正index记录的长度(长度是用固定字节数的所以无需分隔符,这个字节数用index_size来代替)。
3.真正的index记录。
真正的index记录的格式是这样的:
xxx:xxx:xxx\n
':'符号为分隔符,\n是终止符,每条记录最后都是有\n来终止的,data记录也是一样的。
通过':'符号分成了三部分。
1.key。
2.data在.dat文件中的偏移量。
3.data的偏移量。
这就是一个完整的index记录。
最后说一下data记录
这个其实没什么好说的了,就是每条记录都由\n来隔开。
具体实现请到github上自行看代码,已经做了详细的注释。