diff --git a/btree.cpp b/btree.cpp index 970b6d0..dafb9e2 100644 --- a/btree.cpp +++ b/btree.cpp @@ -1,6 +1,7 @@ #include #include #include "btree.h" +#include "btree_consts.h" bool operator ==(uPtr u1, uPtr u2) { @@ -20,6 +21,43 @@ return ((sizeof(uPtr) + keyLength + 7) >> 3) << 3; } // bTree::align +uPtr +bTree::allocEmptyNode(void) { + struct TbNode * newNode = NULL; + uPtr result; + + saveSuperBlock(); + setNull(result); + + if (!isNull(getFirstDeleted())) { + newNode = loadPage(getFirstDeleted()); + if (newNode == NULL) return result; + setFirstDeleted(newNode->parent); + } else { + newNode = static_cast(calloc(1, info->bNodeSize)); + setNodes(getNodes() + 1); + newNode->tag = getNodes(); + } // else + + newNode->magic = B_NODE_LEAF; + newNode->numKeys = 1; + newNode->size = (int)&newNode->data - (int)newNode; + + // these should really be setNull() calls, but gcc doesn't support it. + // GNU bastards. Die. Die. Die. + + newNode->left.offset = 0; + newNode->right.offset = 0; + newNode->parent.offset = 0; + newNode->reserved.offset = 0; + + result = getAddress(newNode); + savePage(newNode); + discardPage(newNode); + + return result; +} // bTree::allocEmptyNode + int bTree::calcSize(TbNode * node) { int size; diff --git a/btree.h b/btree.h index 848d12a..0cf6ccc 100644 --- a/btree.h +++ b/btree.h @@ -16,6 +16,7 @@ bool treeChanged; int align(int); + uPtr allocEmptyNode(void); int calcSize(TbNode *); void discardPage(TbNode *); bool isNull(uPtr); diff --git a/btree_consts.h b/btree_consts.h new file mode 100644 index 0000000..b22c7c8 --- /dev/null +++ b/btree_consts.h @@ -0,0 +1,9 @@ +#ifndef BTREE_CONSTS_H +#define BTREE_CONSTS_H + +#define B_NODE_LEAF 0x4641454C; // LEAF +#define B_NODE_INDEX 0x58444E49; // INDX +#define B_NODE_OPEN 0x4E45504F; // OPEN +#define B_NODE_TREEINFO 0x4F464E4945455254; // TREEINFO + +#endif