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*/;
            }
        }
Example #2
0
        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();
        }