public void UpdateSubnodeEntry(NodeID subnodeID, DataTree dataTree, SubnodeBTree subnodeBTree) { SubnodeLeafEntry entry = GetLeafEntry(subnodeID.Value); if (entry != null) { entry.bidData = new BlockID(0); if (dataTree != null && dataTree.RootBlock != null) { entry.bidData = dataTree.RootBlock.BlockID; } entry.bidSub = new BlockID(0); if (subnodeBTree != null && subnodeBTree.RootBlock != null) { entry.bidSub = subnodeBTree.RootBlock.BlockID; } // We have to store the new leaf block, and cascade the changes up to the root block SubnodeLeafBlock leafBlock = FindLeafBlock(entry.nid.Value); // leafBlock cannot be null int index = leafBlock.IndexOfLeafEntry(subnodeID.Value); leafBlock.rgentries[index] = entry; UpdateBlockAndReferences(leafBlock); } }
public void DeleteSubnodeEntry(NodeID subnodeID) { SubnodeLeafBlock leafBlock = FindLeafBlock(subnodeID.Value); if (leafBlock != null) { int index = leafBlock.IndexOfLeafEntry(subnodeID.Value); if (index >= 0) { leafBlock.rgentries.RemoveAt(index); if (leafBlock.rgentries.Count == 0) { // We will only delete the root during SaveChanges() // [We want to avoid setting the root to null, because we may still use it before changes are saved] if (m_rootBlock is SubnodeIntermediateBlock) { int indexOfBlock = ((SubnodeIntermediateBlock)m_rootBlock).GetIndexOfBlockID(leafBlock.BlockID.Value); ((SubnodeIntermediateBlock)m_rootBlock).rgentries.RemoveAt(indexOfBlock); UpdateBlock(m_rootBlock); DeleteBlock(leafBlock); } else { UpdateBlockAndReferences(leafBlock); } } else { UpdateBlockAndReferences(leafBlock); } } } }
public SubnodeLeafEntry GetLeafEntry(uint subnodeID) { Block block = FindLeafBlock(subnodeID); if (block is SubnodeLeafBlock) { SubnodeLeafBlock leafBlock = (SubnodeLeafBlock)block; int index = leafBlock.IndexOfLeafEntry(subnodeID); if (index >= 0) { return(leafBlock.rgentries[index]); } } return(null); }