Ejemplo n.º 1
0
        internal static BTreePage Parse(ReaderBase reader, uint page)
        {
            // Read header
            reader.SeekPage(page);

            if (page == 1)
            {
                // Skip the first 100 bytes
                reader.Skip(DatabaseHeader.HeaderSize);
            }

            BTreeHeader header = BTreeHeader.Parse(reader);

            // Read cells
            ushort[] cellOffsets = new ushort[header.CellCount];

            for (ushort i = 0; i < header.CellCount; i++)
            {
                cellOffsets[i] = reader.ReadUInt16();
            }

            Array.Sort(cellOffsets);

            BTreePage res;

            switch (header.Type)
            {
            case BTreeType.InteriorIndexBtreePage:
                throw new ArgumentOutOfRangeException();

            case BTreeType.InteriorTableBtreePage:
                res = new BTreeInteriorTablePage(reader, page, header, cellOffsets);
                break;

            case BTreeType.LeafIndexBtreePage:
                throw new ArgumentOutOfRangeException();

            case BTreeType.LeafTableBtreePage:
                res = new BTreeLeafTablePage(reader, page, header, cellOffsets);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            res.ParseInternal();

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