예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
                    }
                }
            }
        }
예제 #3
0
        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);
        }