隨便亂寫的 上班沒事情,很多地方都是猜測或者不準。
1)bdb 編譯 在build_windows 和build_unix 目錄下 進行編譯。vc 直接點VC6的dsw轉換VC9。記得編譯時間把編譯選項設定為DEBUG X86.
2)最近兩天研究主要是Btree部分,bt開頭部分代碼是Btree操作部分,包括put,open,delete,search,split部分,其中split為page的分頁。
我感覺BDB的文檔不算太多,尤其是中文帶圖的,可以參考SQLITE的BTREE,反正大家做的也差不多,知道原理後仔細分析代碼。
隨便說一個函數吧:
/*
* __bam_split --
* Split a page.
*
* PUBLIC: int __bam_split __P((DBC *, void *, db_pgno_t *));
*/
int
__bam_split(dbc, arg, root_pgnop)
DBC *dbc;
void *arg;
db_pgno_t *root_pgnop;
{
for (dir = UP, level = LEAFLEVEL;; dir == UP ? ++level : --level) {
/*
* Acquire a page and its parent, locked.
*/
if ((ret = (dbc->dbtype == DB_BTREE ?
__bam_search(dbc, PGNO_INVALID,
arg, SR_WRPAIR, level, NULL, &exact) :
__bam_rsearch(dbc,
(db_recno_t *)arg, SR_WRPAIR, level, &exact))) != 0)
break;
。。。
BDB的注釋非常的好,好多地方直接看注釋就知道啥意思了。下面是翻譯
在leaf 節點空間佔滿後,就會出發split.既回new出一個新的leaf node.
這時要根據要插入的key來search到底要split那個leaf node.這時要鎖住leaf 節點以及它的parent page。
然後就可以split這個leaf page. 這時要檢查下新的internal key(internal key 是internal節點?)是否適合parent page.
如果不適合,丟棄現在的鎖重新做,這次鎖的是這個leaf page的parent和 parent parent. 這樣一直迭代,直到成功的split.
大概的意思實際也是BTREE的SPLIT的過程,下班了,明天仔細理解下。