/// <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; }
/// <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}"); } } }
/// <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); }
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(); }
/// <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)}"); }