tokyo cabinet源代码分析(4)

2.3.3记录插入二叉树

   在已有二叉树结构中增加记录。循环遍历二叉树结构,插入节点。

/*二叉树遍历过程,先比较hash,找到相应的节点, *再比较相应的key值,如果key值不相同,同样作为 *二叉树进行比较插入*/ while(rec){ uint32_t rhash = rec->ksiz & ~TCMAPKMAXSIZ; uint32_t rksiz = rec->ksiz & TCMAPKMAXSIZ; /*如果hash值大,则选择左子树,entp存放父节点*/ if(hash > rhash){ entp = &(rec->left); rec = rec->left; } else if(hash < rhash){ entp = &(rec->right); rec = rec->right; } else { /*如果相同,则比较key是否相同,如果不相同继续遍历 *二叉树*/ char *dbuf = (char *)rec + sizeof(*rec); int kcmp = TCKEYCMP(kbuf, ksiz, dbuf, rksiz); if(kcmp < 0){ entp = &(rec->left); rec = rec->left; } else if(kcmp > 0){ entp = &(rec->right); rec = rec->right; } else { /*如果key值相同,则对于原先的rec进行更新*/ map->msiz += vsiz - rec->vsiz; int psiz = TCALIGNPAD(ksiz); if(vsiz > rec->vsiz){ TCMAPREC *old = rec; TCREALLOC(rec, rec, sizeof(*rec) + ksiz + psiz + vsiz + 1); if(rec != old){ if(map->first == old) map->first = rec; if(map->last == old) map->last = rec; if(map->cur == old) map->cur = rec; *entp = rec; if(rec->prev) rec->prev->next = rec; if(rec->next) rec->next->prev = rec; dbuf = (char *)rec + sizeof(*rec); } } memcpy(dbuf + ksiz + psiz, vbuf, vsiz); dbuf[ksiz+psiz+vsiz] = '/0'; rec->vsiz = vsiz; return; } }

2.3.4 memory hash database 结构层次图

memory Hash MAP 结构图:
默认TCMAP数组8个元素,先映射到不同TCMAP元素之上。
 --------------------------------
|TCMAP1 | TCMAP2 | .....| TCMAP8 |
 --------------------------------
    |
    V再次映射到buckets数组中的元素
  --------------------------------------------------------------
 |rec_buckets数组|rec_first|rec_last|rec_cur|bucket数目|rec数目|
  -------------------------------------------------------------
    |
    VREC被映射到具体的bucket元素,然后按照二叉树的结构进行存储
 -------------------------------------------------
 | ksiz|vsiz|left_rec|right_rec|prev_rec|next_rec|
 -------------------------------------------------
map中的last和first指针,将所有的rec结构进行串联,从而方便遍历。

你可能感兴趣的:(tokyo cabinet源代码分析(4))