上一部分我們的資料仍然沒有排序,這個部分我們會修復這個問題,並檢測和拒絕重複的鍵。
現在,我們的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實現 簡單資料庫連線池
首先我們先介紹一下什麼是訊號量 類似於我們去公共澡堂洗澡,需要先去前台付款拿到儲物櫃的鑰匙,如過沒有空閒的儲物櫃,我們就需要一直等待,直到有別人洗完澡,讓出儲物櫃,這裡的鑰匙就相當於訊號量 有限的數量 訊號量可以使共享變數可被指定數量的執行緒訪問。乙個計數器,乙個等待佇列,三個方法。在訊號量模型裡,...
資料庫實驗 簡單資料庫應用系統設計與實現
某學生宿舍管理系統,涉及的部分資訊如下 學生 學號,姓名,性別,專業,班級。寢室 寢室號,房間 管理員 員工號,姓名,聯絡 其中 每個寢室可同時住宿多名學生,每名學生只分配乙個寢室 每個寢室指定其中一名學生擔當寢室長 每個管理員同時管理多個寢室,但每個寢室只有一名管理員。每組同學從以上選題中任選乙個...