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