using DD.Persistence.Services.Interfaces; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Npgsql; namespace DD.Persistence.Database.Postgres.Services; /// /// Сервис по работе с источником данных - базой postgres /// public class PostgresArchiveService : IArchiveService { private string connectionString; private ILogger logger; /// /// Сервис по работе с источником данных - базой postgres /// /// public PostgresArchiveService(IConfiguration configuration, ILogger logger) { this.connectionString = configuration.GetConnectionString("SystemBaseConnection")!; this.logger = logger; } public Task Create(string newName, CancellationToken token) { throw new NotImplementedException(); } public async Task Rename(string newName, CancellationToken token) { await using var connection = new NpgsqlConnection(connectionString); try { await connection.OpenAsync(); var sqlCloseConnect = $"SELECT pg_terminate_backend(pg_stat_activity.pid) " + $"FROM pg_stat_activity " + $"WHERE pg_stat_activity.datname = 'persistence' AND pid <> pg_backend_pid();"; await using var command = new NpgsqlCommand(sqlCloseConnect, connection); await command.ExecuteNonQueryAsync(); var rename = $"ALTER DATABASE persistence RENAME TO {newName};"; await using var sqlRenameDatabase = new NpgsqlCommand(rename, connection); await sqlRenameDatabase.ExecuteNonQueryAsync(); } catch (NpgsqlException exception) { this.logger.LogError(exception.Message); throw; } } }