diff --git a/Medical/MedicalPostgresqlDatabase/AbstractPostgresqlStorage.cs b/Medical/MedicalPostgresqlDatabase/AbstractPostgresqlStorage.cs index 0966228..9d5f33a 100644 --- a/Medical/MedicalPostgresqlDatabase/AbstractPostgresqlStorage.cs +++ b/Medical/MedicalPostgresqlDatabase/AbstractPostgresqlStorage.cs @@ -1,29 +1,84 @@ using MedicalDatabaseContracts; using MedicalDatabaseContracts.Models; using Npgsql; +using System.Diagnostics; namespace MedicalPostgresqlDatabase { public abstract class AbstractPostgresqlStorage : IStorage where T : AbstractModel { + protected readonly string TABLE_NAME; + protected readonly string PRIMARY_KEY_COLUMN_NAME; + + protected AbstractPostgresqlStorage(string tableName, string primaryKeyColumnName) + { + TABLE_NAME = tableName; + PRIMARY_KEY_COLUMN_NAME = primaryKeyColumnName; + } + + protected abstract T CreateEntityFromReader(NpgsqlDataReader reader); + public virtual void Delete(int id) { long elapsedMilliseconds; Delete(id, out elapsedMilliseconds); } - public abstract void Delete(int id, out long elapsedMilliseconds); + public virtual void Delete(int id, out long elapsedMilliseconds) + { + using var connection = GetConnection(); + connection.Open(); + using var cmd = new NpgsqlCommand($"DELETE FROM {TABLE_NAME} WHERE {PRIMARY_KEY_COLUMN_NAME} = @id", connection); + cmd.Parameters.AddWithValue("@id", id); + Stopwatch stopwatch = new(); + stopwatch.Start(); + cmd.ExecuteNonQuery(); + stopwatch.Stop(); + elapsedMilliseconds = stopwatch.ElapsedMilliseconds; + } public virtual T? Get(int id) { long elapsedMilliseconds; return Get(id, out elapsedMilliseconds); } - public abstract T? Get(int id, out long elapsedMilliseconds); + public virtual T? Get(int id, out long elapsedMilliseconds) + { + using var connection = GetConnection(); + connection.Open(); + using var cmd = new NpgsqlCommand($"SELECT * FROM {TABLE_NAME} WHERE {PRIMARY_KEY_COLUMN_NAME} = @id", connection); + cmd.Parameters.AddWithValue("@id", id); + Stopwatch stopwatch = new(); + stopwatch.Start(); + using var reader = cmd.ExecuteReader(); + stopwatch.Stop(); + elapsedMilliseconds = stopwatch.ElapsedMilliseconds; + if (reader.Read()) + { + return CreateEntityFromReader(reader); + } + return null; + } public virtual List GetAll() { long elapsedMilliseconds; return GetAll(out elapsedMilliseconds); } - public abstract List GetAll(out long elapsedMilliseconds); + public virtual List GetAll(out long elapsedMilliseconds) + { + var items = new List(); + using var connection = GetConnection(); + connection.Open(); + using var cmd = new NpgsqlCommand($"SELECT * FROM {TABLE_NAME} ORDER BY {PRIMARY_KEY_COLUMN_NAME}", connection); + Stopwatch stopwatch = new(); + stopwatch.Start(); + using var reader = cmd.ExecuteReader(); + stopwatch.Stop(); + elapsedMilliseconds = stopwatch.ElapsedMilliseconds; + while (reader.Read()) + { + items.Add(CreateEntityFromReader(reader)); + } + return items; + } public virtual void Insert(T item) { long elapsedMilliseconds; diff --git a/Medical/MedicalPostgresqlDatabase/Storages/DoctorsStorage.cs b/Medical/MedicalPostgresqlDatabase/Storages/DoctorsStorage.cs new file mode 100644 index 0000000..eb996b0 --- /dev/null +++ b/Medical/MedicalPostgresqlDatabase/Storages/DoctorsStorage.cs @@ -0,0 +1,64 @@ +using MedicalDatabaseContracts.Models; +using Microsoft.Extensions.Logging; +using Npgsql; +using System.Diagnostics; + +namespace MedicalPostgresqlDatabase.Storages +{ + public class DoctorsStorage : AbstractPostgresqlStorage + { + private ILogger _logger; + public DoctorsStorage(ILogger logger) : base("doctors", "doctor_id") + { + _logger = logger; + } + + protected override Doctor CreateEntityFromReader(NpgsqlDataReader reader) + { + return new Doctor + { + Id = Convert.ToInt32(reader.GetOrdinal("doctor_id")), + Name = Convert.ToString(reader.GetOrdinal("name")), + Surname = Convert.ToString(reader.GetOrdinal("surname")), + Patronymic = Convert.ToString(reader.GetOrdinal("patronymic")), + PhoneNumber = Convert.ToString(reader.GetOrdinal("phone_number")), + SpecializationId = Convert.ToInt32(reader.GetOrdinal("specializaton_id")) + }; + } + + public override void Insert(Doctor item, out long elapsedMilliseconds) + { + using var connection = GetConnection(); + connection.Open(); + using var cmd = new NpgsqlCommand("INSERT INTO doctors (doctor_id, name, surname, patronymic, phone_number, specialization_id) VALUES ((nextval('doctors_id_seq')), @name, @surname, @patronymic, @phone_number, @specialization_id)", connection); + cmd.Parameters.AddWithValue("@name", item.Name); + cmd.Parameters.AddWithValue("@surname", item.Surname); + cmd.Parameters.AddWithValue("@patronymic", item.Patronymic); + cmd.Parameters.AddWithValue("@phone_number", item.PhoneNumber); + cmd.Parameters.AddWithValue("@specialization_id", item.SpecializationId); + Stopwatch stopwatch = new(); + stopwatch.Start(); + cmd.ExecuteNonQuery(); + stopwatch.Stop(); + elapsedMilliseconds = stopwatch.ElapsedMilliseconds; + } + + public override void Update(Doctor item, out long elapsedMilliseconds) + { + using var connection = GetConnection(); + connection.Open(); + using var cmd = new NpgsqlCommand($"UPDATE doctors SET name = @name, surname = @surname, patronymic = @patronymic, phone_number = @phone_number, specialization_id = @specialization_id, WHERE {PRIMARY_KEY_COLUMN_NAME} = @id", connection); ; + cmd.Parameters.AddWithValue("@id", item.Id); + cmd.Parameters.AddWithValue("@name", item.Name); + cmd.Parameters.AddWithValue("@surname", item.Surname); + cmd.Parameters.AddWithValue("@patronymic", item.Patronymic); + cmd.Parameters.AddWithValue("@phone_number", item.PhoneNumber); + cmd.Parameters.AddWithValue("@specialization_id", item.SpecializationId); + Stopwatch stopwatch = new(); + stopwatch.Start(); + cmd.ExecuteNonQuery(); + stopwatch.Stop(); + elapsedMilliseconds = stopwatch.ElapsedMilliseconds; + } + } +}