Example #1
0
        /// <summary>Синхронизация репозитория</summary>
        public CsvRepository <T> Sync()
        {
            // Очистка предыдущих значений записей
            _records.Clear();
            _recordsByName.Clear();

            // Читаем доступные записи из CSV файла
            using (var csvReader = new StreamReader(File.OpenRead(_options.CsvFileName)))
            {
                foreach (var record in _parser.ParseRecords(csvReader))
                {
                    var hashCode = record.GetHashCode();
                    if (_records.ContainsKey(hashCode))
                    {
                        continue;
                    }
                    _records.Add(hashCode, record);
                    _recordsByName.Add(GetRecordId(record), hashCode);
                }
            }

            // Читаем требуемые изменения WAL файла и применяем их
            using (var walReader = GetWalReader())
            {
                string line;
                while ((line = walReader.ReadLine()) != null)
                {
                    var entry = _walSerializer.Deserialize(line);
                    switch (entry.Action)
                    {
                    case CsvDbAction.Insert:
                        _records.Add(entry.HashCode, entry.Record);
                        _recordsByName.Add(GetRecordId(entry.Record), entry.HashCode);
                        break;

                    case CsvDbAction.Update:
                        _records.Remove(entry.HashCode);
                        _records.Add(entry.Record.GetHashCode(), entry.Record);
                        break;

                    case CsvDbAction.Delete:
                        _records.Remove(entry.HashCode);
                        _recordsByName.Remove(GetRecordId(entry.Record));
                        break;
                    }
                }
            }

            // Очищаем WAL файл
            using (var stream = GetWalStream())
                stream.SetLength(0);

            // Очищаем CSV файл и заполняем его новыми значениями
            FileUtils.ClearFile(_options.CsvFileName);
            using (var writer = new StreamWriter(File.OpenWrite(_options.CsvFileName)))
            {
                writer.WriteLine(string.Join(_recordSerializer.Delimiter, _parser.CsvHead));
                foreach (var record in _records.Values)
                {
                    writer.WriteLine(_recordSerializer.Serialize(record));
                }
            }

            return(this);
        }