主要观点:
- 开发者常使用数据库,本文系列通过从零构建 SQLite 兼容数据库来解释数据库工作原理,代码示例用 Rust 编写,鼓励用自己喜欢的语言。
- 先实现最简单的“tables”命令,需深入研究 SQLite 文件格式,构建了包含两个表的测试数据库。
- 介绍了 SQLite 文件格式,数据库存储在单个文件中,文件分为页面,首 100 字节为数据库头,包含页面大小等信息,先关注页面大小,后续只关注“table btree leaf”页面。
- 实现了“Pager”结构体来读取和缓存数据库文件中的页面,需先从数据库头读取页面大小。
- 解析“table btree-leaf”页面,包括页面头和单元格指针等信息,定义了相关枚举和结构体。
- 读取 varint 时要注意字节处理和长度限制,实现了“Pager”结构体的加载页面功能。
- 介绍了 SQLite 记录格式,用于解码单元格的值,定义了“Value”类型和“Cursor”结构体来处理记录。
- 实现了“Scanner”结构体用于遍历页面的记录。
- 定义“Db”结构体来保存全局状态,实现了基本的 REPL 支持“tables”命令,可列出数据库中的表。
关键信息:
- Rust 语言,“cargo add anyhow”添加依赖。
- SQLite 文件格式相关信息,如页面大小、页面类型等。
- “Pager”、“TableLeafPage”等结构体及相关函数的实现。
- 记录格式及相关解析函数。
- “Value”、“Cursor”、“Scanner”等结构体的定义和功能。
- “Db”结构体及相关操作。
重要细节:
- 最大页面大小用 1 表示,检查页面大小是否为 2 的幂的表达式。
- “table btree-leaf”页面头的各个字段含义及解析。
- varint 的读取方式和特殊情况处理。
- “Db”结构体中从文件读取数据库头并创建“Pager”。
- REPL 中对不同命令的处理及列出表的逻辑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。