Exemple #1
0
        // Попытка запустить базу данных
        public void Start()
        {
            try
            {
                ValueLock.Lock(ref locker);

                if (Status != DatabaseStatus.Ready)
                {
                    return;
                }

                GetStatus();

                if (Status == DatabaseStatus.Ready)
                {
                    Storage = new ArrayStorage(DirectoryPath + "DefaultStorage.sto");
                    Index   = new Index(DirectoryPath + "DefaultIndex.ind");

                    OnStart();

                    Status = DatabaseStatus.Started;
                }
            }
            finally
            {
                locker = 0;
            }
        }
        internal PageWriter(int page, int count, PageFile file, ArrayStorage ars)
        {
            pageSize = file.PageSize;
            buf      = new byte[pageSize];
            stream   = file.CreateStream(FileAccess.Write);

            this.file = file;
            this.ars  = ars;

            Init(page, count);
        }
        internal PageReader(int page, int count, PageFile file, ArrayStorage storage)
        {
            this.file = file;

            pageSize = file.PageSize;
            stream   = file.CreateStream(FileAccess.Read);
            buf      = new byte[pageSize];
            ars      = storage;


            Init(page, count);
        }
            // Восстановление таблицы из бекапа
            internal bool RestoreTable(ITable itm, ArrayStorage storage, BinaryReaderCRC32 sm, FileStream sd, Log log)
            {
                if (sm.Stream.Position != Offset)
                {
                    sm.Stream.Position = Offset;
                }

                //Debug.WriteLine("Restore " + itm.Key);

                itm.File.SetCount(Count);

                var flag   = true;
                var wtr    = itm.File.CreateStream();
                var sd_br  = new BinaryReader(sd);
                var crc    = new CRC32();
                var crcerr = 0;
                var hasCRC = (itm.CurrentVersion.Mode & PageFileIOMode.CRC32) == PageFileIOMode.CRC32;
                var size   = RecordSize;

                if (!hasCRC)
                {
                    size += size_crc;
                }

                var buf  = new byte[size];
                var list = new List <byte[]>();

                try
                {
                    if (itm.Key == "Users")
                    {
                        int bp = 0;
                    }

                    var sw = Stopwatch.StartNew();

                    //if (itm.Key == "Regions")
                    //{
                    //    int bp = 0;
                    //}

                    // Если есть массивыв переменной длинны
                    if (HasStorage)
                    {
                        // i + 1 - это код
                        for (var i = 0; i < Count; ++i)
                        {
                            var offset = sm.ReadInt64();

                            //Debug.WriteLine("Restore " + itm.Key + ", code: " + (i + 1) + ", offset:" + offset);

                            if (i + 1 == 1350685)
                            {
                                var bp = 0;
                            }

                            if (sd.Position != offset)
                            {
                                sd.Position = offset;
                            }

                            var time = sd_br.ReadInt64();

                            // Проверяем на удаление
                            if (time < 0)
                            {
                                itm.File.deleted.Push(i + 1);

                                continue;
                            }
                            else
                            {
                                // обновляем crc времени
                                crc.Update(time);
                            }

                            list.Clear();

                            // Считаем CRC
                            for (var j = 0; j < Fields.Count; ++j)
                            {
                                var fld = Fields[j];

                                if (fld.IsStorage)
                                {
                                    //Debug.WriteLine("Restore " + itm.Key + ", code: " + (i + 1) + ", field: " + fld.Name + " pos: " + sd.Position);

                                    var len = sd_br.ReadInt32();
                                    var tmp = new byte[len];

                                    sd.Read(tmp, 0, len);

                                    crc.Update(len);
                                    crc.Update(tmp, 0, tmp.Length);

                                    list.Add(tmp);
                                }
                                else
                                {
                                    var off = fld.Offset;

                                    switch (fld.Size)
                                    {
                                    case 1:
                                    {
                                        var val = sd_br.ReadByte();

                                        buf[off] = val;

                                        crc.Update(val);

                                        break;
                                    }

                                    case 2:
                                    {
                                        var val = sd_br.ReadChar();

                                        fixed(byte *ptr = &buf[off])
                                        {
                                            var tmp = (char *)ptr;

                                            *tmp = val;
                                        }

                                        crc.Update(val);

                                        break;
                                    }

                                    case 4:
                                    {
                                        var val = sd_br.ReadUInt32();

                                        fixed(byte *ptr = &buf[off])
                                        {
                                            var tmp = (uint *)ptr;

                                            *tmp = val;
                                        }

                                        crc.Update(val);

                                        break;
                                    }

                                    case 8:
                                    {
                                        var val = sd_br.ReadUInt64();

                                        fixed(byte *ptr = &buf[off])
                                        {
                                            var tmp = (ulong *)ptr;

                                            *tmp = val;
                                        }

                                        crc.Update(val);

                                        break;
                                    }

                                    case 16:
                                    {
                                        var val = sd_br.ReadDecimal();

                                        fixed(byte *ptr = &buf[off])
                                        {
                                            var tmp = (decimal *)ptr;

                                            *tmp = val;
                                        }

                                        crc.Update(val);

                                        break;
                                    }
                                    }
                                }
                            }

                            // Проверяем crc массивов
                            var crc2 = sd_br.ReadInt32();

                            if (crc.Value != crc2)
                            {
                                flag = false;

                                crc.Reset();

                                crcerr++;

                                if (crcerr < 10)
                                {
                                    log.Append("Record code: " + (i + 1) + " error crc32 array check.\r\n");
                                }

                                continue;
                            }

                            // Записываем массивы
                            var n = 0;

                            for (var j = 0; j < Fields.Count; ++j)
                            {
                                var fld = Fields[j];

                                if (fld.IsStorage)
                                {
                                    var tmp = list[n++];
                                    var key = storage.WriteBuffer(0, tmp);

                                    fixed(byte *b = &buf[fld.Offset])
                                    {
                                        var ptr = (long *)b;

                                        *ptr = key;
                                    }

                                    //if (itm.Key == "Users" && i == 0 && fld.Name == "Awatar")
                                    //{
                                    //    DataBase.TestKey = key;
                                    //    DataBase.TestString = System.Text.Encoding.Unicode.GetString(tmp);
                                    //}
                                }
                            }

                            var wtr_offset = PageFile.HeaderSize + (i + 1) * itm.CurrentVersion.RecordSize;

                            //Debug.WriteLine("Write pos: " + wtr_offset);

                            // Устанавливаем позицию
                            if (wtr.Position != wtr_offset)
                            {
                                wtr.Position = wtr_offset;
                            }

                            // Записываем запись
                            if (hasCRC)
                            {
                                crc.Reset();

                                fixed(byte *ptr = &buf[size - size_time_crc])
                                {
                                    var tmp = (long *)ptr;

                                    *tmp = time;
                                }

                                crc.Update(buf, 0, size - size_crc);

                                fixed(byte *ptr = &buf[size - size_crc])
                                {
                                    var tmp = (int *)ptr;

                                    *tmp = crc.Value;
                                }

                                // Данные, время и CRC
                                wtr.Write(buf, 0, size);
                            }
                            else
                            {
                                fixed(byte *ptr = &buf[size - size_time_crc])
                                {
                                    var tmp = (long *)ptr;

                                    *tmp = time;
                                }

                                // Данные и время
                                wtr.Write(buf, size_time, size - size_crc);
                            }

                            crc.Reset();

                            //if (i > 0 && i%100000 == 0)
                            //{
                            //    log.Append("Progresss : ", i, "\r\n");
                            //}
                            if (sw.ElapsedMilliseconds >= 1000)
                            {
                                log.Append("Progresss : ", i, ", ", (i * 100) / Count, "% \r\n");

                                sw.Restart();
                            }
                        }
                    }
                    else
                    {
                        for (var i = 0; i < Count; ++i)
                        {
                            if (i + 1 == 1350685)
                            {
                                var bp = 0;
                            }

                            var offset = sm.ReadInt64();

                            //Debug.WriteLine("Restore " + itm.Key + ", code: " + (i + 1) + ", offset:" + offset);

                            if (sd.Position != offset)
                            {
                                sd.Position = offset;
                            }

                            // Читаем запись
                            sd.Read(buf, 0, size);

                            // Проверяем на удаление
                            fixed(byte *b = &buf[0])
                            {
                                var ptr = (long *)b;

                                if (*ptr < 0)
                                {
                                    itm.File.deleted.Push(i + 1);

                                    continue;
                                }
                                else
                                {
                                    // обновляем crc времени
                                    crc.Update(*ptr);
                                }
                            }

                            // обновляем crc данных
                            crc.Update(buf, size_time, size - size_time_crc);

                            // Проверяем crc данных
                            fixed(byte *b = &buf[size - size_crc])
                            {
                                var ptr = (int *)b;

                                if (crc.Value != *ptr)
                                {
                                    flag = false;

                                    crc.Reset();

                                    crcerr++;

                                    if (crcerr < 10)
                                    {
                                        log.Append("Record code: " + (i + 1) + " error crc32 data check.\r\n");
                                    }

                                    continue;
                                }
                            }

                            var wtr_offset = PageFile.HeaderSize + (i + 1) * itm.CurrentVersion.RecordSize;

                            // Устанавливаем позицию записи
                            if (wtr.Position != wtr_offset)
                            {
                                wtr.Position = wtr_offset;
                            }

                            // Записываем запись
                            if (hasCRC)
                            {
                                // Пересчитываем crc под формат бд
                                crc.Reset();
                                crc.Update(buf, size_time, size - size_time_crc);
                                crc.Update(buf, 0, size_time);

                                fixed(byte *ptr = &buf[size - size_crc])
                                {
                                    var tmp = (int *)ptr;

                                    *tmp = crc.Value;
                                }

                                // Данные
                                wtr.Write(buf, size_time, size - size_time_crc);
                                // Время
                                wtr.Write(buf, 0, size_time);
                                // CRC
                                wtr.Write(buf, size - size_crc, size_crc);
                            }
                            else
                            {
                                // Данные
                                wtr.Write(buf, size_time, size - size_time_crc);
                                // Время
                                wtr.Write(buf, 0, size_time);
                            }

                            crc.Reset();

                            //if (i > 0 && i%100000 == 0)
                            //{
                            //    log.Append("Progresss : ", i, "\r\n");
                            //}
                            if (sw.ElapsedMilliseconds >= 1000)
                            {
                                log.Append("Progresss : ", i, ", ", (i * 100) / Count, "% \r\n");

                                sw.Restart();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    log.Append("Exception: ");
                    log.Append(ex.Message);
                }
                finally
                {
                    wtr.Flush();
                    wtr.Close();
                }

                return(flag);
            }
Exemple #5
0
 public ReaderCRC32(int page, int count, PageFile file, ArrayStorage storage) : base(page, count, file, storage)
 {
     this.crc32 = new CRC32();
 }
Exemple #6
0
 internal WriterCRC32(int page, int count, PageFile file, ArrayStorage ars) : base(page, count, file, ars)
 {
     this.crc32 = new CRC32();
 }