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); } }
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); } } }
public RadixTree() { Root = new RadixTreeNode(0); }