SQLite轉殖 第五步 游標抽象

2021-10-06 13:30:30 字數 1699 閱讀 8868

從這一節開始,我們要準備在我們的資料庫中使用b-tree資料結構來存放資料便於加快檢索速度。首先我們需要引入乙個概念:游標(cursor)。我們利用游標來表示資料表內的位置。

我們利用游標可以實現:

這是我們目前需要實現的功能。在接下的步驟中,我們還希望可以實現:

首先我們來看一下游標的結構:

+

typedef

struct

cursor;

我們在初始化乙個游標的時候,將資料表的位址賦值給cursor->table,此時的游標就有了表的結構可以直接使用cursor->table來呼叫資料表。為了適配序列化和反序列化兩種情況,我們的游標也應該分兩種情況初始化:

//反序列化時的初始化:將游標定位到記憶體第0行資料可以按行順序讀取資料(記憶體->螢幕)

+cursor*

table_start

(table* table)

//序列化時的初始化:將游標定位到標的最後一行空行,方便將資料存入(記憶體->檔案)

+cursor*

table_end

(table* table)

我們之前有個函式row_slot(),作用是返回當前行的物理記憶體位址。當我們引入游標後,我們需要對它進行修改,而cursor可以呼叫表結構,所以我們形參只需要cursor就夠了。

-

void

*row_slot

(table* table, uint32_t row_num)

+

void

cursor_advance

(cursor* cursor)

+}

在之前的情況下,我們的虛擬機器實現insert是通過row_slot(),而引入游標後變為cursor_value(),所以需要對row_to_insert()函式進行調整:

row* row_to_insert =

&(statement->row_to_insert)

;+ cursor* cursor =

table_end

(table)

;//呼叫游標需要先初始化游標

-serialize_row

(row_to_insert,

row_slot

(table, table->num_rows));

+serialize_row

(row_to_insert,

cursor_value

(cursor));

//使用游標完成序列化

table->num_rows +=1

;//資料表行數在insert之後加1

+free

(cursor)

;//釋放游標記憶體

return execute_success;

}

出於和insert同樣的原因,我們還需要調節實現select的函式:

executeresult execute_select

(statement* statement, table* table)

+free

(cursor)

;return execute_success;

}

Hibernate入門案例 第五步 實現新增操作

hibernate入門案例 第一步 搭建hibernate環境 hibernate入門案例 第二步 第二步,建立實體類和表 hibernate入門案例 第三步 配置實體類和資料庫一一對應關係 對映關係 hibernate入門案例 第四步 建立hibernate的核心配置檔案 hibernate入門案...

第五步 整合SpringTask(實現定時任務)

1 新增依賴 由於springtask已經存在於spring框架中,不需要額外新增依賴 2 新增spring task配置package com.hzf.mymall.config import org.springframework.context.annotation.configuration...

ExtJS學習之路第五步 認識最常見元件Panel

文件中描述 panel 面板 是乙個容器,它具有特定的功能和結構部件,這使它成為面向應用使用者介面的完美基石。面板,繼承自ext.container.container,能夠配置布局以及子元件 child components 當向panel中新增指定的子項 child items 或者動態的新增元...