
实现一个简单的Database6(译文)
Part 6 游标抽象
跟上一节相比,这一节篇幅相对要简短的多。我们只是稍微重构一下,这样就可以让开始实现B-tree更简单一些。
在代码中新添加一个Cursor对象,它用来代表表中的一个位置(location)。
你可能希望对游标执行的操作:
- 在表开头时创建一个游标
- 在表结尾时创建一个游标
- 访问游标指向的行
- 将游标移动到下一行
这就是我们将要实现的游标的一些行为。然后,我们还想做到:
- 删除游标指向的一行数据
- 修改游标指向的一行数据
- 使用给定的ID搜索一张表,并创建一个游标指向这个ID所在的行
译注:这里简单介绍一下游标,Cursor原本就有箭头、光标的意思,用来指示事物以示关注。游标是数据的一种访问机制,一种处理数据的方法,例如查询返回的结果是一行或者多行的结果集(这已经是SQL被处理后的结果集),我们需要对结果集进行查询,sql语句就不管用了,因为这已经是返回的结果集了,这个时候就需要用游标来遍历这个返回的结果集了。可以理解游标是一个指向Row的指针,访问一行后,游标就会指向下一行。例如 fetchone()
、fetchall()
等函数就是通过游标来访问结果集的,返回具体一行或者多行的数据。下面是游标图示:
不磨叽了,下面就是Cursor类型结构:
根据现在我们的表数据结构,只需要行号即可识别表中的位置。
游标所属的表,游标对它还有一个引用(所以我们的游标函数还可以仅仅把游标作为参数)。
最后,它还有一个boolean类型的属性叫做 end_of_table 。这样我们就可以用来表示表结尾之后的位置(在这里我们可能会插入一个新行)。
table_start()
和 table_end()
创建一个新的游标:
我们的 row_slot()
函数要变成 cursor_value()
了,它返回一个指针类型,指向游标描述的位置:
在我们当前的表结构中推进游标就像让行号递增一样简单。这在B-tree中会有一点小复杂。
最后我们就能改变我们的“虚拟机”方法来使用游标抽象了。当插入一行数据时,我们在表结尾打开一个游标,写入这个游标的位置,然后关闭游标。
当查询表中的所有行时,我们在表的开头打开一个游标,打印行数据,然后推进游标到下一行,重复这个过程直到表的结尾。
好了,就是它!就像我说的,这是短小的重构,应该能够有助于我们把表的数据结构重写为B-tree。execute_select()
和 execute_insert()
函数完全可以通过游标来与表交互,而对于表的存储方式不需要假设任何事情。
译注:在之前实现数据库的page组织方式的代码中,作者使用数组(array)来组织数据页page,主要是考虑快速实现存放数据,没有考虑性能优化。后面会使用B-tree来进行重构,而在此之前,先实现了游标。
这是于上一部分对比,代码的不同:
文章转载自公众号:GreatSQL社区
