Example #1
0
        private IRadixTreeNode NodeFromBytes(byte[] nodeBytes)
        {
            var result = new RadixTreeNode(0);

            using (var ms = new MemoryStream(nodeBytes, false))
            {
                var buffer = new byte[PageFormatter.OnPagePointerSize];

                ms.Read(buffer, 0, PageFormatter.OnPagePointerSize); // overall size

                ms.Read(buffer, 0, PageFormatter.OnPagePointerSize); // prefix length
                short prefixLength = BitConverter.ToInt16(buffer, 0);
                var   prefix       = new byte[prefixLength];
                ms.Read(prefix, 0, prefixLength); // prefix itself
                result.Prefix              = prefix;
                result.ValueReference      = DbItemReference.Read(ms);
                result.ParentNodeReference = DbItemReference.Read(ms);

                if (DbItemReference.IsNull(result.ValueReference))
                {
                    result.ValueReference = null;
                }
                if (DbItemReference.IsNull(result.ParentNodeReference))
                {
                    result.ParentNodeReference = null;
                }

                ms.Read(buffer, 0, sizeof(short));
                var nodeCount = BitConverter.ToInt16(buffer, 0);
                for (int i = 0; i < nodeCount; i++)
                {
                    var key   = (byte)ms.ReadByte();
                    var value = DbItemReference.Read(ms);
                    result.Entries.Add(new KeyValuePair <byte, DbItemReference>(key, value));
                }

                return(result);
            }
        }
Example #2
0
        private void CheckRoot()
        {
            if (_rootNodeReference == null)
            {
                var headerPage = _pageManager.FetchPage(0);

                _rootPageIndex = ((HeadingPageHeader)PageFormatter.GetPageHeader(headerPage)).AccessMethodPageIndex;
                var page = _pageManager.FetchPage(_rootPageIndex);

                var items = PageFormatter.ReadVariableSizeItems(page);
                if (items.Any())
                {
                    // root page already has an item
                    _rootNodeReference = new DbItemReference(_rootPageIndex, 0);
                }
                else
                {
                    var node = new RadixTreeNode(256);
                    PageFormatter.AddVariableSizeItem(page, GetNodeBytes(node, GetNodeSize(0, 256)));
                    _rootNodeReference = new DbItemReference(_rootPageIndex, 0);
                    _pageManager.UpdatePage(page);
                }
            }
        }
Example #3
0
 public RadixTree()
 {
     Root = new RadixTreeNode(0);
 }