diff --git a/btree.cpp b/btree.cpp index a49237f..d746a80 100644 --- a/btree.cpp +++ b/btree.cpp @@ -36,6 +36,16 @@ return size; } // bTree::calcSize +void +bTree::discardPage(TbNode *) { + +} // bTree::discardPage + +bool +bTree::isNull(uPtr u) { + return (u.offset == 0); +} // bTree::isNull + uPtr bTree::getFirstDeleted(void) { @@ -97,6 +107,29 @@ return info->root; } // bTree::getRoot +TbNode * +bTree::loadPage(uPtr u) { + TbNode * node; + + if (isNull(u)) return NULL; + + if (memoryTree) + node = u.bPtr; + else { + if (!vfs->fSeek((int)u.offset * info->bNodeSize)) exit(42); + node = (TbNode *)malloc(info->bNodeSize); + if (node == NULL) return NULL; + if (!vfs->fRead(node, info->bNodeSize)) exit(42); + } // else + + return node; +} // bTree::loadPage + +void +bTree::savePage(TbNode *) { + +} // bTree::savePage + void bTree::setFirstDeleted(uPtr value) { info->firstDeleted = value; @@ -104,7 +137,7 @@ if (!vfs->fSeek((int)&info->firstDeleted - (int)info)) exit(42); if (!vfs->fWrite(&info->firstDeleted, sizeof(info->firstDeleted))) exit(42); } // if not memoryTree - return; + } // bTree::setFirstDeleted void @@ -115,7 +148,7 @@ if (!vfs->fSeek((int)&info->nodes - (int)info)) exit(42); if (!vfs->fWrite(&info->nodes, sizeof(info->nodes))) exit(42); } // if not memoryTree - return; + } // bTree::setNodes void @@ -126,7 +159,7 @@ if (!vfs->fSeek((int)&info->height - (int)info)) exit(42); if (!vfs->fWrite(&info->height, sizeof(info->height))) exit(42); } // if not memoryTree - return; + } // bTree::setHeight void @@ -137,9 +170,39 @@ if (!vfs->fSeek((int)&info->keys - (int)info)) exit(42); if (!vfs->fWrite(&info->keys, sizeof(info->keys))) exit(42); } // if not memoryTree - return; + } // bTree::getKeys +void +bTree::setLeft(uPtr u, uPtr newPtr) { + TbNode * node = loadPage(u); + if (node == NULL) return; + + node->left = newPtr; + savePage(node); + discardPage(node); +} // bTree::setLeft + +void +bTree::setParent(uPtr u, uPtr newPtr) { + TbNode * node = loadPage(u); + if (node == NULL) return; + + node->parent = newPtr; + savePage(node); + discardPage(node); +} // bTree::setParent + +void +bTree::setRight(uPtr u, uPtr newPtr) { + TbNode * node = loadPage(u); + if (node == NULL) return; + + node->right = newPtr; + savePage(node); + discardPage(node); +} // bTree::setRight + void bTree::setRoot(uPtr value) { info->root = value; diff --git a/btree.h b/btree.h index 2ac268e..736b71c 100644 --- a/btree.h +++ b/btree.h @@ -17,18 +17,28 @@ int align(int); int calcSize(TbNode *); + void discardPage(TbNode *); + bool isNull(uPtr); uPtr getFirstDeleted(void); uInt32 getNodes(void); uInt32 getHeight(void); uInt32 getKeys(void); uPtr getRoot(void); + TbNode * loadPage(uPtr); + void savePage(TbNode *); + void setFirstDeleted(uPtr); void setNodes(uInt32); void setHeight(uInt32); void setKeys(uInt32); + void setLeft(uPtr, uPtr); + void setParent(uPtr, uPtr); + void setRight(uPtr, uPtr); void setRoot(uPtr); void setNull(uPtr &); + + public: bTree(char *, uInt32, treeTypes, bTreeVFS *); void InstallUserFunctions(compareKeyFunc, copyKeyProc, keySizeFunc); diff --git a/btree_types.h b/btree_types.h index e2d14b6..53a80ba 100644 --- a/btree_types.h +++ b/btree_types.h @@ -20,12 +20,15 @@ typedef TblockRun inodeAddr; +struct TbNode; + typedef union { int32 i; uInt32 u; float f; double d; - void * p; + void * p; + TbNode * bPtr; inodeAddr iAddr; int64 offset; } uPtr;