public PageTrailer(byte[] buffer, int offset)
        {
            ptype = (PageTypeName)buffer[offset + 0];
            PageTypeName ptypeRepeat = (PageTypeName)buffer[offset + 1];

            wSig  = LittleEndianConverter.ToUInt16(buffer, offset + 2);
            dwCRC = LittleEndianConverter.ToUInt32(buffer, offset + 4);
            bid   = new BlockID(buffer, offset + 8);
        }
Exemple #2
0
        public static BTreeIndexPage GetEmptyIndexPage(PageTypeName pageType, int cLevel)
        {
            BTreeIndexPage page = new BTreeIndexPage();

            page.pageTrailer.ptype = pageType;
            page.cbEnt             = BTreeIndexEntry.Length;
            page.cEntMax           = MaximumNumberOfEntries;
            page.cLevel            = (byte)cLevel;
            return(page);
        }
Exemple #3
0
        public static BTreePage ReadFromStream(Stream stream, BlockRef blockRef)
        {
            long offset = (long)blockRef.ib;

            stream.Seek(offset, SeekOrigin.Begin);
            byte[] buffer = new byte[Length];
            stream.Read(buffer, 0, Length);
            PageTypeName ptype = (PageTypeName)buffer[PageTrailer.OffsetFromPageStart + 0];
            BTreePage    page;
            byte         cLevel = buffer[491];

            if (cLevel > 0)
            {
                // If cLevel is greater than 0, then each entry in the array is of type BTENTRY.
                page = new BTreeIndexPage(buffer);
            }
            else
            {
                // If cLevel is 0, then each entry is either of type BBTENTRY or NBTENTRY, depending on the ptype of the page.
                if (ptype == PageTypeName.ptypeBBT)
                {
                    page = new BlockBTreeLeafPage(buffer);
                }
                else if (ptype == PageTypeName.ptypeNBT)
                {
                    page = new NodeBTreeLeafPage(buffer);
                }
                else
                {
                    throw new ArgumentException("BTreePage has incorrect ptype");
                }
            }
            page.Offset = (ulong)blockRef.ib;
            if (blockRef.bid.Value != page.BlockID.Value)
            {
                throw new InvalidBlockIDException();
            }
            uint crc = PSTCRCCalculation.ComputeCRC(buffer, PageTrailer.OffsetFromPageStart);

            if (page.pageTrailer.dwCRC != crc)
            {
                throw new InvalidChecksumException();
            }

            uint signature = BlockTrailer.ComputeSignature(blockRef.ib, blockRef.bid.Value);

            if (page.pageTrailer.wSig != signature)
            {
                throw new InvalidChecksumException();
            }
            return(page);
        }