github地址:https://github.com/viktorika/vDB.git
參考資料
這份代碼是參考APUE寫的,採用的結構跟書裏是一模一樣,不一樣的只是代碼風格以及部分細節上的區別,所以本文下面所說的實現則是解釋一下APUE是怎麼做的。
數據庫文件類型
首先得講講這個數據庫會生成兩個文件。
1.索引文件.idx
2.數據文件.dat
數據庫文件存儲結構
再來講講裏面的結構,索引文件採用的是hash表結構。採用鏈表來解決衝突,所以每個節點都會有一個指針會指向下一個節點,這個指針在文件中表現爲偏移量,這裏我們統一稱呼它爲ptr結構。
首先我們將.idx文件分成兩部分
1.前半部分,空閒鏈表頭節點+hash表所有節點的頭節點
2.後半部分,一個個index記錄,不管是空閒的節點還是非空閒的節點他們都是一個index記錄。
假設我們一 個ptr的大小爲ptr_size,hash表的大小爲hash_table_size,那麼前半部分佔用的字節數就爲(hash_table_size + 1) * ptr_size。
這裏我們表示空白的話是用空白符' '來填充的。
再來說說一個index記錄的結構
這個記錄我們分成三部分
1.剛剛所說的ptr。
2.真正index記錄的長度(長度是用固定字節數的所以無需分隔符,這個字節數用index_size來代替)。
3.真正的index記錄。
真正的index記錄的格式是這樣的:
xxx:xxx:xxx\n
':'符號爲分隔符,\n是終止符,每條記錄最後都是有\n來終止的,data記錄也是一樣的。
通過':'符號分成了三部分。
1.key。
2.data在.dat文件中的偏移量。
3.data的偏移量。
這就是一個完整的index記錄。
最後說一下data記錄
這個其實沒什麼好說的了,就是每條記錄都由\n來隔開。
具體實現請到github上自行看代碼,已經做了詳細的註釋。