public TableVersion(int version, Field[] structure, PageFileIOMode mode) { Version = version; Structure = structure; Mode = mode; for (int i = 0; i < Structure.Length; ++i) { var str = Structure[i]; str.Id = i; str.Offset = RecordSize; HasStorage |= str.IsStorage; RecordSize += str.Size; } // crc32 if ((Mode & PageFileIOMode.CRC32) == PageFileIOMode.CRC32) { RecordSize += 4 /*crc32*/ + 8 /*last write date-time*/; } else { RecordSize += 8 /*last write date-time*/; } }
public PageFile(string fullPath, int pageSize, PageFileIOMode ioMode) { this.fullPath = fullPath; this.pageSize = pageSize; this.ioMode = ioMode; Capacity = 1000; locker = new ValueLock(); Key = fullPath.CalculateHashString(); poolReaders = new Pool<PageFileReader>(); poolWriters = new Pool<PageFileWriter>(); var inf = new FileInfo(fullPath); // Создаем заголовок файла. if (!inf.Exists) { //fullPath.CheckPath(); stream = CreateStream(); stream.SetLength(HeaderSize + Capacity * pageSize); InitFile(); header[1] = pageSize; } else if (inf.Length < HeaderSize) { throw new Exception("File corrupt."); } else { stream = CreateStream(); InitFile(); if (header[1] != pageSize) { throw new Exception("Wrong page size."); } } if (inf.IsReadOnly) { inf.IsReadOnly = false; } deleted = new UInt32Stack(fullPath + ".del"); }
public PageFileWriter(FileStream stream, int size, PageFileIOMode mode) { this.stream = stream; this.size = size; this.mode = mode; if (mode == PageFileIOMode.Standart) { buf = new byte[8]; } else { buf = new byte[12]; } Crc32 = new CRC32(); }