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); }
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); }
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); }