簡單資料庫實現 Part9 二分搜尋和重複鍵

2021-10-02 12:38:58 字數 2262 閱讀 8002

上一部分我們的資料仍然沒有排序,這個部分我們會修復這個問題,並檢測和拒絕重複的鍵。

現在,我們的execute_insert()函式總是在表的最後插入。而實際上我們應該在表中找到正確的位置插入,並且如果鍵已經存在,應該返回乙個錯誤。

executeresult execute_insert

(statement* statement, table* table)

row* row_to_insert =

&(statement->row_to_insert)

;- cursor* cursor =

table_end

(table)

;+ uint32_t key_to_insert = row_to_insert->id;

+ cursor* cursor =

table_find

(table, key_to_insert);+

+if(cursor->cell_num < num_cells)+}

leaf_node_insert

(cursor, row_to_insert->id, row_to_insert)

;

我們不再需要table_end()這個函式。

-cursor*

table_end

(table* table)

我們將會用乙個新的方法來替換它,這個新方法以給定的鍵在樹中搜尋位置。

+

/*+return the position of the given key.

+if the key is not present, return the position

+where it should be inserted

+*/+cursor*

table_find

(table* table, uint32_t key)

else

+}

因為我們還沒有實現內部節點,所以我們可以直接用二分查詢來查詢葉節點。

+cursor*

leaf_node_find

(table* table, uint32_t page_num, uint32_t key)+if

(key < key_at_index)

else+}

++ cursor->cell_num = min_index;

+return cursor;

+}

這個函式會返回:

因為我們現在正在檢查節點型別,所以我們需要函式來獲取和設定節點中的值。

+nodetype get_node_type

(void

* node)++

void

set_node_type

(void

* node, nodetype type)

我們首先要轉換為uint8_t來確保序列化(serialized)成乙個位元組(byte)。我們還需要初始化節點型別。

-

void

initialize_leaf_node

(void

* node)

+void

initialize_leaf_node

(void

* node)

最後,我們需要新增乙個錯誤碼。

-

enum executeresult_t ;+

enum executeresult_t

;

case

(execute_success)

:printf

("executed.\n");

break;+

case

(execute_duplicate_key):+

printf

("error: duplicate key.\n");

+break

;case

(execute_table_full)

:printf

("error: table full.\n");

break

;

下一部分,我們將會**(split)節點並建立內部節點。

簡單資料庫實現 Part6 游標抽象

這部分只是做了一些重構,使更容易實現b樹。我們將要新增乙個表示表中某個位置的游標 cursor 物件。你可以對它進行如下操作 之後我們還要實現的 下面是游標結構體 typedef struct cursor 我們目前的表 table 資料結構,只需要知道行號就可以確定位置,所以游標資料結構中含有行號...

java semphore實現 簡單資料庫連線池

首先我們先介紹一下什麼是訊號量 類似於我們去公共澡堂洗澡,需要先去前台付款拿到儲物櫃的鑰匙,如過沒有空閒的儲物櫃,我們就需要一直等待,直到有別人洗完澡,讓出儲物櫃,這裡的鑰匙就相當於訊號量 有限的數量 訊號量可以使共享變數可被指定數量的執行緒訪問。乙個計數器,乙個等待佇列,三個方法。在訊號量模型裡,...

資料庫實驗 簡單資料庫應用系統設計與實現

某學生宿舍管理系統,涉及的部分資訊如下 學生 學號,姓名,性別,專業,班級。寢室 寢室號,房間 管理員 員工號,姓名,聯絡 其中 每個寢室可同時住宿多名學生,每名學生只分配乙個寢室 每個寢室指定其中一名學生擔當寢室長 每個管理員同時管理多個寢室,但每個寢室只有一名管理員。每組同學從以上選題中任選乙個...