public static BTreeHeader Parse(ReaderBase reader)
        {
            reader.CheckSize(8);

            BTreeHeader res = new BTreeHeader();

            res.Type             = (BTreeType)reader.ReadByte();
            res.FirstFreeBlock   = reader.ReadUInt16();
            res.CellCount        = reader.ReadUInt16();
            res.CellContentBegin = reader.ReadUInt16();
            res.CellContentFragmentedFreeBytes = reader.ReadByte();

            if (res.Type == BTreeType.InteriorIndexBtreePage || res.Type == BTreeType.InteriorTableBtreePage)
            {
                reader.CheckSize(sizeof(uint));

                res.RightMostPointer = reader.ReadUInt32();
            }

            return(res);
        }
        internal static DatabaseHeader Parse(ReaderBase reader)
        {
            // The header is 100 bytes
            reader.CheckSize(100);

            reader.CheckMagicBytes(_expectedHeader);

            // Read header
            DatabaseHeader res = new DatabaseHeader();

            res.PageSize                       = reader.ReadUInt16();
            res.WriteVersion                   = (FileWriteVersion)reader.ReadByte();
            res.ReadVersion                    = (FileReadVersion)reader.ReadByte();
            res.ReservedSpaceAtEndOfPage       = reader.ReadByte();
            res.MaximumEmbeddedPayloadFraction = reader.ReadByte();
            res.MinimumEmbeddedPayloadFraction = reader.ReadByte();
            res.LeafPayloadFraction            = reader.ReadByte();
            res.ChangeCounter                  = reader.ReadUInt32();

            res.DatabaseSizeInPages    = reader.ReadUInt32();
            res.FirstFreelistTrunkPage = reader.ReadUInt32();
            res.FreeListPages          = reader.ReadUInt32();
            res.SchemaCookie           = reader.ReadUInt32();
            res.SchemaFormat           = reader.ReadUInt32();
            res.DefaultPageCacheSize   = reader.ReadUInt32();
            res.Value7                = reader.ReadUInt32();
            res.TextEncoding          = (SqliteEncoding)reader.ReadUInt32();
            res.UserVersion           = reader.ReadUInt32();
            res.IncrementalVacuumMode = reader.ReadUInt32();
            res.ApplicationId         = reader.ReadUInt32();

            reader.Skip(20);

            res.VersionValidFor = reader.ReadUInt32();
            res.Version         = reader.ReadUInt32();

            // TODO: Warn/err on mismatch with expected values

            return(res);
        }