Beispiel #1
0
        /// <summary>
        /// Removes the record.
        /// </summary>
        /// <param name="record">The record.</param>
        /// <returns>record id.</returns>
        public int RemoveRecord(FileCabinetRecord record)
        {
            if (record is null)
            {
                throw new ArgumentNullException(nameof(record), $"{nameof(record)} is null");
            }

            int id = record.Id;

            long position = this.recordIndexPosition[record.Id];

            this.writer.BaseStream.Position = position;
            this.writer.Write((short)1);
            this.writer.Flush();

            this.recordIndexPosition.Remove(record.Id);
            if (this.firstNameDictionary.ContainsKey(record.FirstName))
            {
                this.RemoveValueFromDictionary(record.FirstName, this.firstNameDictionary, record);
            }

            if (this.lastNameDictionary.ContainsKey(record.LastName))
            {
                this.RemoveValueFromDictionary(record.LastName, this.lastNameDictionary, record);
            }

            if (this.dateOfBirthDictionary.ContainsKey(record.DateOfBirth))
            {
                this.RemoveValueFromDictionary(record.DateOfBirth, this.dateOfBirthDictionary, record);
            }

            return(id);
        }
Beispiel #2
0
        /// <summary>
        /// RemoveRecord.
        /// </summary>
        /// <param name="record">record.</param>
        /// <returns>record id.</returns>
        public int RemoveRecord(FileCabinetRecord record)
        {
            if (record is null)
            {
                throw new ArgumentNullException(nameof(record), $"{nameof(record)} is null");
            }

            int id = record.Id;

            int position = this.list.FindIndex(x => x.Id == record.Id);

            this.list.RemoveAt(position);

            if (this.firstNameDictionary.ContainsKey(record.FirstName))
            {
                this.RemoveValueFromDictionary(record.FirstName, this.firstNameDictionary, record);
            }

            if (this.lastNameDictionary.ContainsKey(record.LastName))
            {
                this.RemoveValueFromDictionary(record.LastName, this.lastNameDictionary, record);
            }

            if (this.dateOfBirthDictionary.ContainsKey(record.DateOfBirth))
            {
                this.RemoveValueFromDictionary(record.DateOfBirth, this.dateOfBirthDictionary, record);
            }

            return(id);
        }
Beispiel #3
0
        private FileCabinetRecord FileReader(long pointer)
        {
            this.reader.BaseStream.Position = pointer;
            short reserved = this.reader.ReadInt16();

            if (reserved == 1)
            {
                return(null);
            }

            int    id        = this.reader.ReadInt32();
            string firstName = Encoding.Unicode.GetString(this.reader.ReadBytes(SizeOfStringRecord), 0, SizeOfStringRecord);

            firstName = firstName.Replace("\0", string.Empty, StringComparison.InvariantCulture);

            string lastName = Encoding.Unicode.GetString(this.reader.ReadBytes(SizeOfStringRecord), 0, SizeOfStringRecord);

            lastName = lastName.Replace("\0", string.Empty, StringComparison.InvariantCulture);

            char     gender            = BitConverter.ToChar(this.reader.ReadBytes(2), 0);
            int      year              = BitConverter.ToInt32(this.reader.ReadBytes(4), 0);
            int      month             = BitConverter.ToInt32(this.reader.ReadBytes(4), 0);
            int      day               = BitConverter.ToInt32(this.reader.ReadBytes(4), 0);
            DateTime dateOfBirth       = new DateTime(year, month, day);
            decimal  credit            = this.reader.ReadDecimal();
            short    duration          = this.reader.ReadInt16();
            var      fileCabinetRecord = new FileCabinetRecord(id, firstName, lastName, gender, dateOfBirth, credit, duration);

            return(fileCabinetRecord);
        }
Beispiel #4
0
        /// <summary>
        /// Inserts the specified record.
        /// </summary>
        /// <param name="record">The record.</param>
        public void Insert(FileCabinetRecord record)
        {
            var sw = Stopwatch.StartNew();

            this.service.Insert(record);
            sw.Stop();
            Console.WriteLine("Insert method execution duration is {0} ticks", sw.ElapsedTicks);
        }
Beispiel #5
0
        /// <summary>
        /// Implements IFileCabinetRecord interface.
        /// </summary>
        /// <param name="id">Id of record.</param>
        /// <param name="parameters">Parameters of record.</param>
        public void EditRecord(int id, RecordData parameters)
        {
            if (id > this.list.Count)
            {
                throw new ArgumentException($"Element with #{nameof(id)} can't fine in this records list.");
            }

            this.validator.ValidatePararmeters(parameters);

            var record = new FileCabinetRecord
            {
                Id           = id,
                FirstName    = parameters.FirstName,
                LastName     = parameters.LastName,
                DateOfBirth  = parameters.DateOfBirth,
                Experience   = parameters.Experience,
                Balance      = parameters.Balance,
                EnglishLevel = parameters.EnglishLevel,
            };

            this.list[id - 1] = record;

            if (this.firstNameDictionary.ContainsKey(record.FirstName.ToUpper(CultureInfo.InvariantCulture)))
            {
                this.firstNameDictionary[record.FirstName.ToUpper(CultureInfo.InvariantCulture)].Add(record);
            }
            else
            {
                this.firstNameDictionary.Add(record.FirstName.ToUpper(CultureInfo.InvariantCulture), new List <FileCabinetRecord> {
                    record
                });
            }

            if (this.lastNameDictionary.ContainsKey(record.LastName.ToUpper(CultureInfo.InvariantCulture)))
            {
                this.lastNameDictionary[record.LastName.ToUpper(CultureInfo.InvariantCulture)].Add(record);
            }
            else
            {
                this.lastNameDictionary.Add(record.LastName.ToUpper(CultureInfo.InvariantCulture), new List <FileCabinetRecord> {
                    record
                });
            }

            if (this.dateOfBirthDictionary.ContainsKey(record.DateOfBirth))
            {
                this.dateOfBirthDictionary[record.DateOfBirth].Add(record);
            }
            else
            {
                this.dateOfBirthDictionary.Add(record.DateOfBirth, new List <FileCabinetRecord> {
                    record
                });
            }

            CashedData.ClearCashe();
        }
        /// <summary>
        /// Adds the record.
        /// </summary>
        /// <param name="entity">The entity.</param>
        /// <param name="record">The record.</param>
        public void AddRecord(ValidateEntity entity, FileCabinetRecord record)
        {
            if (!this.memDictioanry.ContainsKey(entity))
            {
                this.memDictioanry.Add(entity, new List <FileCabinetRecord>());
            }

            this.memDictioanry[entity].Add(record);
        }
Beispiel #7
0
        /// <summary>
        /// Write records in csv file.
        /// </summary>
        /// <param name="record">Record.</param>
        public void Write(FileCabinetRecord record)
        {
            if (record is null)
            {
                throw new ArgumentNullException($"{nameof(record)} cannot be null.");
            }

            this.writer.WriteLine(record.ToString(), CultureInfo.InvariantCulture);
        }
Beispiel #8
0
        /// <summary>
        /// Implements IFileCabinetRecord interface.
        /// </summary>
        /// <param name="parameters">Parameters of new record.</param>
        /// <returns>Id of record.</returns>
        public int CreateRecord(RecordData parameters)
        {
            this.validator.ValidatePararmeters(parameters);

            var record = new FileCabinetRecord
            {
                Id           = this.list.Count + 1,
                FirstName    = parameters.FirstName,
                LastName     = parameters.LastName,
                DateOfBirth  = parameters.DateOfBirth,
                Experience   = parameters.Experience,
                Balance      = parameters.Balance,
                EnglishLevel = parameters.EnglishLevel,
            };

            this.list.Add(record);

            if (this.firstNameDictionary.ContainsKey(record.FirstName.ToUpper(CultureInfo.InvariantCulture)))
            {
                this.firstNameDictionary[record.FirstName.ToUpper(CultureInfo.InvariantCulture)].Add(record);
            }
            else
            {
                this.firstNameDictionary.Add(record.FirstName.ToUpper(CultureInfo.InvariantCulture), new List <FileCabinetRecord> {
                    record
                });
            }

            if (this.lastNameDictionary.ContainsKey(record.LastName.ToUpper(CultureInfo.InvariantCulture)))
            {
                this.lastNameDictionary[record.LastName.ToUpper(CultureInfo.InvariantCulture)].Add(record);
            }
            else
            {
                this.lastNameDictionary.Add(record.LastName.ToUpper(CultureInfo.InvariantCulture), new List <FileCabinetRecord> {
                    record
                });
            }

            if (this.dateOfBirthDictionary.ContainsKey(record.DateOfBirth))
            {
                this.dateOfBirthDictionary[record.DateOfBirth].Add(record);
            }
            else
            {
                this.dateOfBirthDictionary.Add(record.DateOfBirth, new List <FileCabinetRecord> {
                    record
                });
            }

            return(record.Id);
        }
Beispiel #9
0
        /// <summary>
        /// Inserts the specified record.
        /// </summary>
        /// <param name="record">The record.</param>
        public void Insert(FileCabinetRecord record)
        {
            string context = string.Format(CultureInfo.InvariantCulture, "{0} - Calling {1} with record = {2}\n", DateTime.Now, "Insert()", record);

            File.AppendAllText("logger.txt", context);
            try
            {
                this.service.Insert(record);
            }
            catch (Exception e)
            {
                File.AppendAllText("logger.txt", e.ToString());
                throw;
            }
        }
Beispiel #10
0
        private int GenerateId(FileCabinetRecord fileCabinetRecord)
        {
            if (fileCabinetRecord.Id != 0)
            {
                return(fileCabinetRecord.Id);
            }

            var maxId = 0;

            if (this.list.Count > 0)
            {
                maxId = this.list.Max(x => x.Id);
            }

            return(maxId + 1);
        }
Beispiel #11
0
        /// <summary>
        /// Creates the record.
        /// </summary>
        /// <param name="record">The file cabinet record.</param>
        /// <returns>id of created record.</returns>
        public int CreateRecord(FileCabinetRecord record)
        {
            if (record is null)
            {
                throw new ArgumentNullException(nameof(record), $"{nameof(record)} is null");
            }

            this.validator.ValidateParameters(record);
            record.Id = this.GenerateId(record);
            this.list.Add(record);
            this.AddValueToDictionary(record.FirstName, this.firstNameDictionary, record);
            this.AddValueToDictionary(record.LastName, this.lastNameDictionary, record);
            this.AddValueToDictionary(record.DateOfBirth, this.dateOfBirthDictionary, record);

            return(record.Id);
        }
Beispiel #12
0
        private int GenerateId(FileCabinetRecord fileCabinetRecord)
        {
            if (fileCabinetRecord.Id != 0)
            {
                return(fileCabinetRecord.Id);
            }

            var maxId = 0;

            if (this.recordIndexPosition.Count > 0)
            {
                maxId = this.recordIndexPosition.Keys.Max(x => x);
            }

            return(maxId + 1);
        }
Beispiel #13
0
        /// <summary>
        /// Inserts the specified record.
        /// </summary>
        /// <param name="record">The record.</param>
        /// <exception cref="ArgumentNullException">Throws when record is null.</exception>
        /// <exception cref="ArgumentException">Record id must be more than zero.
        /// or
        /// Such identifier already exists.</exception>
        public void Insert(FileCabinetRecord record)
        {
            if (record is null)
            {
                throw new ArgumentNullException(nameof(record));
            }

            if (record.Id == -1)
            {
                throw new ArgumentException("Record id must be more than zero.");
            }

            this.validator.ValidateCabinetRecord(RecordToParams(record));
            if (this.dictionaryId.ContainsKey(record.Id))
            {
                throw new ArgumentException("Such identifier already exists.");
            }
            else
            {
                this.fileStream.Position = this.fileStream.Length;
                this.dictionaryId.Add(record.Id, this.fileStream.Position);
                AddToDictionary<string, long>(this.firstNameDictionary, record.FirstName.ToUpperInvariant(), this.fileStream.Position);
                AddToDictionary<string, long>(this.lastNameDictionary, record.LastName.ToUpperInvariant(), this.fileStream.Position);
                AddToDictionary<DateTime, long>(this.dateOfBirthDictionary, record.DateOfBirth, this.fileStream.Position);

                byte[] tempFirstName = Encoding.Default.GetBytes(record.FirstName);
                byte[] tempLastName = Encoding.Default.GetBytes(record.LastName);
                byte[] firstName = new byte[120];
                byte[] lastName = new byte[120];
                ToBytesDecimal toBytesDecimal = new ToBytesDecimal(record.Salary);
                byte[] bytesSalary = BitConverter.GetBytes(toBytesDecimal.Bytes1).Concat(BitConverter.GetBytes(toBytesDecimal.Bytes2)).ToArray();
                Array.Copy(tempFirstName, 0, firstName, 0, tempFirstName.Length);
                Array.Copy(tempLastName, 0, lastName, 0, tempLastName.Length);
                this.fileStream.Write(BitConverter.GetBytes(record.Department));
                this.fileStream.Write(BitConverter.GetBytes(record.Id));
                this.fileStream.Write(firstName);
                this.fileStream.Write(lastName);
                this.fileStream.Write(BitConverter.GetBytes(record.DateOfBirth.Year));
                this.fileStream.Write(BitConverter.GetBytes(record.DateOfBirth.Month));
                this.fileStream.Write(BitConverter.GetBytes(record.DateOfBirth.Day));
                this.fileStream.Write(bytesSalary);
                this.fileStream.Write(BitConverter.GetBytes(record.Class));
                this.fileStream.Write(new byte[] { 0 });
            }

            this.id = Math.Max(this.id, record.Id);
        }
Beispiel #14
0
        /// <summary>
        /// Removes the specified identifier.
        /// </summary>
        /// <param name="id">The identifier.</param>
        public void Remove(int id)
        {
            long position = this.dictionaryId[id];
            byte[] buffer = new byte[277];

            this.fileStream.Position = position;
            this.fileStream.Read(buffer, 0, 277);
            FileCabinetRecord record = this.RecordFromBytes(buffer);

            this.dateOfBirthDictionary[record.DateOfBirth].Remove(position);
            this.firstNameDictionary[record.FirstName.ToUpperInvariant()].Remove(position);
            this.lastNameDictionary[record.LastName.ToUpperInvariant()].Remove(position);
            this.dictionaryId.Remove(id);
            this.fileStream.Position = position + 276;
            this.fileStream.Write(new byte[] { 1 });
            this.deleteStat++;
        }
Beispiel #15
0
        /// <inheritdoc/>
        public IReadOnlyCollection<FileCabinetRecord> GetRecords()
        {
            byte[] buffer = new byte[277];
            List<FileCabinetRecord> result = new List<FileCabinetRecord>();
            this.fileStream.Position = 0;
            while (this.fileStream.Read(buffer, 0, 277) != 0)
            {
                try
                {
                    FileCabinetRecord record = this.RecordFromBytes(buffer);
                    result.Add(record);
                }
                catch (KeyNotFoundException)
                {
                }
            }

            return result;
        }
Beispiel #16
0
        /// <summary>
        /// Gets the records.
        /// </summary>
        /// <returns>
        /// All records.
        /// </returns>
        public ReadOnlyCollection <FileCabinetRecord> GetRecords()
        {
            List <FileCabinetRecord> list = new List <FileCabinetRecord>();

            this.reader.BaseStream.Position = 0;
            long position = this.reader.BaseStream.Position;

            for (int i = 0; i < this.countOfRecords; i++)
            {
                FileCabinetRecord record = this.FileReader(position);
                if (record != null)
                {
                    list.Add(record);
                }

                position += RecordSize;
            }

            return(list.AsReadOnly());
        }
Beispiel #17
0
        private FileCabinetRecord RecordFromBytes(byte[] buffer)
        {
            ToBytesDecimal toDecimal = default;
            int year;
            int month;
            int day;
            FileCabinetRecord record = new FileCabinetRecord();
            record.Department = BitConverter.ToInt16(buffer, 0);
            record.Id = BitConverter.ToInt32(buffer, 2);
            record.FirstName = Encoding.Default.GetString(buffer, 6, 120).Trim('\0');
            record.LastName = Encoding.Default.GetString(buffer, 126, 120).Trim('\0');
            year = BitConverter.ToInt32(buffer, 246);
            month = BitConverter.ToInt32(buffer, 250);
            day = BitConverter.ToInt32(buffer, 254);
            toDecimal.Bytes1 = BitConverter.ToInt64(buffer, 258);
            toDecimal.Bytes2 = BitConverter.ToInt64(buffer, 266);
            record.Salary = toDecimal.GetDecimal();
            record.Class = BitConverter.ToChar(buffer, 274);
            record.DateOfBirth = new DateTime(year, month, day);

            return buffer[276] == 0 ? record : throw new KeyNotFoundException();
        }
Beispiel #18
0
        private void FileWriter(FileCabinetRecord fileCabinetRecord, long position)
        {
            this.writer.BaseStream.Position = position;
            this.writer.Write((short)0);
            this.writer.Write(fileCabinetRecord.Id);

            var buffer = Encoding.Unicode.GetBytes(CreateEmptyString(fileCabinetRecord.FirstName, 60));

            this.writer.Write(buffer);

            buffer = Encoding.Unicode.GetBytes(CreateEmptyString(fileCabinetRecord.LastName, 60));
            this.writer.Write(buffer);

            buffer = Encoding.Unicode.GetBytes(CreateEmptyString(fileCabinetRecord.Gender.ToString(this.culture), 1));
            this.writer.Write(buffer);

            this.writer.Write(fileCabinetRecord.DateOfBirth.Year);
            this.writer.Write(fileCabinetRecord.DateOfBirth.Month);
            this.writer.Write(fileCabinetRecord.DateOfBirth.Day);
            this.writer.Write(fileCabinetRecord.CreditSum);
            this.writer.Write(fileCabinetRecord.Duration);
        }
Beispiel #19
0
        /// <summary>
        /// Creates the record.
        /// </summary>
        /// <param name="record">The file cabinet record.</param>
        /// <returns>
        /// Id of created record.
        /// </returns>
        public int CreateRecord(FileCabinetRecord record)
        {
            if (record is null)
            {
                throw new ArgumentNullException(nameof(record), $"{nameof(record)} is null");
            }

            this.validator.ValidateParameters(record);
            record.Id = this.GenerateId(record);
            this.countOfRecords++;

            long position = RecordSize * (this.countOfRecords - 1);

            this.FileWriter(record, position);
            this.writer.Flush();

            this.recordIndexPosition.Add(record.Id, position);
            this.AddValueToDictionary(record.FirstName, this.firstNameDictionary, record);
            this.AddValueToDictionary(record.LastName, this.lastNameDictionary, record);
            this.AddValueToDictionary(record.DateOfBirth, this.dateOfBirthDictionary, record);

            return(record.Id);
        }
Beispiel #20
0
        /// <summary>
        /// Purges the deleted records.
        /// </summary>
        /// <returns>count of deleted records and count of all records.</returns>
        public (int, int) PurgeDeletedRecords()
        {
            Queue <long> rewriteRecord = new Queue <long>();

            this.recordIndexPosition.Clear();
            this.writer.BaseStream.Position = 0;
            this.reader.BaseStream.Position = 0;

            long readerPosition        = 0;
            long sizeOfFile            = 0;
            int  countOfDeletedRecords = 0;

            while (readerPosition < this.countOfRecords * RecordSize)
            {
                rewriteRecord.Enqueue(readerPosition);
                FileCabinetRecord record = this.FileReader(readerPosition);
                if (record != null)
                {
                    long recordPosition = rewriteRecord.Dequeue();
                    this.FileWriter(record, recordPosition);
                    this.recordIndexPosition.Add(record.Id, recordPosition);
                    sizeOfFile += RecordSize;
                }
                else
                {
                    countOfDeletedRecords++;
                }

                readerPosition += RecordSize;
            }

            this.fileStream.SetLength(sizeOfFile);
            int countOfAllRecords = this.countOfRecords;

            this.countOfRecords -= countOfDeletedRecords;
            return(countOfDeletedRecords, countOfAllRecords);
        }
Beispiel #21
0
        /// <summary>
        /// Edits the record.
        /// </summary>
        /// <param name="fileCabinetRecord">The file cabinet record.</param>
        public void EditRecord(FileCabinetRecord fileCabinetRecord)
        {
            if (fileCabinetRecord is null)
            {
                throw new ArgumentNullException(nameof(fileCabinetRecord), $"{nameof(fileCabinetRecord)} is null");
            }

            FileCabinetRecord record = this.list.Find(x => x.Id == fileCabinetRecord.Id);

            if (record.Id != fileCabinetRecord.Id)
            {
                throw new ArgumentException($"{nameof(fileCabinetRecord)} can't update record id.", nameof(fileCabinetRecord));
            }

            if (fileCabinetRecord.FirstName != record.FirstName)
            {
                this.RemoveValueFromDictionary(record.FirstName, this.firstNameDictionary, record);
                this.AddValueToDictionary(fileCabinetRecord.FirstName, this.firstNameDictionary, fileCabinetRecord);
            }

            if (fileCabinetRecord.LastName != record.LastName)
            {
                this.RemoveValueFromDictionary(record.LastName, this.lastNameDictionary, record);
                this.AddValueToDictionary(fileCabinetRecord.LastName, this.lastNameDictionary, fileCabinetRecord);
            }

            if (fileCabinetRecord.DateOfBirth != record.DateOfBirth)
            {
                this.RemoveValueFromDictionary(record.DateOfBirth, this.dateOfBirthDictionary, record);
                this.AddValueToDictionary(fileCabinetRecord.DateOfBirth, this.dateOfBirthDictionary, fileCabinetRecord);
            }

            int position = this.list.FindIndex(x => x.Id == fileCabinetRecord.Id);

            this.list[position] = fileCabinetRecord;
        }
Beispiel #22
0
 private void RemoveValueFromDictionary <T>(T value, Dictionary <T, List <FileCabinetRecord> > dictionary, FileCabinetRecord record)
 {
     if (dictionary.ContainsKey(value))
     {
         dictionary[value].Remove(record);
     }
 }
Beispiel #23
0
        /// <summary>
        /// Edits the record.
        /// </summary>
        /// <param name="id">The identifier.</param>
        /// <param name="recordParams">The record parameters.</param>
        /// <exception cref="ArgumentNullException">Throws when recordParams is null.</exception>
        /// <exception cref="KeyNotFoundException">Throws when Id not found.</exception>
        public void EditRecord(int id, RecordParams recordParams)
        {
            if (recordParams is null)
            {
                throw new ArgumentNullException($"{nameof(recordParams)} must nit be null");
            }

            this.validator.ValidateCabinetRecord(recordParams);
            byte[] buffer = new byte[277];
            this.fileStream.Position = 0;

            if (this.dictionaryId.ContainsKey(id))
            {
                long position = this.dictionaryId[id];
                this.fileStream.Position = position;
                this.fileStream.Read(buffer, 0, 277);
                FileCabinetRecord record = this.RecordFromBytes(buffer);

                if (record.FirstName.ToUpperInvariant() != recordParams.FirstName.ToUpperInvariant())
                {
                    this.firstNameDictionary[record.FirstName.ToUpperInvariant()].Remove(position);
                    AddToDictionary<string, long>(this.firstNameDictionary, recordParams.FirstName.ToUpperInvariant(), position);
                }

                if (record.LastName.ToUpperInvariant() != recordParams.LastName.ToUpperInvariant())
                {
                    this.lastNameDictionary[record.LastName.ToUpperInvariant()].Remove(position);
                    AddToDictionary<string, long>(this.lastNameDictionary, recordParams.LastName.ToUpperInvariant(), position);
                }

                if (record.DateOfBirth != recordParams.DateOfBirth)
                {
                    this.dateOfBirthDictionary[record.DateOfBirth].Remove(position);
                    AddToDictionary<DateTime, long>(this.dateOfBirthDictionary, recordParams.DateOfBirth, position);
                }

                this.fileStream.Position = position;

                byte[] tempFirstName = Encoding.Default.GetBytes(recordParams.FirstName);
                byte[] tempLastName = Encoding.Default.GetBytes(recordParams.LastName);
                byte[] firstName = new byte[120];
                byte[] lastName = new byte[120];
                ToBytesDecimal toBytesDecimal = new ToBytesDecimal(recordParams.Salary);
                byte[] bytesSalary = BitConverter.GetBytes(toBytesDecimal.Bytes1).Concat(BitConverter.GetBytes(toBytesDecimal.Bytes2)).ToArray();
                Array.Copy(tempFirstName, 0, firstName, 0, tempFirstName.Length);
                Array.Copy(tempLastName, 0, lastName, 0, tempLastName.Length);

                this.fileStream.Write(BitConverter.GetBytes(recordParams.Department));
                this.fileStream.Write(BitConverter.GetBytes(id));
                this.fileStream.Write(firstName);
                this.fileStream.Write(lastName);
                this.fileStream.Write(BitConverter.GetBytes(recordParams.DateOfBirth.Year));
                this.fileStream.Write(BitConverter.GetBytes(recordParams.DateOfBirth.Month));
                this.fileStream.Write(BitConverter.GetBytes(recordParams.DateOfBirth.Day));
                this.fileStream.Write(bytesSalary);
                this.fileStream.Write(BitConverter.GetBytes(recordParams.Class));
                this.fileStream.Write(new byte[] { 0 });
                this.fileStream.Position = this.fileStream.Length;

                return;
            }

            throw new KeyNotFoundException($"wrong {nameof(id)}");
        }
Beispiel #24
0
 private void AddValueToDictionary <T>(T value, Dictionary <T, List <FileCabinetRecord> > dictionary, FileCabinetRecord record)
 {
     if (dictionary.ContainsKey(value))
     {
         dictionary[value].Add(record);
     }
     else
     {
         dictionary.Add(value, new List <FileCabinetRecord>());
         dictionary[value].Add(record);
     }
 }
Beispiel #25
0
        /// <summary>
        /// Edits the record.
        /// </summary>
        /// <param name="fileCabinetRecord">The file cabinet record.</param>
        public void EditRecord(FileCabinetRecord fileCabinetRecord)
        {
            if (fileCabinetRecord is null)
            {
                throw new ArgumentNullException(nameof(fileCabinetRecord), $"{nameof(fileCabinetRecord)} is null");
            }

            if (!this.recordIndexPosition.ContainsKey(fileCabinetRecord.Id))
            {
                throw new FileRecordNotFoundException(fileCabinetRecord.Id);
            }

            long position = this.recordIndexPosition[fileCabinetRecord.Id];
            FileCabinetRecord oldRecord = this.FileReader(position);

            if (oldRecord.Id != fileCabinetRecord.Id)
            {
                throw new ArgumentException($"{nameof(fileCabinetRecord)} can't update record id.", nameof(fileCabinetRecord));
            }

            this.writer.BaseStream.Position = position + sizeof(short) + sizeof(int);
            if (fileCabinetRecord.FirstName != oldRecord.FirstName)
            {
                var buffer = Encoding.Unicode.GetBytes(CreateEmptyString(fileCabinetRecord.FirstName, 60));
                this.writer.Write(buffer);
                this.RemoveValueFromDictionary(oldRecord.FirstName, this.firstNameDictionary, oldRecord);
                this.AddValueToDictionary(fileCabinetRecord.FirstName, this.firstNameDictionary, fileCabinetRecord);
            }
            else
            {
                this.writer.BaseStream.Position += SizeOfStringRecord;
            }

            if (fileCabinetRecord.LastName != oldRecord.LastName)
            {
                var buffer = Encoding.Unicode.GetBytes(CreateEmptyString(fileCabinetRecord.LastName, 60));
                this.writer.Write(buffer);
                this.RemoveValueFromDictionary(oldRecord.LastName, this.lastNameDictionary, oldRecord);
                this.AddValueToDictionary(fileCabinetRecord.LastName, this.lastNameDictionary, fileCabinetRecord);
            }
            else
            {
                this.writer.BaseStream.Position += SizeOfStringRecord;
            }

            if (fileCabinetRecord.Gender != oldRecord.Gender)
            {
                var buffer = Encoding.Unicode.GetBytes(CreateEmptyString(fileCabinetRecord.Gender.ToString(this.culture), 1));
                this.writer.Write(buffer);
            }
            else
            {
                this.writer.BaseStream.Position += sizeof(char); // 2
            }

            if (fileCabinetRecord.DateOfBirth != oldRecord.DateOfBirth)
            {
                this.writer.Write(fileCabinetRecord.DateOfBirth.Year);
                this.writer.Write(fileCabinetRecord.DateOfBirth.Month);
                this.writer.Write(fileCabinetRecord.DateOfBirth.Day);

                this.RemoveValueFromDictionary(oldRecord.DateOfBirth, this.dateOfBirthDictionary, oldRecord);
                this.AddValueToDictionary(fileCabinetRecord.DateOfBirth, this.dateOfBirthDictionary, fileCabinetRecord);
            }
            else
            {
                this.writer.BaseStream.Position += sizeof(int) * 3; // 12
            }

            if (fileCabinetRecord.CreditSum != oldRecord.CreditSum)
            {
                this.writer.Write(fileCabinetRecord.CreditSum);
            }
            else
            {
                this.writer.BaseStream.Position += sizeof(decimal); // 16
            }

            if (fileCabinetRecord.Duration != oldRecord.Duration)
            {
                this.writer.Write(fileCabinetRecord.Duration);
            }

            this.writer.Flush();
        }
Beispiel #26
0
 private static RecordParams RecordToParams(FileCabinetRecord record)
 {
     return new RecordParams(record.FirstName, record.LastName, record.DateOfBirth, record.Department, record.Salary, record.Class);
 }