是否有任何库提供基于磁盘的 B+-tree 实现,专门设计用于所有键具有固定大小且所有值也具有固定大小(不一定与键具有相同的固定大小)的场景?
注意:是的,我想实现另一个玩具,概念验证 RDBMS。我不使用 SQL DBMS是有充分理由的。笔记结束。
我并不特别介意这个库是用什么语言编写的。但是,我确实对库的功能有一些特定的要求。为了清楚起见,这些要求将通过用 C 编写的示例来说明。
该库必须足够灵活,以允许我使用自己的比较函数。例如:
struct comparer
{
void * extra;
int (*function)(
void *, // closure over extra
char *, // 1st value to be compared
char * // 2nd value to be compared
);
};
应该如何操作索引文件的机制由所有键的固定长度、所有值的固定长度以及键的比较函数定义。例如:
struct index_spec
{
size_t keylen, vallen; // fixed lengths for keys and values
struct comparer comp; // comparison function for keys
};
如果库建立了可查询索引和可更新索引之间的区别,以及在预期可查询索引时使用可更新索引的机制,这将是一个非常好的接触(尽管不是强制性的),但不是相反。例如:
struct queryable_index
{
struct index_spec spec;
FILE * file; // opened in read mode
};
struct updateable_index
{
struct index_spec spec;
FILE * file; // opened in read/write mode
};
struct queryable_index open_queryable_index
(struct index_spec, const char *);
struct updateable_index open_updateable_index
(struct index_spec spec, const char * filename);
struct queryable_index just_queryable_index
(struct updateable_index index)
{
struct queryable_index result;
result.spec = index.spec;
result.file = index.file;
return result;
}