從這一節開始,我們要準備在我們的資料庫中使用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 或者動態的新增元...