private void BuildDataTree(Block block, ref long offset) { var level = block.Data[1]; if (level != 0x01 && level != 0x02) { throw new Exception("Invalid level"); } var numEntities = block.Data.Segment(2, 2).ToUInt16(); for (var i = 0; i < numEntities; i++) { var bid = new Bid(block.Data.Segment(8 + i * 8, 8).ToUInt64()); if (level == 0x02) { var b = _reader.FindBlock(bid); BuildDataTree(b, ref offset); } else { var b = _reader.LookupBlock(bid); _dataTree.Add(new DataTreeItem(offset, bid)); offset += b.Length; } } }
private void Initialize() { var block = _reader.FindBlock(_node.DataBid); if (_node.DataBid.Type == BlockType.Internal) { BuildDataTreePages(block); ClientSignature = _pages[0].Data[3]; UserRoot = _pages[0].Data.Derive(4, 4).ToUInt32(); } else { _pages.Add(new HeapPage(block.Data)); ClientSignature = block.Data[3]; UserRoot = block.Data.Segment(4, 4).ToUInt32(); } }
public State(Bid initialBid, IPstReader reader) { _reader = reader; var block = _reader.FindBlock(initialBid); if (initialBid.Type == BlockType.External) { _dataTree.Add(new DataTreeItem(0, initialBid)); TotalLength = block.Length; } else if (block.Data[0] == 0x01) // data tree { TotalLength = block.Data.Segment(4, 4).ToUInt32(); long offset = 0; BuildDataTree(block, ref offset); } else { throw new Exception("Invalid block data"); } }