Переделал абстрактый storage, реализовал хранилище врачей

This commit is contained in:
Никита Потапов 2024-05-08 03:23:15 +04:00
parent 59aebfd136
commit 048945c173
2 changed files with 122 additions and 3 deletions

View File

@ -1,29 +1,84 @@
using MedicalDatabaseContracts;
using MedicalDatabaseContracts.Models;
using Npgsql;
using System.Diagnostics;
namespace MedicalPostgresqlDatabase
{
public abstract class AbstractPostgresqlStorage<T> : IStorage<T> 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<T> GetAll()
{
long elapsedMilliseconds;
return GetAll(out elapsedMilliseconds);
}
public abstract List<T> GetAll(out long elapsedMilliseconds);
public virtual List<T> GetAll(out long elapsedMilliseconds)
{
var items = new List<T>();
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;

View File

@ -0,0 +1,64 @@
using MedicalDatabaseContracts.Models;
using Microsoft.Extensions.Logging;
using Npgsql;
using System.Diagnostics;
namespace MedicalPostgresqlDatabase.Storages
{
public class DoctorsStorage : AbstractPostgresqlStorage<Doctor>
{
private ILogger _logger;
public DoctorsStorage(ILogger<DoctorsStorage> 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;
}
}
}