Example #1
0
        /// <inheritdoc/>
        public int CreateRecord(RecordParams recordParams)
        {
            if (recordParams is null)
            {
                throw new ArgumentNullException($"{nameof(recordParams)} must nit be null");
            }

            this.validator.ValidateCabinetRecord(recordParams);
            this.fileStream.Position = this.fileStream.Length;
            this.dictionaryId.Add(this.id + 1, this.fileStream.Position);
            AddToDictionary<string, long>(this.firstNameDictionary, recordParams.FirstName.ToUpperInvariant(), this.fileStream.Position);
            AddToDictionary<string, long>(this.lastNameDictionary, recordParams.LastName.ToUpperInvariant(), this.fileStream.Position);
            AddToDictionary<DateTime, long>(this.dateOfBirthDictionary, recordParams.DateOfBirth, this.fileStream.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(++this.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 });
            return this.id;
        }
Example #2
0
        /// <summary>
        /// Restores the specified snapshot.
        /// </summary>
        /// <param name="snapshot">The snapshot.</param>
        public void Restore(FileCabinetServiceSnapshot snapshot)
        {
            if (snapshot is null)
            {
                throw new ArgumentNullException(nameof(snapshot));
            }

            foreach (FileCabinetRecord record in snapshot.Records)
            {
                try
                {
                    this.validator.ValidateCabinetRecord(RecordToParams(record));
                    if (this.dictionaryId.ContainsKey(record.Id))
                    {
                        this.EditRecord(record.Id, RecordToParams(record));
                    }
                    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);
                }
                catch (ArgumentException e)
                {
                    Console.WriteLine($"{record.Id}: {e.Message}");
                }
            }
        }
Example #3
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);
        }
Example #4
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();
        }
Example #5
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)}");
        }