简单数据库实现——Part1 - REPL的简介和设置

Part1 - REPL的简介和设置

思考目录中的问题——简而言之就是数据库是如何工作的。为了搞清楚这些问题,我正在从头开始编写一个数据库,它模仿了sqlite,因此它更小而且功能更少。整个数据库被存储在一个文件中(便于理解)。

sqlite

sqlite的网站上有很多文档,这里我给出一个sqlite的设计与实现的架构图。
sqlite architecture
一个查询(query)通过一系列的组件来实现检索或修改数据。
前端(front-end) 组成:

  • 分词器(tokenizer)
  • 语法分析器(parser)
  • 代码生成器(code generator)

前端的输入是一个SQL查询,输出是sqlite虚拟机字节码(实际上是一个可以对数据库进行操作的的已编译程序)

后端(back-end) 组成:

  • 虚拟机(virtual machine)
  • B树(B-tree)
  • 寻呼机(pager)
  • 操作系统接口(os interface)

虚拟机 以前端生成的字节码作为指令。然后它可以对一个或多个表索引执行操作,每个表或索引都存储在称为B树的数据结构中。虚拟机本质上是一个关于字节码指令类型的大型switch语句。

每个 B树 由许多节点组成,每个节点的长度为一页。B树可以从磁盘检索页面,也可以通过向寻呼机发出命令将其保存回磁盘。

寻呼机 接受命令以读取或写入数据页。它负责以适当的偏移量在数据库文件中进行读取/写入。它还在内存中保留了最近访问页面的缓存,并确定何时需要将这些页面写回到磁盘。

操作系统接口 是根据不同的操作系统对sqlite进行不同的编译的层。本教程中,将不支持多平台。

让我们从更直接的东西开始:REPL。

实现一个简单的REPL

从命令行启动时,sqlite将会启动一个“读取-执行-打印”的循环(这个就是REPL)

~ sqlite3
SQLite version 3.16.0 2016-11-04 19:09:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> create table users (id int, username varchar(255), email varchar(255));
sqlite> .tables
users
sqlite> .exit
~

所以我们的主函数将有一个无限循环,它打印提示符,获取一行输入,然后处理这一行输入。

int main(int argc, char* argv[]) {
   
  InputBuffer* input_buffer = new_input_buffer();
  // 无限循环
  while (true) {
   
  	// 打印提示符
    print_prompt();
    // 获取一行输入
    read_input(input_buffer);

	// 处理这一行输入,为.exit时退出
    if (strcmp(input_buffer->buffer, ".exit") == 0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值