public void Read(Stream data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } var reader = new UnityReader(data); Header = new DatabaseHeader(reader); byte[] buffer = reader.ReadBytes(Header.CompressedSize); byte[] uncompressed = LZ4Codec.Decode(buffer, 0, buffer.Length, Header.UncompressedSize); using (var ms = new MemoryStream(uncompressed)) { UnityReader lz4Reader = new UnityReader(ms); int classCount = lz4Reader.ReadInt32(); Classes = new TypeClass[classCount]; for (int i = 0; i < classCount; i++) { Classes[i] = new TypeClass(lz4Reader, this); } lz4Reader.Position = Header.StringTablePosition; _stringTable = lz4Reader.ReadStringFixed(Header.StringTableLength, Encoding.ASCII); } }
public void WriteAndReadHeader() { using MemoryFileSystemService service = new MemoryFileSystemService(new DatatentSettings(), Constants.DATABASE_HEADER_SIZE * 5, new NullLogger <FileSystemServiceBase>()); DatabaseHeader expected = new DatabaseHeader(1, new DataProcessingInformations(Guid.NewGuid(), Guid.NewGuid())); service.WriteDatabaseHeader(ref expected); DatabaseHeader result = service.ReadDatabaseHeader(); result.Identifier.Should().Be(result.Identifier); result.Version.Should().Be(result.Version); result.DataProcessingInformations.CompressionServiceId.Should().NotBeEmpty(); }
private void Initialize() { Header = DatabaseHeader.Parse(_reader); // Database Size in pages adjustment // https://www.sqlite.org/fileformat.html#in_header_database_size uint expectedPages = (uint)(_reader.Length / Header.PageSize); // TODO: Warn on mismatch _sizeInPages = Math.Max(expectedPages, Header.DatabaseSizeInPages); _reader.ApplySqliteDatabaseHeader(Header); }
internal void ApplySqliteDatabaseHeader(DatabaseHeader header) { PageSize = header.PageSize; ReservedSpace = header.ReservedSpaceAtEndOfPage; TextEncoding = header.TextEncoding; switch (TextEncoding) { case SqliteEncoding.UTF8: _encoding = Encoding.UTF8; break; case SqliteEncoding.UTF16LE: _encoding = Encoding.Unicode; break; case SqliteEncoding.UTF16BE: _encoding = Encoding.BigEndianUnicode; break; default: throw new ArgumentOutOfRangeException(); } }
private void InitNew() { var header = new DatabaseHeader(Constants.VERSION, _processingPipeline.GetInformations()); _fileSystemService.WriteDatabaseHeader(ref header); }