diff --git a/KVstore/CBtreeFunc.cpp b/KVstore/CBtreeFunc.cpp index 5f6df10..c628939 100644 --- a/KVstore/CBtreeFunc.cpp +++ b/KVstore/CBtreeFunc.cpp @@ -15,7 +15,7 @@ string filePath_sID2s; string filePath_o2sID; string filePath_opID2sID; FILE * _log_btree; -// 在中间结点中插入键 +// 鍦ㄤ腑闂寸粨鐐逛腑鎻掑叆閿 bool mItnlNode::Insert( mNode * pNode) { if(getCount() >= MAXNUM_KEY) @@ -32,7 +32,7 @@ bool mItnlNode::Insert( mNode * pNode) printf("err in insert itnl\n"); system("pause"); exit(0); } -// 在要插入的点是在最右端时要特殊处理, solved + // 鍦ㄨ鎻掑叆鐨勭偣鏄湪鏈鍙崇鏃惰鐗规畩澶勭悊, solved for(int i = getCount() + 1; i > _ikey; i --) { this ->setElement(i, this ->getElement(i - 1) ); @@ -50,13 +50,13 @@ bool mItnlNode::Insert( mNode * pNode) return true; } -// 在中间结点中删除键,以及该键后的指针 +// 鍦ㄤ腑闂寸粨鐐逛腑鍒犻櫎閿紝浠ュ強璇ラ敭鍚庣殑鎸囬拡 int mItnlNode::Delete(const KeyType & _keytype) { int _index = -1; int _ibegin = 1, _iend = getCount(); int _imiddle; - // 二分查找index + // 浜屽垎鏌ユ壘index while(_ibegin < _iend) { _imiddle = (_ibegin + _iend) / 2; @@ -81,9 +81,9 @@ int mItnlNode::Delete(const KeyType & _keytype) } } - //任何一个不是根节点或不是叶子节点的节点必须保证包含至少两个元素 - // 对于insert, index = 1 的时候一定是整棵树的最右边!!! - // delete则不同 + //浠讳綍涓涓笉鏄牴鑺傜偣鎴栦笉鏄彾瀛愯妭鐐圭殑鑺傜偣蹇呴』淇濊瘉鍖呭惈鑷冲皯涓や釜鍏冪礌 + // 瀵逛簬insert锛 index = 1 鐨勬椂鍊欎竴瀹氭槸鏁存5鏍戠殑鏈鍙宠竟锛侊紒锛 + // delete鍒欎笉鍚 if(_index == 1 && this ->getFather() != NULL) { mItnlNode * itnl_father = (mItnlNode *)(this ->getFather() ); @@ -91,7 +91,7 @@ int mItnlNode::Delete(const KeyType & _keytype) KeyType & i_data = this ->getKey(2); while(itnl_father != NULL) { - // 此处同insert不同,审慎其不同之处 + // 姝ゅ鍚宨nsert涓嶅悓锛屽鎱庡叾涓嶅悓涔嬪 int tmp_key = itnl_father ->iExist(f_data); if(tmp_key < 1) { @@ -142,7 +142,7 @@ KeyType & mItnlNode::Split(mItnlNode* pNode) return (pNode ->getElement(1)).mKey; } -// 结合结点,把指定中间结点的数据全部剪切到本中间结点 +// 缁撳悎缁撶偣锛屾妸鎸囧畾涓棿缁撶偣鐨勬暟鎹叏閮ㄥ壀鍒囧埌鏈腑闂寸粨鐐 bool mItnlNode::Combine(mItnlNode * pNode) { if(this ->getCount() + pNode ->getCount() > MAXNUM_KEY) @@ -156,7 +156,7 @@ bool mItnlNode::Combine(mItnlNode * pNode) return true; } -// 从另一结点移一个元素到本结点 +// 浠庡彟涓缁撶偣绉讳竴涓厓绱犲埌鏈粨鐐 bool mItnlNode::MoveOneElement(mNode* pNode) { @@ -164,9 +164,9 @@ bool mItnlNode::MoveOneElement(mNode* pNode) return false; } -// 清除叶子结点中的数据 +// 娓呴櫎鍙跺瓙缁撶偣涓殑鏁版嵁 -// 在叶子结点中插入数据 +// 鍦ㄥ彾瀛愮粨鐐逛腑鎻掑叆鏁版嵁 bool mLeafNode::Insert(const mleafdata & _leafdata) { const KeyType & data = _leafdata.mData; @@ -179,9 +179,9 @@ bool mLeafNode::Insert(const mleafdata & _leafdata) printf("err count too large\n"); return false; } -// 返回i, data 介于i - 1 与 i 之间, 要放在i 上 + // 杩斿洖i锛 data 浠嬩簬i - 1 涓 i 涔嬮棿, 瑕佹斁鍦╥ 涓 int _i_insert = this ->iInsert(data); -// 还要考虑仅根节点是叶子节点的情况, 需要再加个条件 + // 杩樿鑰冭檻浠呮牴鑺傜偣鏄彾瀛愯妭鐐圭殑鎯呭喌锛 闇瑕佸啀鍔犱釜鏉′欢 if(_i_insert == 1 && this ->getFather() != NULL) { mItnlNode * _pFather = (mItnlNode *)(this ->getFather()); @@ -196,7 +196,7 @@ bool mLeafNode::Insert(const mleafdata & _leafdata) system("pause"); exit(0); } - //同步使得内存位等其它位失效, 策略失策, 弥补之。。 + //鍚屾浣垮緱鍐呭瓨浣嶇瓑鍏跺畠浣嶅け鏁堬紝 绛栫暐澶辩瓥锛 寮ヨˉ涔嬨傘 _pFather ->setKey(_ikey, _leafdata.mData); _pFather ->setMemory(_ikey); _pFather ->setModify(); @@ -216,10 +216,10 @@ bool mLeafNode::Insert(const mleafdata & _leafdata) } /* - * 删除成功返回删除的key的下标, 失败则返回-1 - * 设置修改位 - * 若是最左端的元素则向上修改对应需要修改的父节点, 此处与insert不同 - * insert若出现最左端必然是整棵树的最左端 + * 鍒犻櫎鎴愬姛杩斿洖鍒犻櫎鐨刱ey鐨勪笅鏍囷紝 澶辫触鍒欒繑鍥-1 + * 璁剧疆淇敼浣 + * 鑻ユ槸鏈宸︾鐨勫厓绱犲垯鍚戜笂淇敼瀵瑰簲闇瑕佷慨鏀圭殑鐖惰妭鐐癸紝 姝ゅ涓巌nsert涓嶅悓 + * insert鑻ュ嚭鐜版渶宸︾蹇呯劧鏄暣妫垫爲鐨勬渶宸︾ */ int mLeafNode::Delete(KeyType & _keytype) { @@ -249,9 +249,9 @@ int mLeafNode::Delete(KeyType & _keytype) _ibegin = _imiddle; } } - //任何一个不是根节点或不是叶子节点的节点必须保证包含至少两个元素 - // 对于insert, index = 1 的时候一定是整棵树的最右边!!! - // delete则不同 + //浠讳綍涓涓笉鏄牴鑺傜偣鎴栦笉鏄彾瀛愯妭鐐圭殑鑺傜偣蹇呴』淇濊瘉鍖呭惈鑷冲皯涓や釜鍏冪礌 + // 瀵逛簬insert锛 index = 1 鐨勬椂鍊欎竴瀹氭槸鏁存5鏍戠殑鏈鍙宠竟锛侊紒锛 + // delete鍒欎笉鍚 if(_index == 1 && this ->getFather() != NULL) { mItnlNode * itnl_father = (mItnlNode *)(this ->getFather() ); @@ -259,7 +259,7 @@ int mLeafNode::Delete(KeyType & _keytype) KeyType & i_data = this ->getKey(2); while(itnl_father != NULL) { - // 此处同insert不同,审慎其不同之处 + // 姝ゅ鍚宨nsert涓嶅悓锛屽鎱庡叾涓嶅悓涔嬪 int tmp_key = itnl_father ->iExist(f_data); if(tmp_key < 1) { @@ -292,7 +292,7 @@ int mLeafNode::Delete(KeyType & _keytype) } return -1; } -//重载delete of leaf +//閲嶈浇delete of leaf int mLeafNode::Delete(KeyType & _keytype, char partval[], int & pvFlag) { int _index = -1; @@ -334,12 +334,12 @@ int mLeafNode::Delete(KeyType & _keytype, char partval[], int & pvFlag) if(pvFlag == FLAG_NO_ZERO) return _index; - //如果删除成功并且元素变为空, 则继续删除对应的key + //濡傛灉鍒犻櫎鎴愬姛骞朵笖鍏冪礌鍙樹负绌猴紝 鍒欑户缁垹闄ゅ搴旂殑key - //任何一个不是根节点或不是叶子节点的节点必须保证包含至少两个元素 - // 对于insert, index = 1 的时候一定是整棵树的最右边!!! - // delete则不同 + //浠讳綍涓涓笉鏄牴鑺傜偣鎴栦笉鏄彾瀛愯妭鐐圭殑鑺傜偣蹇呴』淇濊瘉鍖呭惈鑷冲皯涓や釜鍏冪礌 + // 瀵逛簬insert锛 index = 1 鐨勬椂鍊欎竴瀹氭槸鏁存5鏍戠殑鏈鍙宠竟锛侊紒锛 + // delete鍒欎笉鍚 if(_index == 1 && this ->getFather() != NULL) { mItnlNode * itnl_father = (mItnlNode *)(this ->getFather() ); @@ -347,7 +347,7 @@ int mLeafNode::Delete(KeyType & _keytype, char partval[], int & pvFlag) KeyType & i_data = this ->getKey(2); while(itnl_father != NULL) { - // 此处同insert不同,审慎其不同之处 + // 姝ゅ鍚宨nsert涓嶅悓锛屽鎱庡叾涓嶅悓涔嬪 int tmp_key = itnl_father ->iExist(f_data); if(tmp_key < 1) { @@ -379,7 +379,7 @@ int mLeafNode::Delete(KeyType & _keytype, char partval[], int & pvFlag) -// 分裂叶子结点,把本叶子结点的后一半数据剪切到指定的叶子结点中 +// 鍒嗚鍙跺瓙缁撶偣锛屾妸鏈彾瀛愮粨鐐圭殑鍚庝竴鍗婃暟鎹壀鍒囧埌鎸囧畾鐨勫彾瀛愮粨鐐逛腑 KeyType & mLeafNode::Split(mLeafNode * pNode) { for(int i = ORDER_V + 1; i <= MAXNUM_KEY; i ++) @@ -393,7 +393,7 @@ KeyType & mLeafNode::Split(mLeafNode * pNode) return (pNode ->getElement(1)).mData; } -// 结合结点,把指定叶子结点的数据全部剪切到本叶子结点 +// 缁撳悎缁撶偣锛屾妸鎸囧畾鍙跺瓙缁撶偣鐨勬暟鎹叏閮ㄥ壀鍒囧埌鏈彾瀛愮粨鐐 bool mLeafNode::Combine(mLeafNode * pNode) { int this_count = this ->getCount(); @@ -405,7 +405,7 @@ bool mLeafNode::Combine(mLeafNode * pNode) } return false; } -// 查找对应的叶子结点 +// 鏌ユ壘瀵瑰簲鐨勫彾瀛愮粨鐐 mLeafNode* BPlusTree::SearchLeafNode(const KeyType & data)const { mNode * pNode = mRoot; @@ -415,15 +415,15 @@ mLeafNode* BPlusTree::SearchLeafNode(const KeyType & data)const } else// no check { - /* - * while 循环 - * 当前还是中间节点 - * 找到下层入口下标 - * 判断是否超出左边界, 是的话直接到底, pNode 指向叶子节点, break - * 总之, 最后肯定是pNode指向叶子节点 - * 所以, 插入时还要判断是否超过左边界, 是的话要修改上层父节点的左边界 - * Search 的时候都要注意边界的率先判断, 还有当前叶节点可能是根节点 - */ + /* + * while 寰幆 + * 褰撳墠杩樻槸涓棿鑺傜偣 + * 鎵惧埌涓嬪眰鍏ュ彛涓嬫爣 + * 鍒ゆ柇鏄惁瓒呭嚭宸﹁竟鐣岋紝 鏄殑璇濈洿鎺ュ埌搴曪紝 pNode 鎸囧悜鍙跺瓙鑺傜偣锛 break + * 鎬讳箣锛 鏈鍚庤偗瀹氭槸pNode鎸囧悜鍙跺瓙鑺傜偣 + * 鎵浠ワ紝 鎻掑叆鏃惰繕瑕佸垽鏂槸鍚﹁秴杩囧乏杈圭晫锛 鏄殑璇濊淇敼涓婂眰鐖惰妭鐐圭殑宸﹁竟鐣 + * Search 鐨勬椂鍊欓兘瑕佹敞鎰忚竟鐣岀殑鐜囧厛鍒ゆ柇, 杩樻湁褰撳墠鍙惰妭鐐瑰彲鑳芥槸鏍硅妭鐐 + */ // int _floor = 1; while(pNode ->getType() == NODE_TYPE_INTERNAL) { @@ -461,8 +461,8 @@ mLeafNode* BPlusTree::SearchLeafNode(const KeyType & data)const } return NULL; } -// 在树中查找数据 -bool BPlusTree::Search(KeyType & data, mleafdata & _ret)//增加一参数, 用于接收查找过程中进入的叶子节点 +// 鍦ㄦ爲涓煡鎵炬暟鎹 +bool BPlusTree::Search(KeyType & data, mleafdata & _ret)//澧炲姞涓鍙傛暟锛 鐢ㄤ簬鎺ユ敹鏌ユ壘杩囩▼涓繘鍏ョ殑鍙跺瓙鑺傜偣 { mLeafNode * _pLeaf = SearchLeafNode(data); int _ikey = _pLeaf ->iExist(data); @@ -521,7 +521,7 @@ bool BPlusTree::Insert(const mleafdata & _leafdata) long long int _addr_newleaf = mblockQueue.Pop(); _pNewLeaf ->setAddrFB(_addr_newleaf); -// _key_tmp 也就将是_pnewleaf的第一个元素的key +// _key_tmp 涔熷氨灏嗘槸_pnewleaf鐨勭涓涓厓绱犵殑key // set modified in split; if(! _pOldLeaf ->getModify()) { @@ -535,8 +535,8 @@ bool BPlusTree::Insert(const mleafdata & _leafdata) if(_pFather == NULL) { -// _pOldLeaf以前是根节点,要把offset = 0 让出来 -// 还存在占用外存链的情况下则需要释放外存链 +// _pOldLeaf浠ュ墠鏄牴鑺傜偣锛岃鎶妎ffset = 0 璁╁嚭鏉 +// 杩樺瓨鍦ㄥ崰鐢ㄥ瀛橀摼鐨勬儏鍐典笅鍒欓渶瑕侀噴鏀惧瀛橀摼 // if(!preModified) // { // DelDisk(mfp, 0l, mblockQueue); @@ -545,7 +545,7 @@ bool BPlusTree::Insert(const mleafdata & _leafdata) _pOldLeaf ->setAddrFB(_addr_new); // setmodified in initial; mItnlNode * _pItnl = new mItnlNode; - // 分配新的首地址 + // 鍒嗛厤鏂扮殑棣栧湴鍧址 long long int _addr_root = 0; long long int _addr_2 = _pNewLeaf ->getAddrFB(); long long int _addr_1 = _pOldLeaf ->getAddrFB(); @@ -587,15 +587,15 @@ bool mLeafNode :: dupInsert(const mleafdata & _mleafdata, int _index_insert) return true; } -/* 删除某数据 - * 涉及删除节点时注意回收外存~~ +/* 鍒犻櫎鏌愭暟鎹 + * 娑夊強鍒犻櫎鑺傜偣鏃舵敞鎰忓洖鏀跺瀛榽~ */ bool BPlusTree::Delete(KeyType & data) { mLeafNode * _pOldLeaf = SearchLeafNode(data); // for when _ikey = 1 //if ok , return the index of the deleted - //如果idelete是1的话则函数里会是否进行向上删除 考虑 + //濡傛灉idelete鏄1鐨勮瘽鍒欏嚱鏁伴噷浼氭槸鍚﹁繘琛屽悜涓婂垹闄 鑰冭檻 int _idelete = _pOldLeaf ->Delete(data); if(_idelete < 0) return false; @@ -607,13 +607,13 @@ bool BPlusTree::Delete(KeyType & data) if(_pOldLeaf ->getCount() >= ORDER_V) { - //如果idelete = 1 向上删除 不需要 + //濡傛灉idelete = 1 鍚戜笂鍒犻櫎 涓嶉渶瑕 return true; } // count < 50% int flag = FLAG_LEFT; - // 右兄弟优先 + // 鍙冲厔寮熶紭鍏 mLeafNode * _pBrother = (mLeafNode*)(_pOldLeaf ->getBrother(flag)); //brother > 50% @@ -661,13 +661,13 @@ bool BPlusTree::Delete(KeyType & data) cout << "bug run" << endl; return false; } -//重载删除函数 +//閲嶈浇鍒犻櫎鍑芥暟 bool BPlusTree :: Delete(KeyType & data, char PartVal[]) { mLeafNode * _pOldLeaf = SearchLeafNode(data); - // for when _ikey = 1 - //if ok , return the index of the deleted - //如果idelete是1的话则函数里会是否进行向上删除 考虑 + // for when _ikey = 1 + //if ok , return the index of the deleted + //濡傛灉idelete鏄1鐨勮瘽鍒欏嚱鏁伴噷浼氭槸鍚﹁繘琛屽悜涓婂垹闄 鑰冭檻 int pvFlag = FLAG_ZERO; int _idelete = _pOldLeaf ->Delete(data, PartVal, pvFlag); if(_idelete < 0) return false; @@ -681,13 +681,13 @@ bool BPlusTree :: Delete(KeyType & data, char PartVal[]) if(_pOldLeaf ->getCount() >= ORDER_V) { - //如果idelete = 1 向上删除 不需要 + //濡傛灉idelete = 1 鍚戜笂鍒犻櫎 涓嶉渶瑕 return true; } // count < 50% int flag = FLAG_LEFT; - // 右兄弟优先 + // 锟斤拷锟街碉拷锟斤拷锟斤拷 mLeafNode * _pBrother = (mLeafNode*)(_pOldLeaf ->getBrother(flag)); //brother > 50% @@ -740,7 +740,7 @@ void BPlusTree::Flush(){ this ->StoreTree(); this ->ClearTree(); } -// 清除整个树,删除所有结点 +// 娓呴櫎鏁翠釜鏍戯紝鍒犻櫎鎵鏈夌粨鐐 void BPlusTree :: ClearTree() { queue pQueue[100]; @@ -799,26 +799,26 @@ void BPlusTree :: ClearTree() return; } -// 检查树是否满足B+树的定义 +// 妫鏌ユ爲鏄惁婊¤冻B+鏍戠殑瀹氫箟 //bool BPlusTree::CheckTree() //{} -// 递归检查结点及其子树是否满足B+树的定义 +// 閫掑綊妫鏌ョ粨鐐瑰強鍏跺瓙鏍戞槸鍚︽弧瓒矪+鏍戠殑瀹氫箟 //bool BPlusTree::CheckNode(mNode* pNode) //{} -// 打印整个树 +// 鎵撳嵃鏁翠釜鏍 //void BPlusTree::PrintTree(FILE * ifp) //{} -// 打印某结点 +// 鎵撳嵃鏌愮粨鐐 //void BPlusTree::PrintNode(mNode* pNode, FILE * ifp) //{} -//递归函数:插入键到中间结点 -//key即为pNode中的首个key +//閫掑綊鍑芥暟锛氭彃鍏ラ敭鍒颁腑闂寸粨鐐 +//key鍗充负pNode涓殑棣栦釜key bool BPlusTree::InsertItnlNode(mItnlNode* pNode, mNode* pSon) { if(pNode == NULL || pNode ->getType() == NODE_TYPE_LEAF) @@ -878,8 +878,8 @@ bool BPlusTree::InsertItnlNode(mItnlNode* pNode, mNode* pSon) if(_pFather == NULL) { -// 原offset = 0处块以及相应后续链接块先清除 -// 判断是否需要删除的外存链 +// 鍘無ffset = 0澶勫潡浠ュ強鐩稿簲鍚庣画閾炬帴鍧楀厛娓呴櫎 +// 鍒ゆ柇鏄惁闇瑕佸垹闄ょ殑澶栧瓨閾 // if(!preModified) // { // DelDisk(mfp, 0l, mblockQueue); @@ -890,7 +890,7 @@ bool BPlusTree::InsertItnlNode(mItnlNode* pNode, mNode* pSon) _pOldItnl ->setAddrFB(_addr_new); // setmodified in mnode_initial; mItnlNode * _pItnl = new mItnlNode; - // 分配新的首地址 + //鍒嗛厤鏂扮殑棣栧湴鍧 long long int _addr_root = 0l; long long int _addr_1 = _pOldItnl ->getAddrFB(); long long int _addr_2 = _pNewItnl ->getAddrFB(); @@ -921,11 +921,11 @@ bool BPlusTree::InsertItnlNode(mItnlNode* pNode, mNode* pSon) return false; } /* - * 删除key对应的元素并在delete函数中完成对父节点的修改, 注意内存位的同步修改 - * 若节点 > 50% 或为根节点, 则结束 + * 鍒犻櫎key瀵瑰簲鐨勫厓绱犲苟鍦╠elete鍑芥暟涓畬鎴愬鐖惰妭鐐圭殑淇敼锛 娉ㄦ剰鍐呭瓨浣嶇殑鍚屾淇敼 + * 鑻ヨ妭鐐 > 50% 鎴栦负鏍硅妭鐐癸紝 鍒欑粨鏉 * */ -// 递归函数:在中间结点中删除键 +// 閫掑綊鍑芥暟锛氬湪涓棿缁撶偣涓垹闄ら敭 bool BPlusTree::DeleteItnlNode(mItnlNode* pItnl, KeyType & key) { int _idelete = pItnl ->Delete(key); @@ -984,11 +984,11 @@ bool BPlusTree::DeleteItnlNode(mItnlNode* pItnl, KeyType & key) cout << "run bug" << endl; return false; } -//保存树结构 +//淇濆瓨鏍戠粨鏋 /* - * 保证两点: - * 1、内存位标记都正确 - * 2、修改位标记都正确 + * 淇濊瘉涓ょ偣锛 + * 1銆佸唴瀛樹綅鏍囪閮芥纭 + * 2銆佷慨鏀逛綅鏍囪閮芥纭 */ void BPlusTree :: StoreTree() { @@ -1004,7 +1004,7 @@ void BPlusTree :: StoreTree() { pNode = pQueue.front(); pQueue.pop(); -// 内有unmodify +// 鍐呮湁unmodify if(pNode->getModify()){ any = true; } @@ -1026,7 +1026,7 @@ void BPlusTree :: StoreTree() } } cout << endl; - char _queuefile[50]; + char _queuefile[1024]; strcpy(_queuefile, mTreeName); strcat(_queuefile, "_queue.btree"); this ->mblockQueue.WriteQueue(_queuefile); @@ -1039,7 +1039,7 @@ void BPlusTree :: StoreTree() } // -//打印树 +//鎵撳嵃鏍 void BPlusTree :: PrintTree() { queue pQueue[100]; @@ -1083,18 +1083,18 @@ void BPlusTree :: PrintTree() } /* - * 新建节点需要提供的信息: - * 节点的首块地址 - * 读出type int - * 读出count int - * 读出count_block int - * 读出blocklink mBlockLink + * 鏂板缓鑺傜偣闇瑕佹彁渚涚殑淇℃伅锛 + * 鑺傜偣鐨勯鍧楀湴鍧 + * 璇诲嚭type int + * 璇诲嚭count int + * 璇诲嚭count_block int + * 璇诲嚭blocklink mBlockLink * - * 读出各元素后, 通过下块地址转移, 转以后读入块元素个数, 再读入块链接 + * 璇诲嚭鍚勫厓绱犲悗锛 閫氳繃涓嬪潡鍦板潃杞Щ锛 杞互鍚庤鍏ュ潡鍏冪礌涓暟锛 鍐嶈鍏ュ潡閾炬帴 * */ -mNode * ReadNode(FILE * fp, long long _addrfb)//每个新建的节点都有分配的或上层节点给予的首块存储区地址 +mNode * ReadNode(FILE * fp, long long _addrfb)//姣忎釜鏂板缓鐨勮妭鐐归兘鏈夊垎閰嶇殑鎴栦笂灞傝妭鐐圭粰浜堢殑棣栧潡瀛樺偍鍖哄湴鍧 { fseek(fp, _addrfb, SEEK_SET); int _type_tmp; @@ -1118,25 +1118,25 @@ mNode * ReadNode(FILE * fp, long long _addrfb)//每 _pLeaf ->unModify(); _pLeaf ->setAddrFB(_addrfb); fread(&(_pLeaf ->leafLink), sizeof(_pLeaf ->leafLink), 1, fp); - /* - * while cycle里 - * for cycle - * 通过块内元素个数读入 - */ + /* + * while cycle閲 + * for cycle + * 閫氳繃鍧楀唴鍏冪礌涓暟璇诲叆 + */ - /* - * 读完后, 先记录当前独到节点的第几个元素 - * 文件指针偏移至指示的下一块 - * 再读入块内元素个数及上下块结构体变量 - * 继续读入, 直到元素个数达到count值 - */ - /* - * 先把块的剩余空间写入 -1, 再写入len(便于准确申请空间), sizeleft 减去三个4(12字节, “-1”“len”“sizeleft自身”), - * 写入sizeleft: 到时需要分段读入  然后申请块, 在将块链接写入之前位置 - * 写完剩余的空间后, 调整buffer及其size - * 然后每多申请一块则先跳过一个整型以及快链接结构体的大小, 以备写入当前块存放的长度buffer(考虑最后一块好处理),以及块链接 - * 写入剩余的buffer后回写长度及块链接, 若是最后一块, 要注意整理: fp指针 & sizeleft; - */ + /* + * 璇诲畬鍚庯紝 鍏堣褰曞綋鍓嶇嫭鍒拌妭鐐圭殑绗嚑涓厓绱 + * 鏂囦欢鎸囬拡鍋忕Щ鑷虫寚绀虹殑涓嬩竴鍧 + * 鍐嶈鍏ュ潡鍐呭厓绱犱釜鏁板強涓婁笅鍧楃粨鏋勪綋鍙橀噺 + * 缁х画璇诲叆锛 鐩村埌鍏冪礌涓暟杈惧埌count鍊 + */ + /* + * 鍏堟妸鍧楃殑鍓╀綑绌洪棿鍐欏叆 -1锛 鍐嶅啓鍏en锛堜究浜庡噯纭敵璇风┖闂达級锛 sizeleft 鍑忓幓涓変釜4锛12瀛楄妭锛 鈥-1鈥濃渓en鈥濃渟izeleft鑷韩鈥濓級锛 + * 鍐欏叆sizeleft锛氥鍒版椂闇瑕佸垎娈佃鍏ャ銆鐒跺悗鐢宠鍧楋紝銆鍦ㄥ皢鍧楅摼鎺ュ啓鍏ヤ箣鍓嶄綅缃 + * 鍐欏畬鍓╀綑鐨勭┖闂村悗锛 璋冩暣buffer鍙婂叾size + * 鐒跺悗姣忓鐢宠涓鍧楀垯鍏堣烦杩囦竴涓暣鍨嬩互鍙婂揩閾炬帴缁撴瀯浣撶殑澶у皬锛屻浠ュ鍐欏叆褰撳墠鍧楀瓨鏀剧殑闀垮害buffer(鑰冭檻鏈鍚庝竴鍧楀ソ澶勭悊)锛屼互鍙婂潡閾炬帴 + * 鍐欏叆鍓╀綑鐨刡uffer鍚庡洖鍐欓暱搴﹀強鍧楅摼鎺ワ紝 鑻ユ槸鏈鍚庝竴鍧楋紝 瑕佹敞鎰忔暣鐞嗭細 fp鎸囬拡 & sizeleft锛 + */ bool ReadIn = true; while(_i_tmp <= _count_tmp) { @@ -1199,7 +1199,7 @@ mNode * ReadNode(FILE * fp, long long _addrfb)//每 mItnlNode * _pItnl = new mItnlNode; _pItnl ->setCount(_count_tmp); _pItnl ->unModify(); -// 后加, 未知之前没有设地址的原因 +// 锟斤拷樱锟 未知之前没锟斤拷锟斤拷锟街凤拷锟皆拷锟 _pItnl ->setAddrFB(_addrfb); while(_i_tmp <= _count_tmp) { @@ -1262,7 +1262,7 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) fwrite(&(_count_tmp), size_count, 1, fp); _size_left -= size_count;//--------------------------------int - long long int _addr_blocklink = ftell(fp); // 可能产生问题 + long long int _addr_blocklink = ftell(fp); // 鍙兘浜х敓闂 fseek(fp, size_int + size_blocklink, SEEK_CUR); _size_left -= size_int + size_blocklink;//------------------int + long_long_int*2 @@ -1284,20 +1284,20 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) mBlockLink _blocklink; for(; _i_tmp <= _count; _i_tmp ++) { - /* - * 传入剩余块大小, 若当前元素能够继续写入则写入并返回true, 否则不写入并返回false; - * 如果返回false则先返写块容元素个数 及上下块的联系_ _addr_blocklink, - * 再申请新块并继续写入: 恢复_size_left, 写入mblocklink - * 修改上下块链接 - * 改成块内元素个数更好 - * 调整文件指针, 块内元素归零 - */ + /* + * 浼犲叆鍓╀綑鍧楀ぇ灏忥紝 鑻ュ綋鍓嶅厓绱犺兘澶熺户缁啓鍏ュ垯鍐欏叆骞惰繑鍥瀟rue锛 鍚﹀垯涓嶅啓鍏ュ苟杩斿洖false; + * 濡傛灉杩斿洖false鍒欏厛杩斿啓鍧楀鍏冪礌涓暟 鍙婁笂涓嬪潡鐨勮仈绯籣 _addr_blocklink锛 + * 鍐嶇敵璇锋柊鍧楀苟缁х画鍐欏叆锛 鎭㈠_size_left, 鍐欏叆mblocklink + * 淇敼涓婁笅鍧楅摼鎺 + * 鏀规垚鍧楀唴鍏冪礌涓暟鏇村ソ + * 璋冩暣鏂囦欢鎸囬拡, 鍧楀唴鍏冪礌褰掗浂 + */ int size_key = -1; int size_val = -1; int _tmp_i = -1; bool_WriteIn = _pLeaf ->LeafData[_i_tmp].Write_mleafdata(fp, _size_left, size_key, size_val); - if(!bool_WriteIn) //确定不可能有单一元素超过4K, 可能产生问题 + if(!bool_WriteIn) //纭畾涓嶅彲鑳芥湁鍗曚竴鍏冪礌瓒呰繃4K锛 鍙兘浜х敓闂 { if(size_key + size_val > BLOCKSIZE - size_int*3 - size_lli*4 && _size_left > size_key + size_int * 3 + 1) @@ -1324,9 +1324,9 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) // _curblockaddr = _mqueue.Pop(); _blocklink.mBlockLink_Initial(); _blocklink.preBlockAddr = _preblockaddr; - _preblockaddr = _curblockaddr; // 新块的上一块就是当前块(首块指向-1) - _curblockaddr = _mqueue.Pop(); //当前块变量再调整为指向新块 - _blocklink.nextBlockAddr = _curblockaddr; // 上一块的下一块即为新块 + _preblockaddr = _curblockaddr; // 鏂板潡鐨勪笂涓鍧楀氨鏄綋鍓嶅潡锛堥鍧楁寚鍚-1锛 + _curblockaddr = _mqueue.Pop(); //褰撳墠鍧楀彉閲忓啀璋冩暣涓烘寚鍚戞柊鍧 + _blocklink.nextBlockAddr = _curblockaddr; // 涓婁竴鍧楃殑涓嬩竴鍧楀嵆涓烘柊鍧 fseek(fp, _addr_blocklink, SEEK_SET); nEle_inBlock ++; @@ -1335,7 +1335,7 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) fwrite(&_blocklink, size_blocklink, 1, fp); fseek(fp, _curblockaddr, SEEK_SET); - _addr_blocklink = _curblockaddr;//调整回写偏移 + _addr_blocklink = _curblockaddr;//璋冩暣鍥炲啓鍋忕Щ fseek(fp, size_blocklink + size_int, SEEK_CUR); //write back blocklink @@ -1349,16 +1349,16 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) _blocklink.mBlockLink_Initial(); _blocklink.preBlockAddr = _preblockaddr; - _preblockaddr = _curblockaddr; // 新块的上一块就是当前块(首块指向-1) - _curblockaddr = _mqueue.Pop(); //当前块变量再调整为指向新块 - _blocklink.nextBlockAddr = _curblockaddr; // 上一块的下一块即为新块 + _preblockaddr = _curblockaddr; // 鏂板潡鐨勪笂涓鍧楀氨鏄綋鍓嶅潡锛堥鍧楁寚鍚-1锛 + _curblockaddr = _mqueue.Pop(); //褰撳墠鍧楀彉閲忓啀璋冩暣涓烘寚鍚戞柊鍧 + _blocklink.nextBlockAddr = _curblockaddr; // 涓婁竴鍧楃殑涓嬩竴鍧楀嵆涓烘柊鍧 fseek(fp, _addr_blocklink, SEEK_SET); fwrite(&_block_hold, size_int, 1, fp); fwrite(&_blocklink, size_blocklink, 1, fp); fseek(fp, _curblockaddr, SEEK_SET); - _addr_blocklink = _curblockaddr;//调整回写偏移 + _addr_blocklink = _curblockaddr;//璋冩暣鍥炲啓鍋忕Щ fseek(fp, size_blocklink + size_int, SEEK_CUR); } @@ -1372,36 +1372,36 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) // _size_left = BLOCKSIZE - _size_buffer - size_int - size_blocklink; _size_left = -1; first_int = _size_buffer; - /* - * 先把块的剩余空间写入 -1, 再写入len(便于准确申请空间), sizeleft 减去三个4(12字节, “-1”“len”“sizeleft自身”), - * 写入sizeleft: 到时需要分段读入  然后申请块, 在将块链接写入之前位置 - * 写完剩余的空间后, 调整buffer及其size - * 然后每多申请一块则先跳过一个整型以及快链接结构体的大小, 以备写入当前块存放的长度buffer(考虑最后一块好处理),以及块链接 - * 写入剩余的buffer后回写长度及块链接, 若是最后一块, 要注意整理: fp指针 & sizeleft; - */ + /* + * 鍏堟妸鍧楃殑鍓╀綑绌洪棿鍐欏叆 -1锛 鍐嶅啓鍏en锛堜究浜庡噯纭敵璇风┖闂达級锛 sizeleft 鍑忓幓涓変釜4锛12瀛楄妭锛 鈥-1鈥濃渓en鈥濃渟izeleft鑷韩鈥濓級锛 + * 鍐欏叆sizeleft锛氥鍒版椂闇瑕佸垎娈佃鍏ャ銆鐒跺悗鐢宠鍧楋紝銆鍦ㄥ皢鍧楅摼鎺ュ啓鍏ヤ箣鍓嶄綅缃 + * 鍐欏畬鍓╀綑鐨勭┖闂村悗锛 璋冩暣buffer鍙婂叾size + * 鐒跺悗姣忓鐢宠涓鍧楀垯鍏堣烦杩囦竴涓暣鍨嬩互鍙婂揩閾炬帴缁撴瀯浣撶殑澶у皬锛屻浠ュ鍐欏叆褰撳墠鍧楀瓨鏀剧殑闀垮害buffer(鑰冭檻鏈鍚庝竴鍧楀ソ澶勭悊)锛屼互鍙婂潡閾炬帴 + * 鍐欏叆鍓╀綑鐨刡uffer鍚庡洖鍐欓暱搴﹀強鍧楅摼鎺ワ紝 鑻ユ槸鏈鍚庝竴鍧楋紝 瑕佹敞鎰忔暣鐞嗭細 fp鎸囬拡 & sizeleft锛 + */ } else { _i_tmp --; - _size_left = BLOCKSIZE; //回复块内容量 + _size_left = BLOCKSIZE; //锟截革拷锟斤拷锟斤拷锟斤拷锟斤拷 _blocklink.mBlockLink_Initial(); _blocklink.preBlockAddr = _preblockaddr; - _preblockaddr = _curblockaddr; // 新块的上一块就是当前块(首块指向-1) - _curblockaddr = _mqueue.Pop(); //当前块变量再调整为指向新块 - _blocklink.nextBlockAddr = _curblockaddr; // 上一块的下一块即为新块 - /* - * 写回块内元素个数以及快链接 - */ + _preblockaddr = _curblockaddr; // 鏂板潡鐨勪笂涓鍧楀氨鏄綋鍓嶅潡锛堥鍧楁寚鍚-1锛 + _curblockaddr = _mqueue.Pop(); //褰撳墠鍧楀彉閲忓啀璋冩暣涓烘寚鍚戞柊鍧 + _blocklink.nextBlockAddr = _curblockaddr; // 涓婁竴鍧楃殑涓嬩竴鍧楀嵆涓烘柊鍧 + /* + * 鍐欏洖鍧楀唴鍏冪礌涓暟浠ュ強蹇摼鎺 + */ fseek(fp, _addr_blocklink, SEEK_SET); int size_ele_inblock = sizeof(nEle_inBlock); fwrite(&first_int, size_ele_inblock, 1, fp); fwrite(&_blocklink, size_blocklink, 1, fp); fseek(fp, _curblockaddr, SEEK_SET); - _addr_blocklink = _curblockaddr;//调整回写偏移 + _addr_blocklink = _curblockaddr;//璋冩暣鍥炲啓鍋忕Щ fseek(fp, size_ele_inblock + size_blocklink, SEEK_CUR); _size_left -= size_ele_inblock + size_blocklink;//===========int + lli * 2 @@ -1415,13 +1415,13 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) }// if write_in }// for count - /* - * 最后一块的处理 - */ + /* + * 鏈鍚庝竴鍧楃殑澶勭悊 + */ _blocklink.mBlockLink_Initial(); _blocklink.preBlockAddr = _preblockaddr; - _blocklink.nextBlockAddr = -1; // 上一块的下一块即为新块 + _blocklink.nextBlockAddr = -1; // 涓婁竴鍧楃殑涓嬩竴鍧楀嵆涓烘柊鍧 fseek(fp, _addr_blocklink, SEEK_SET); fwrite(&first_int, size_int, 1, fp); fwrite(&_blocklink, size_blocklink, 1, fp); @@ -1440,37 +1440,37 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) mBlockLink _blocklink; for(; _i_tmp <= _count; _i_tmp ++) { - /* - * 传入剩余块大小, 若当前元素能够继续写入则写入并返回true, 否则不写入并返回false; - * 如果返回false则先返写块容元素个数 及上下块的联系_ _addr_blocklink, - * 再申请新块并继续写入: 恢复_size_left, 写入mblocklink - * 修改上下块链接 - * 改成块内元素个数更好 - * 调整文件指针, 块内元素归零 - */ + /* + * 浼犲叆鍓╀綑鍧楀ぇ灏忥紝 鑻ュ綋鍓嶅厓绱犺兘澶熺户缁啓鍏ュ垯鍐欏叆骞惰繑鍥瀟rue锛 鍚﹀垯涓嶅啓鍏ュ苟杩斿洖false; + * 濡傛灉杩斿洖false鍒欏厛杩斿啓鍧楀鍏冪礌涓暟 鍙婁笂涓嬪潡鐨勮仈绯籣 _addr_blocklink锛 + * 鍐嶇敵璇锋柊鍧楀苟缁х画鍐欏叆锛 鎭㈠_size_left, 鍐欏叆mblocklink + * 淇敼涓婁笅鍧楅摼鎺 + * 鏀规垚鍧楀唴鍏冪礌涓暟鏇村ソ + * 璋冩暣鏂囦欢鎸囬拡, 鍧楀唴鍏冪礌褰掗浂 + */ bool_WriteIn = _pItnl ->ItnlData[_i_tmp].Write_mitnldata(fp, _size_left); - if(!bool_WriteIn) //确定不可能有单一元素超过4K, 可能产生问题 + if(!bool_WriteIn) //纭畾涓嶅彲鑳芥湁鍗曚竴鍏冪礌瓒呰繃4K锛 鍙兘浜х敓闂 { _i_tmp --; - _size_left = BLOCKSIZE; //回复块内容量 + _size_left = BLOCKSIZE; //鍥炲鍧楀唴瀹归噺 _blocklink.mBlockLink_Initial(); _blocklink.preBlockAddr = _preblockaddr; - _preblockaddr = _curblockaddr; // 新块的上一块就是当前块(首块指向-1) - _curblockaddr = _mqueue.Pop(); //当前块变量再调整为指向新块 - _blocklink.nextBlockAddr = _curblockaddr; // 上一块的下一块即为新块 - /* - * 写回块内元素个数以及块链接 - */ + _preblockaddr = _curblockaddr; // 鏂板潡鐨勪笂涓鍧楀氨鏄綋鍓嶅潡锛堥鍧楁寚鍚-1锛 + _curblockaddr = _mqueue.Pop(); //褰撳墠鍧楀彉閲忓啀璋冩暣涓烘寚鍚戞柊鍧 + _blocklink.nextBlockAddr = _curblockaddr; // 涓婁竴鍧楃殑涓嬩竴鍧楀嵆涓烘柊鍧 + /* + * 鍐欏洖鍧楀唴鍏冪礌涓暟浠ュ強鍧楅摼鎺 + */ fseek(fp, _addr_blocklink, SEEK_SET); int size_ele_inblock = sizeof(nEle_inBlock); fwrite(&nEle_inBlock, size_ele_inblock, 1, fp); fwrite(&_blocklink, size_blocklink, 1, fp); fseek(fp, _curblockaddr, SEEK_SET); - _addr_blocklink = _curblockaddr;//调整回写偏移 + _addr_blocklink = _curblockaddr;//璋冩暣鍥炲啓鍋忕Щ fseek(fp, size_ele_inblock + size_blocklink, SEEK_CUR); _size_left -= size_ele_inblock + size_blocklink; @@ -1481,13 +1481,13 @@ void WriteNode(mNode * pNode, FILE * fp, mQueue & _mqueue) nEle_inBlock ++; } } - /* - * 最后一块的处理 - */ + /* + * 鏈鍚庝竴鍧楃殑澶勭悊 + */ _blocklink.mBlockLink_Initial(); _blocklink.preBlockAddr = _preblockaddr; - _blocklink.nextBlockAddr = -1; // 上一块的下一块即为新块 + _blocklink.nextBlockAddr = -1; // 涓婁竴鍧楃殑涓嬩竴鍧楀嵆涓烘柊鍧 fseek(fp, _addr_blocklink, SEEK_SET); int size_ele_inblock = sizeof(nEle_inBlock); fwrite(&nEle_inBlock, size_ele_inblock, 1, fp); @@ -1517,7 +1517,7 @@ void DelDisk(FILE * fp, long long int _addrfb, mQueue & _mqueue) long long int BackAddr[1000] = {}; vector BackVec; // BackAddr[_i_tmp] = _addrfb; -// _i_tmp ++; 首块地址绝非要一起回收, 在delete实现之后首块地址在适时push的!! + // _i_tmp ++; 棣栧潡鍦板潃缁濋潪瑕佷竴璧峰洖鏀讹紝 鍦╠elete瀹炵幇涔嬪悗棣栧潡鍦板潃鍦ㄩ傛椂push鐨勶紒锛 while(_curblocklink.nextBlockAddr != -1) { { @@ -1582,7 +1582,7 @@ bool Delete_Key_PartVal(char keyStr[], int keyLen, char partVal[], BPlusTree * _ return dRet; } -// 以下为四个对应的删除实现, 调用了上面两个函数; +// 浠ヤ笅涓哄洓涓搴旂殑鍒犻櫎瀹炵幇锛 璋冪敤浜嗕笂闈袱涓嚱鏁帮紱 bool Delete_sID2sub(int _sID, BPlusTree * _p_sID2sub) { char * sid2str = new char[5]; @@ -1741,9 +1741,9 @@ void mitnldata::Read_mitnldata(FILE * fp) } bool mitnldata::Write_mitnldata( FILE * fp, int & _size_left ) { - /* - * KeyType 需要由函数返回写入的空间大小 - */ + /* + * KeyType 闇瑕佺敱鍑芥暟杩斿洖鍐欏叆鐨勭┖闂村ぇ灏 + */ int size_lli = sizeof(long long int); int size_mKey = mKey.WriteSize(); if(_size_left < size_lli + size_mKey) return false; @@ -1815,7 +1815,7 @@ BPlusTree::BPlusTree(const char * const_tree_name, const char * _build_or_open) } this ->Initial(); insert_count = 0; - char _tree_name[1000]; + char _tree_name[1024]; memcpy(_tree_name, const_tree_name, (int)strlen(const_tree_name)); _tree_name[(int)strlen(const_tree_name)] = '\0'; int _key_chose; @@ -1843,7 +1843,7 @@ BPlusTree::BPlusTree(const char * const_tree_name, const char * _build_or_open) mRoot = new mLeafNode; mRoot ->setAddrFB( 0 ); printf("the tree called: %s\n", mTreeName); - char _treefile[500]; + char _treefile[1024]; strcpy(_treefile, mTreeName); strcat(_treefile, ".btree"); if((mfp = fopen(_treefile, "wb+")) == NULL) @@ -1874,7 +1874,7 @@ BPlusTree::BPlusTree(const char * const_tree_name, const char * _build_or_open) break; } } - char _queuefile[500]; + char _queuefile[1024]; strcpy(_queuefile, mTreeName); strcat(_queuefile, "_queue.btree"); mblockQueue.ReadQueue(_queuefile); diff --git a/KVstore/CBtreeH.h b/KVstore/CBtreeH.h index 64ca75a..0eab4d6 100644 --- a/KVstore/CBtreeH.h +++ b/KVstore/CBtreeH.h @@ -25,10 +25,10 @@ #include #define BLOCKSIZE (1 << 14)/* 16K */ -#define ORDER_V 128 /* 为简单起见,把v固定为2,实际的B+树v值应该是可配的 */ -#define MAXNUM_KEY (ORDER_V * 2) /* 内部结点中最多键个数,为2v ( 1~2v )*/ -#define MAXNUM_POINTER (ORDER_V * 2 + 1) /* 内部结点中最多指向子树的指针个数,为2v ( 1~2v )*/ -#define MAXNUM_DATA (ORDER_V * 2 + 1) /* 结点中用作定义,为2v ( 1~2v )*/ +#define ORDER_V 128 /* 涓虹畝鍗曡捣瑙侊紝鎶妚鍥哄畾涓2锛屽疄闄呯殑B+鏍憊鍊煎簲璇ユ槸鍙厤鐨 */ +#define MAXNUM_KEY (ORDER_V * 2) /* 鍐呴儴缁撶偣涓渶澶氶敭涓暟锛屼负2v ( 1~2v )*/ +#define MAXNUM_POINTER (ORDER_V * 2 + 1) /* 鍐呴儴缁撶偣涓渶澶氭寚鍚戝瓙鏍戠殑鎸囬拡涓暟锛屼负2v ( 1~2v )*/ +#define MAXNUM_DATA (ORDER_V * 2 + 1) /* 缁撶偣涓敤浣滃畾涔夛紝涓2v ( 1~2v )*/ #define TERM_NUMBER 1 #define FLAG_LEFT 5 @@ -49,8 +49,8 @@ using namespace std; enum NODE_TYPE { - NODE_TYPE_INTERNAL = 2, // 内部结点 - NODE_TYPE_LEAF = 3, // 叶子结点 + NODE_TYPE_INTERNAL = 2, // 鍐呴儴缁撶偣 + NODE_TYPE_LEAF = 3, // 鍙跺瓙缁撶偣 }; enum eletype { @@ -73,7 +73,7 @@ public: bool is_AtMem; char* sKey; int iKey; - int mLenKey; //关于是否读入\n的试验 + int mLenKey; //鍏充簬鏄惁璇诲叆\n鐨勮瘯楠 KeyType() { KeyType_Initial(); @@ -179,9 +179,9 @@ public: void ReadKey(FILE * fp); void WriteKey(FILE * fp); - /* - * 合适的功能函数 - */ + /* + * 鍚堥傜殑鍔熻兘鍑芥暟 + */ int WriteSize() { int size_mLenKey = sizeof(mLenKey); @@ -524,7 +524,7 @@ public: { Term[0][_tag] = '\0'; lenTerm[0] -= sizeof(int) + sizeof(char); - //只有一个元素时很特殊, 长度是减少4, 其余减少5 + //鍙湁涓涓厓绱犳椂寰堢壒娈婏紝 闀垮害鏄噺灏4锛 鍏朵綑鍑忓皯5 if(lenTerm[0] <= 0) flag = FLAG_ZERO; else flag = FLAG_NO_ZERO; return true; @@ -630,9 +630,10 @@ public: class mQueue { public: - static const int qLenth = 5243005; +// static const int qLenth = 5243005; /* 5*1024*1024 */ + static const int qLenth = 20971520; /* 20*1024*1024 */ int qUsed; - bool qAvailable[mQueue::qLenth];/* 5*1024*1024 */ + bool qAvailable[mQueue::qLenth]; public: mQueue() @@ -787,7 +788,7 @@ public: mNode * _pBrother = NULL; for(int i = 1; i <= _pFather ->getCount(); i ++) { - //指针匹配 + //指锟斤拷匹锟斤拷 if(_pFather ->getPointer(i) == this) { if(i == (_pFather ->getCount()) + 1) @@ -973,7 +974,7 @@ public: } } - //此函数需仔细考虑~~!! + //姝ゅ嚱鏁伴渶浠旂粏鑰冭檻~~锛侊紒 int iExist(const KeyType &_keytype) { int _ibegin = 1, _iend = getCount(); @@ -991,7 +992,7 @@ public: } if(_ibegin == _iend - 1) return -1; - // 后加可能有风险 + // 鍚庡姞鍙兘鏈夐闄 if(ItnlData[_imiddle].mKey > _keytype) { @@ -1129,17 +1130,17 @@ public: printf(" == "); } - // 插入键 -// 最左端递归向上 - bool Insert(mNode* _pmnode); - // 删除键 - int Delete(const KeyType & _keytype); - // 分裂结点 - KeyType & Split(mItnlNode* _mitnlnode); - // 结合结点 - bool Combine(mItnlNode * _pmnode); - // 从另一结点移一个元素到本结点 - bool MoveOneElement(mNode * _pmnode); + // 鎻掑叆閿 +// 鏈宸︾閫掑綊鍚戜笂 + bool Insert(mNode* _pmnode); + // 鍒犻櫎閿 + int Delete(const KeyType & _keytype); + // 鍒嗚缁撶偣 + KeyType & Split(mItnlNode* _mitnlnode); + // 缁撳悎缁撶偣 + bool Combine(mItnlNode * _pmnode); + // 浠庡彟涓缁撶偣绉讳竴涓厓绱犲埌鏈粨鐐 + bool MoveOneElement(mNode * _pmnode); }; @@ -1433,7 +1434,7 @@ public: } } -// 此两个函数对叶节点无意义 + // 姝や袱涓嚱鏁板鍙惰妭鐐规棤鎰忎箟 mNode * getPointer(int _i) { return NULL; @@ -1479,7 +1480,7 @@ public: } return -1; } -// 考虑cout = 0的情况 + // 鑰冭檻cout = 0鐨勬儏鍐 int iInsert(const KeyType & _keytype) { int _ibegin = 1, _iend = getCount(); @@ -1554,19 +1555,19 @@ public: - // 插入数据 -// 最左端递归向上 - bool Insert(const mleafdata & _leafdata); - // 删除数据 - int Delete(KeyType & _keytype); - //重载delete partval - int Delete(KeyType & _keytype, char partval[], int & pvFlag); - // 分裂结点 - KeyType & Split(mLeafNode* _mpnode); - // 结合结点 - bool Combine(mLeafNode* _mpnode); - // 重复插入 - bool dupInsert(const mleafdata & _leafdata, int _index_insert); + // 鎻掑叆鏁版嵁 +// 鏈宸︾閫掑綊鍚戜笂 + bool Insert(const mleafdata & _leafdata); + // 鍒犻櫎鏁版嵁 + int Delete(KeyType & _keytype); + //閲嶈浇delete partval + int Delete(KeyType & _keytype, char partval[], int & pvFlag); + // 鍒嗚缁撶偣 + KeyType & Split(mLeafNode* _mpnode); + // 缁撳悎缁撶偣 + bool Combine(mLeafNode* _mpnode); + // 閲嶅鎻掑叆 + bool dupInsert(const mleafdata & _leafdata, int _index_insert); }; extern mNode* ReadNode(FILE * fp, long long int _addr); @@ -1583,19 +1584,19 @@ extern bool Delete_obj2sID(char _obj_str[], int _del_sID, BPlusTree * _p_obj2sID extern bool Delete_objpID2sID(char _obj_str[], int _pID, int _del_sID, BPlusTree * _p_objpID2sID); -/* B+树数据结构 */ +/* B+鏍戞暟鎹粨鏋 */ class BPlusTree { public: - // 以下两个变量用于实现双向链表 - mLeafNode* pmLeafHead; // 头结点 - mLeafNode* pmLeafTail; // 尾结点 - mNode * mRoot; // 根结点 + // 浠ヤ笅涓や釜鍙橀噺鐢ㄤ簬瀹炵幇鍙屽悜閾捐〃 + mLeafNode* pmLeafHead; // 澶寸粨鐐 + mLeafNode* pmLeafTail; // 灏剧粨鐐 + mNode * mRoot; // 鏍圭粨鐐 mQueue mblockQueue; FILE * mfp; - char mTreeName[55]; - int mDepth; // 树的深度 + char mTreeName[1024]; + int mDepth; // 鏍戠殑娣卞害 int insert_count; void Initial(); @@ -1605,33 +1606,33 @@ public: void log(const char* _log)const; void forcheck(); - // 获取和设置根结点 - mNode * getRoot() { return mRoot; } + // 鑾峰彇鍜岃缃牴缁撶偣 + mNode * getRoot() { return mRoot; } - void setRoot(mNode * root) { mRoot = root; } - void Flush(); - // 为插入而查找叶子结点 - mLeafNode * SearchLeafNode(const KeyType & data)const; - //插入键到中间结点 - bool InsertItnlNode(mItnlNode * pNode, mNode * pSon); - // 在中间结点中删除键 - bool DeleteItnlNode(mItnlNode * pNode, KeyType & key); - // 查找指定的数据 - bool Search(KeyType & data, mleafdata & _ret); - // 插入指定的数据 - bool Insert(const mleafdata & _mleafdata); - // 删除指定的数据 - bool Delete(KeyType & data); - // 重载删除函数 - bool Delete(KeyType & data, char PartVal[]); - // 清除树 - void ClearTree(); - // 打印树 - void PrintTree(); - //读出根节点 - void ReadRoot(); - //保存树结构 - void StoreTree(); + void setRoot(mNode * root) { mRoot = root; } + void Flush(); + // 涓烘彃鍏ヨ屾煡鎵惧彾瀛愮粨鐐 + mLeafNode * SearchLeafNode(const KeyType & data)const; + //鎻掑叆閿埌涓棿缁撶偣 + bool InsertItnlNode(mItnlNode * pNode, mNode * pSon); + // 鍦ㄤ腑闂寸粨鐐逛腑鍒犻櫎閿 + bool DeleteItnlNode(mItnlNode * pNode, KeyType & key); + // 鏌ユ壘鎸囧畾鐨勬暟鎹 + bool Search(KeyType & data, mleafdata & _ret); + // 鎻掑叆鎸囧畾鐨勬暟鎹 + bool Insert(const mleafdata & _mleafdata); + // 鍒犻櫎鎸囧畾鐨勬暟鎹 + bool Delete(KeyType & data); + // 閲嶈浇鍒犻櫎鍑芥暟 + bool Delete(KeyType & data, char PartVal[]); + // 娓呴櫎鏍 + void ClearTree(); + // 鎵撳嵃鏍 + void PrintTree(); + //璇诲嚭鏍硅妭鐐 + void ReadRoot(); + //淇濆瓨鏍戠粨鏋 + void StoreTree(); }; #endif /* CBTREE_H_ */