From 47a46d122fed3ec66394a9fd3933c6e96e2352ac Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Jan 2023 16:11:28 +0800 Subject: [PATCH 1/3] Add `IAbpConnectionStringChecker`. --- .../AbpEfCoreMySqlConnectionStringChecker.cs | 37 ++++++++++++++++++ ...CoreOracleDevartConnectionStringChecker.cs | 35 +++++++++++++++++ .../AbpEfCoreOracleConnectionStringChecker.cs | 35 +++++++++++++++++ .../AbpEfCoreNpgsqlConnectionStringChecker.cs | 39 +++++++++++++++++++ ...pEfCoreSqlServerConnectionStringChecker.cs | 37 ++++++++++++++++++ .../AbpEfCoreSqliteConnectionStringChecker.cs | 30 ++++++++++++++ .../AbpConnectionStringCheckResult.cs | 8 ++++ .../IAbpConnectionStringChecker.cs | 8 ++++ .../AbpConnectionStringChecker_Tests.cs | 17 ++++++++ 9 files changed, 246 insertions(+) create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs new file mode 100644 index 0000000000..75713635fe --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading.Tasks; +using MySqlConnector; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreMySqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new MySqlConnectionStringBuilder(connectionString) + { + ConnectionLifeTime = 1 + }; + + var oldDatabaseName = connString.Database; + connString.Database = "mysql"; + + try + { + await using var conn = new MySqlConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + await conn.ChangeDatabaseAsync(oldDatabaseName); + await conn.CloseAsync(); + result.DatabaseExists = true; + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs new file mode 100644 index 0000000000..50441ac25e --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using Devart.Data.Oracle; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreOracleDevartConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new OracleConnectionStringBuilder(connectionString) + { + ConnectionTimeout = 1 + }; + + try + { + await using var conn = new OracleConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + result.DatabaseExists = true; + + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs new file mode 100644 index 0000000000..d8ce99f28b --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using Oracle.ManagedDataAccess.Client; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreOracleConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new OracleConnectionStringBuilder(connectionString) + { + ConnectionTimeout = 1 + }; + + try + { + await using var conn = new OracleConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + result.DatabaseExists = true; + + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs new file mode 100644 index 0000000000..94f3a5ffee --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs @@ -0,0 +1,39 @@ +using System; +using System.Threading.Tasks; +using Npgsql; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreNpgsqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new NpgsqlConnectionStringBuilder(connectionString) + { + Timeout = 1 + }; + + var oldDatabaseName = connString.Database; + connString.Database = "postgres"; + + try + { + await using var conn = new NpgsqlConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + await conn.ChangeDatabaseAsync(oldDatabaseName); + result.DatabaseExists = true; + + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs new file mode 100644 index 0000000000..4265193faa --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Data.SqlClient; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreSqlServerConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new SqlConnectionStringBuilder(connectionString) + { + ConnectTimeout = 1 + }; + + var oldDatabaseName = connString.InitialCatalog; + connString.InitialCatalog = "master"; + + try + { + await using var conn = new SqlConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + await conn.ChangeDatabaseAsync(oldDatabaseName); + await conn.CloseAsync(); + result.DatabaseExists = true; + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs new file mode 100644 index 0000000000..c11b4357b8 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Data.Sqlite; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreSqliteConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + + try + { + await using var conn = new SqliteConnection(connectionString); + await conn.OpenAsync(); + result.Connected = true; + result.DatabaseExists = true; + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs new file mode 100644 index 0000000000..53afc000fb --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +public class AbpConnectionStringCheckResult +{ + public bool Connected { get; set; } + + public bool DatabaseExists { get; set; } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs new file mode 100644 index 0000000000..2870c2103e --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +public interface IAbpConnectionStringChecker +{ + Task CheckAsync(string connectionString); +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs new file mode 100644 index 0000000000..ef3e37df24 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +public class AbpConnectionStringChecker_Tests : EntityFrameworkCoreTestBase +{ + [Fact] + public async Task IsValidAsync() + { + var connectionStringChecker = GetRequiredService(); + var result = await connectionStringChecker.CheckAsync(@"Data Source=:memory:"); + result.Connected.ShouldBeTrue(); + result.DatabaseExists.ShouldBeTrue(); + } +} From 5639d6511318c6398b4db7c81fe319a36eda147d Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Jan 2023 16:14:09 +0800 Subject: [PATCH 2/3] Set `DatabaseExists` before closing. --- .../AbpEfCoreMySqlConnectionStringChecker.cs | 4 +++- .../AbpEfCoreSqlServerConnectionStringChecker.cs | 4 +++- .../AbpEfCoreSqliteConnectionStringChecker.cs | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs index 75713635fe..1f291c60c7 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs @@ -25,8 +25,10 @@ public class AbpEfCoreMySqlConnectionStringChecker : IAbpConnectionStringChecker await conn.OpenAsync(); result.Connected = true; await conn.ChangeDatabaseAsync(oldDatabaseName); - await conn.CloseAsync(); result.DatabaseExists = true; + + await conn.CloseAsync(); + return result; } catch (Exception e) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs index 4265193faa..5473dd95d0 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs @@ -25,8 +25,10 @@ public class AbpEfCoreSqlServerConnectionStringChecker : IAbpConnectionStringChe await conn.OpenAsync(); result.Connected = true; await conn.ChangeDatabaseAsync(oldDatabaseName); - await conn.CloseAsync(); result.DatabaseExists = true; + + await conn.CloseAsync(); + return result; } catch (Exception e) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs index c11b4357b8..bc168973d9 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs @@ -18,6 +18,7 @@ public class AbpEfCoreSqliteConnectionStringChecker : IAbpConnectionStringChecke await conn.OpenAsync(); result.Connected = true; result.DatabaseExists = true; + await conn.CloseAsync(); return result; From 691b28eadbcc99c084b811745084200b1c7670d3 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Jan 2023 16:42:44 +0800 Subject: [PATCH 3/3] Add `MongoDBConnectionStringChecker`. --- .../Data}/AbpConnectionStringCheckResult.cs | 2 +- .../Data/DefaultConnectionStringChecker.cs | 16 ++++++++++ .../Abp/Data/IConnectionStringChecker.cs} | 4 +-- ...ker.cs => MySqlConnectionStringChecker.cs} | 5 ++-- ...=> OracleDevartConnectionStringChecker.cs} | 5 ++-- ...er.cs => OracleConnectionStringChecker.cs} | 5 ++-- ...er.cs => NpgsqlConnectionStringChecker.cs} | 5 ++-- ...cs => SqlServerConnectionStringChecker.cs} | 5 ++-- ...er.cs => SqliteConnectionStringChecker.cs} | 5 ++-- .../MongoDBConnectionStringChecker.cs | 30 +++++++++++++++++++ .../AbpConnectionStringChecker_Tests.cs | 3 +- 11 files changed, 69 insertions(+), 16 deletions(-) rename framework/src/{Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings => Volo.Abp.Data/Volo/Abp/Data}/AbpConnectionStringCheckResult.cs (69%) create mode 100644 framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs rename framework/src/{Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs => Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs} (52%) rename framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreMySqlConnectionStringChecker.cs => MySqlConnectionStringChecker.cs} (86%) rename framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreOracleDevartConnectionStringChecker.cs => OracleDevartConnectionStringChecker.cs} (83%) rename framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreOracleConnectionStringChecker.cs => OracleConnectionStringChecker.cs} (84%) rename framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreNpgsqlConnectionStringChecker.cs => NpgsqlConnectionStringChecker.cs} (86%) rename framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreSqlServerConnectionStringChecker.cs => SqlServerConnectionStringChecker.cs} (86%) rename framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreSqliteConnectionStringChecker.cs => SqliteConnectionStringChecker.cs} (81%) create mode 100644 framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpConnectionStringCheckResult.cs similarity index 69% rename from framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs rename to framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpConnectionStringCheckResult.cs index 53afc000fb..64d955a760 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpConnectionStringCheckResult.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; +namespace Volo.Abp.Data; public class AbpConnectionStringCheckResult { diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs new file mode 100644 index 0000000000..9ce04a71b9 --- /dev/null +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Data; + +public class DefaultConnectionStringChecker : IConnectionStringChecker, ITransientDependency +{ + public Task CheckAsync(string connectionString) + { + return Task.FromResult(new AbpConnectionStringCheckResult + { + Connected = false, + DatabaseExists = false + }); + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs similarity index 52% rename from framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs rename to framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs index 2870c2103e..159a52acc3 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; -namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; +namespace Volo.Abp.Data; -public interface IAbpConnectionStringChecker +public interface IConnectionStringChecker { Task CheckAsync(string connectionString); } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs similarity index 86% rename from framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs index 1f291c60c7..a77821b9df 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using MySqlConnector; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreMySqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class MySqlConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs similarity index 83% rename from framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs index 50441ac25e..1bbc300ec8 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Devart.Data.Oracle; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreOracleDevartConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class OracleDevartConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs similarity index 84% rename from framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs index d8ce99f28b..1176a9ce64 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Oracle.ManagedDataAccess.Client; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreOracleConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class OracleConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs similarity index 86% rename from framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs index 94f3a5ffee..f3ab83eb55 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Npgsql; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreNpgsqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class NpgsqlConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs similarity index 86% rename from framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs index 5473dd95d0..668aec3d96 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Microsoft.Data.SqlClient; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreSqlServerConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class SqlServerConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs similarity index 81% rename from framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs index bc168973d9..48b428ce8f 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Microsoft.Data.Sqlite; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreSqliteConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class SqliteConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs new file mode 100644 index 0000000000..f77335f285 --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading.Tasks; +using MongoDB.Driver; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.MongoDB.ConnectionStrings; + +[Dependency(ReplaceServices = true)] +public class MongoDBConnectionStringChecker : IConnectionStringChecker, ITransientDependency +{ + public virtual Task CheckAsync(string connectionString) + { + try + { + var mongoUrl = MongoUrl.Create(connectionString); + var client = new MongoClient(mongoUrl); + client.GetDatabase(mongoUrl.DatabaseName); + return Task.FromResult(new AbpConnectionStringCheckResult() + { + Connected = true, + DatabaseExists = true + }); + } + catch (Exception e) + { + return Task.FromResult(new AbpConnectionStringCheckResult()); + } + } +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs index ef3e37df24..8889fb8bcd 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Shouldly; +using Volo.Abp.Data; using Xunit; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; @@ -9,7 +10,7 @@ public class AbpConnectionStringChecker_Tests : EntityFrameworkCoreTestBase [Fact] public async Task IsValidAsync() { - var connectionStringChecker = GetRequiredService(); + var connectionStringChecker = GetRequiredService(); var result = await connectionStringChecker.CheckAsync(@"Data Source=:memory:"); result.Connected.ShouldBeTrue(); result.DatabaseExists.ShouldBeTrue();