实现一个简单的Database6(译文)


  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。


前文回顾

实现一个简单的Database1(译文)

实现一个简单的Database2(译文)

实现一个简单的Database3(译文)

实现一个简单的Database4(译文)

实现一个简单的Database5(译文)


译注:cstsck在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第六篇,主要是实现数据持久化游标

Part 6 游标抽象

跟上一节相比,这一节篇幅相对要简短的多。我们只是稍微重构一下,这样就可以让开始实现B-tree更简单一些。  

在代码中新添加一个Cursor对象,它用来代表表中的一个位置(location)。  

你可能希望对游标执行的操作:

  • 在表开头时创建一个游标
  • 在表结尾时创建一个游标
  • 访问游标指向的行
  • 将游标移动到下一行

这就是我们将要实现的游标的一些行为。然后,我们还想做到:

  • 删除游标指向的一行数据
  • 修改游标指向的一行数据
  • 使用给定的ID搜索一张表,并创建一个游标指向这个ID所在的行

_译注:这里简单介绍一下游标,Cursor原本就有箭头、光标的意思,用来指示事物以示关注。游标是数据的一种访问机制,一种处理数据的方法,例如查询返回的结果是一行或者多行的结果集(这已经是SQL被处理后的结果集),我们需要对结果集进行查询,sql语句就不管用了,因为这已经是返回的结果集了,这个时候就需要用游标来遍历这个返回的结果集了。可以理解游标是一个指向Row的指针,访问一行后,游标就会指向下一行。例如 fetchone()、fetchall() 等函数就是通过游标来访问结果集的,返回具体一行或者多行的数据。下面是游标图示:  

不磨叽了,下面就是Cursor类型结构:

+typedef struct { + Table* table; + uint32_t row_num; + bool end_of_table; // Indicates a position one past the last element +} Cursor;