static int increaseHeight()

in hfs/btree.c [1259:1320]


static int increaseHeight(BTree* tree, uint32_t newNode) {
  uint32_t oldRoot;
  uint32_t newRoot;
  BTNodeDescriptor newDescriptor;
  
  BTKey* oldRootKey;
  BTKey* newNodeKey;
  
  uint16_t oldRootOffset;
  uint16_t newNodeOffset;
  uint16_t freeOffset;
   
  oldRoot = tree->headerRec->rootNode;
  
  oldRootKey = READ_KEY(tree, (oldRoot * tree->headerRec->nodeSize) + 14, tree->io);
  newNodeKey = READ_KEY(tree, (newNode * tree->headerRec->nodeSize) + 14, tree->io);
  
  newRoot = getNewNode(tree);
  
  newDescriptor.fLink = 0;
  newDescriptor.bLink = 0;
  newDescriptor.kind = kBTIndexNode;
  newDescriptor.height = tree->headerRec->treeDepth + 1;
  newDescriptor.numRecords = 2;
  newDescriptor.reserved = 0;
  
  oldRootOffset = 14;
  newNodeOffset = oldRootOffset + sizeof(oldRootKey->keyLength) + oldRootKey->keyLength + sizeof(uint32_t);
  freeOffset = newNodeOffset + sizeof(newNodeKey->keyLength) + newNodeKey->keyLength + sizeof(uint32_t);
  
  tree->headerRec->rootNode = newRoot;
  tree->headerRec->treeDepth = newDescriptor.height;
  
  ASSERT(WRITE_KEY(tree, newRoot * tree->headerRec->nodeSize + oldRootOffset, oldRootKey, tree->io), "WRITE_KEY");
  FLIPENDIAN(oldRoot);
  ASSERT(WRITE(tree->io, newRoot * tree->headerRec->nodeSize + oldRootOffset + sizeof(oldRootKey->keyLength) + oldRootKey->keyLength,
                  sizeof(uint32_t), &oldRoot), "WRITE");

  ASSERT(WRITE_KEY(tree, newRoot * tree->headerRec->nodeSize + newNodeOffset, newNodeKey, tree->io), "WRITE_KEY");
  FLIPENDIAN(newNode);
  ASSERT(WRITE(tree->io, newRoot * tree->headerRec->nodeSize + newNodeOffset + sizeof(newNodeKey->keyLength) + newNodeKey->keyLength,
                  sizeof(uint32_t), &newNode), "WRITE");
  
  FLIPENDIAN(oldRootOffset);
  ASSERT(WRITE(tree->io, (newRoot * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 1),
                  sizeof(uint16_t), &oldRootOffset), "WRITE");
  
  FLIPENDIAN(newNodeOffset);
  ASSERT(WRITE(tree->io, (newRoot * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 2),
                  sizeof(uint16_t), &newNodeOffset), "WRITE");
                  
  FLIPENDIAN(freeOffset);
  ASSERT(WRITE(tree->io, (newRoot * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 3),
                  sizeof(uint16_t), &freeOffset), "WRITE");

  ASSERT(writeBTNodeDescriptor(&newDescriptor, tree->headerRec->rootNode, tree), "writeBTNodeDescriptor");
  ASSERT(writeBTHeaderRec(tree), "writeBTHeaderRec");

  free(oldRootKey);
  free(newNodeKey); 
  return TRUE;
}