From a6c6bc8ff52911170857b0fc485352ded5b09bbb Mon Sep 17 00:00:00 2001 From: "Erik A. Brandstadmoen" Date: Mon, 12 Feb 2024 00:43:01 +0100 Subject: [PATCH] WIP --- .../GrateConfigurationBuilder.Factory.cs | 28 ++----------------- .../RegistrationExtensions.cs | 24 ++++++++-------- .../Infrastructure/BatchSplitterReplacer.cs | 6 ++-- .../Infrastructure/StatementSplitter.cs | 8 ++++-- src/grate.core/Migration/AnsiSqlDatabase.cs | 5 ++-- src/grate.core/Migration/GrateMigrator.cs | 6 +++- src/grate.core/Migration/IDatabase.cs | 2 -- .../Migration/PostgreSqlDatabase.cs | 4 +-- .../DependencyInjection/AddGrate.cs | 2 +- .../GrateConfigurationBuilder_Factory.cs | 20 ++++++------- .../Basic_tests/BatchSplitterReplacer_.cs | 8 +++--- .../Oracle/Basic_tests/StatementSplitter_.cs | 4 +-- .../Statement_Splitting/StatementSplitter_.cs | 5 ++-- .../Basic_tests/BatchSplitterReplacer_.cs | 8 +++--- .../Basic_tests/StatementSplitter_.cs | 4 +-- .../GrateServiceCollectionTest.cs | 4 +-- 16 files changed, 60 insertions(+), 78 deletions(-) diff --git a/src/grate.core/Configuration/GrateConfigurationBuilder.Factory.cs b/src/grate.core/Configuration/GrateConfigurationBuilder.Factory.cs index b2cefad4..797f40e5 100644 --- a/src/grate.core/Configuration/GrateConfigurationBuilder.Factory.cs +++ b/src/grate.core/Configuration/GrateConfigurationBuilder.Factory.cs @@ -1,24 +1,11 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace grate.Configuration; +namespace grate.Configuration; public partial class GrateConfigurationBuilder { - /// - /// Create the grate configuration builder from an existing service collection and grate configuration. - /// - /// Service collection - /// GrateConfiguration - /// GrateConfigurationBuilder - public static GrateConfigurationBuilder Create(IServiceCollection serviceCollection, GrateConfiguration grateConfiguration) - { - return new GrateConfigurationBuilder(grateConfiguration); - } /// /// Create the grate configuration builder from an existing service collection and grate configuration. /// - /// Service collection /// GrateConfiguration /// GrateConfigurationBuilder public static GrateConfigurationBuilder Create(GrateConfiguration grateConfiguration) @@ -29,21 +16,10 @@ public static GrateConfigurationBuilder Create(GrateConfiguration grateConfigura /// /// Create the default grate configuration builder with existing service collection. /// - /// Service collection - /// GrateConfigurationBuilder - public static GrateConfigurationBuilder Create(IServiceCollection serviceCollection) - { - return new GrateConfigurationBuilder(GrateConfiguration.Default with { NonInteractive = true }); - } - - /// - /// Create the default grate configuration builder using a new service collection. - /// /// GrateConfigurationBuilder public static GrateConfigurationBuilder Create() { - return new GrateConfigurationBuilder( - presetGrateConfiguration: GrateConfiguration.Default with { NonInteractive = true }); + return new GrateConfigurationBuilder(GrateConfiguration.Default with { NonInteractive = true }); } } diff --git a/src/grate.core/DependencyInjection/RegistrationExtensions.cs b/src/grate.core/DependencyInjection/RegistrationExtensions.cs index d1a4d048..0aaf71c7 100644 --- a/src/grate.core/DependencyInjection/RegistrationExtensions.cs +++ b/src/grate.core/DependencyInjection/RegistrationExtensions.cs @@ -10,7 +10,7 @@ public static class RegistrationExtensions { public static IServiceCollection AddGrate(this IServiceCollection serviceCollection, GrateConfiguration presetGrateConfiguration, Action? builder = null) { - var configurationBuilder = GrateConfigurationBuilder.Create(serviceCollection, presetGrateConfiguration); + var configurationBuilder = GrateConfigurationBuilder.Create(presetGrateConfiguration); builder?.Invoke(configurationBuilder); var grateConfiguration = configurationBuilder.Build(); @@ -24,7 +24,7 @@ public static IServiceCollection AddGrate(this IServiceCollection serviceCollect public static IServiceCollection AddGrate(this IServiceCollection serviceCollection, Action? builder = null) { - var configurationBuilder = GrateConfigurationBuilder.Create(serviceCollection); + var configurationBuilder = GrateConfigurationBuilder.Create(); builder?.Invoke(configurationBuilder); var grateConfiguration = configurationBuilder.Build(); @@ -73,16 +73,16 @@ private static IServiceCollection AddGrateService(IServiceCollection collection) collection.TryAddTransient(); collection.TryAddTransient(); collection.TryAddTransient(); - collection.TryAddTransient(service => - { - var database = service.GetRequiredService(); - return new BatchSplitterReplacer(database.StatementSeparatorRegex, StatementSplitter.BatchTerminatorReplacementString); - }); - collection.TryAddTransient(service => - { - var database = service.GetRequiredService(); - return new StatementSplitter(database.StatementSeparatorRegex); - }); + // collection.TryAddTransient(service => + // { + // var database = service.GetRequiredService(); + // return new BatchSplitterReplacer(database.StatementSeparatorRegex, StatementSplitter.BatchTerminatorReplacementString); + // }); + // collection.TryAddTransient(service => + // { + // var database = service.GetRequiredService(); + // return new StatementSplitter(database.StatementSeparatorRegex); + // }); return collection; } diff --git a/src/grate.core/Infrastructure/BatchSplitterReplacer.cs b/src/grate.core/Infrastructure/BatchSplitterReplacer.cs index d1440433..cb571314 100644 --- a/src/grate.core/Infrastructure/BatchSplitterReplacer.cs +++ b/src/grate.core/Infrastructure/BatchSplitterReplacer.cs @@ -8,9 +8,11 @@ internal class BatchSplitterReplacer private string Replacement { get; } private readonly Regex _regex; - public BatchSplitterReplacer(string pattern, string replacement) + public BatchSplitterReplacer(ISyntax syntax) { - Replacement = replacement; + var pattern = syntax.StatementSeparatorRegex; + Replacement = StatementSplitter.BatchTerminatorReplacementString; + _regex = new Regex(pattern, IgnoreCase | Multiline); } diff --git a/src/grate.core/Infrastructure/StatementSplitter.cs b/src/grate.core/Infrastructure/StatementSplitter.cs index 2516cdc4..14af76e6 100644 --- a/src/grate.core/Infrastructure/StatementSplitter.cs +++ b/src/grate.core/Infrastructure/StatementSplitter.cs @@ -1,4 +1,6 @@ -namespace grate.Infrastructure; +using grate.Migration; + +namespace grate.Infrastructure; internal class StatementSplitter { @@ -6,9 +8,9 @@ internal class StatementSplitter private readonly BatchSplitterReplacer _replacer; - public StatementSplitter(string separatorRegex) + public StatementSplitter(ISyntax syntax) { - _replacer = new BatchSplitterReplacer(separatorRegex, BatchTerminatorReplacementString); + _replacer = new BatchSplitterReplacer(syntax); } public IEnumerable Split(string statement) diff --git a/src/grate.core/Migration/AnsiSqlDatabase.cs b/src/grate.core/Migration/AnsiSqlDatabase.cs index b6c16af7..c8095788 100644 --- a/src/grate.core/Migration/AnsiSqlDatabase.cs +++ b/src/grate.core/Migration/AnsiSqlDatabase.cs @@ -32,7 +32,7 @@ protected AnsiSqlDatabase(ILogger logger, ISyntax syntax) { Logger = logger; _syntax = syntax; - StatementSplitter = new StatementSplitter(StatementSeparatorRegex); + StatementSplitter = new StatementSplitter(syntax); } public string ServerName => Connection.DataSource; @@ -649,7 +649,8 @@ INSERT INTO {ScriptsRunErrorsTable} private static async Task Close(DbConnection? conn) { - if (conn?.State is ConnectionState.Open or ConnectionState.Connecting) + //if (conn?.State is ConnectionState.Open or ConnectionState.Connecting) + if (conn is {} && conn.State != ConnectionState.Closed && conn.State != ConnectionState.Connecting) { await conn.CloseAsync(); } diff --git a/src/grate.core/Migration/GrateMigrator.cs b/src/grate.core/Migration/GrateMigrator.cs index cf3b8e44..9f10af1b 100644 --- a/src/grate.core/Migration/GrateMigrator.cs +++ b/src/grate.core/Migration/GrateMigrator.cs @@ -33,7 +33,11 @@ private init } } - public IGrateMigrator WithConfiguration(GrateConfiguration configuration) => this with { Configuration = configuration }; + public IGrateMigrator WithConfiguration(GrateConfiguration configuration) + { + return this with { Configuration = configuration }; + } + public IGrateMigrator WithConfiguration(Action builder) { var b = GrateConfigurationBuilder.Create(Configuration); diff --git a/src/grate.core/Migration/IDatabase.cs b/src/grate.core/Migration/IDatabase.cs index 803ab844..24b8c728 100644 --- a/src/grate.core/Migration/IDatabase.cs +++ b/src/grate.core/Migration/IDatabase.cs @@ -1,6 +1,5 @@ using System.Data.Common; using grate.Configuration; -using grate.Infrastructure; namespace grate.Migration; @@ -13,7 +12,6 @@ public interface IDatabase : IAsyncDisposable bool SupportsDdlTransactions { get; } bool SplitBatchStatements { get; } - string StatementSeparatorRegex { get; } public string ScriptsRunTable { get; } public string ScriptsRunErrorsTable { get; } public string VersionTable { get; } diff --git a/src/grate.postgresql/Migration/PostgreSqlDatabase.cs b/src/grate.postgresql/Migration/PostgreSqlDatabase.cs index 1d0346de..04011334 100644 --- a/src/grate.postgresql/Migration/PostgreSqlDatabase.cs +++ b/src/grate.postgresql/Migration/PostgreSqlDatabase.cs @@ -24,11 +24,9 @@ public PostgreSqlDatabase(ILogger logger) public override Task RestoreDatabase(string backupPath) { - throw new System.NotImplementedException("Restoring a database from file is not currently supported for Postgresql."); + throw new NotImplementedException("Restoring a database from file is not currently supported for Postgresql."); } - public override bool SplitBatchStatements => true; - public override IEnumerable GetStatements(string sql) => ReflectionNpgsqlQueryParser.Split(sql); } diff --git a/unittests/Basic_tests/DependencyInjection/AddGrate.cs b/unittests/Basic_tests/DependencyInjection/AddGrate.cs index fad23847..df992712 100644 --- a/unittests/Basic_tests/DependencyInjection/AddGrate.cs +++ b/unittests/Basic_tests/DependencyInjection/AddGrate.cs @@ -12,7 +12,7 @@ public class AddGrate public void Registers_GrateConfiguration_in_the_ServiceCollection() { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); var config = builder.Build(); serviceCollection.AddGrate(config); serviceCollection.Should().ContainSingle(s => s.ServiceType == typeof(GrateConfiguration)); diff --git a/unittests/Basic_tests/DependencyInjection/GrateConfigurationBuilder_Factory.cs b/unittests/Basic_tests/DependencyInjection/GrateConfigurationBuilder_Factory.cs index cf74b0f1..673ea957 100644 --- a/unittests/Basic_tests/DependencyInjection/GrateConfigurationBuilder_Factory.cs +++ b/unittests/Basic_tests/DependencyInjection/GrateConfigurationBuilder_Factory.cs @@ -12,7 +12,7 @@ public class GrateConfigurationBuilder_Factory public void Creates_default_builder_with_non_interactive() { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); var grateConfiguration = builder.Build(); grateConfiguration.NonInteractive.Should().Be(true); } @@ -24,7 +24,7 @@ public void Creates_default_builder_with_output_folder(string outputFolder) var outputDir = Directory.CreateDirectory(outputFolder); WriteSql(Wrap(outputDir, "views"), "01_test_view.sql", "create view v_test as select 1"); var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithOutputFolder(outputFolder); var grateConfiguration = builder.Build(); grateConfiguration.OutputPath.Should().NotBeNull(); @@ -39,7 +39,7 @@ public void Creates_default_builder_with_sql_folder(string sqlFolder) var sqlDir = Directory.CreateDirectory(sqlFolder); WriteSql(Wrap(sqlDir, "views"), "01_test_view.sql", "create view v_test as select 1"); var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithSqlFilesDirectory(sqlFolder); var grateConfiguration = builder.Build(); grateConfiguration.SqlFilesDirectory.Should().NotBeNull(); @@ -52,7 +52,7 @@ public void Creates_default_builder_with_sql_folder(string sqlFolder) public void Creates_default_builder_with_schema(string schemaName) { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithSchema(schemaName); var grateConfiguration = builder.Build(); grateConfiguration.SchemaName.Should().Be(schemaName); @@ -64,7 +64,7 @@ public void Creates_default_builder_with_schema(string schemaName) public void Creates_default_builder_with_connection_string(string connectionString) { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithConnectionString(connectionString); var grateConfiguration = builder.Build(); grateConfiguration.ConnectionString.Should().Be(connectionString); @@ -76,7 +76,7 @@ public void Creates_default_builder_with_connection_string(string connectionStri public void Creates_default_builder_with_admin_connection_string(string adminConnectionString) { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithAdminConnectionString(adminConnectionString); var grateConfiguration = builder.Build(); grateConfiguration.AdminConnectionString.Should().Be(adminConnectionString); @@ -88,7 +88,7 @@ public void Creates_default_builder_with_admin_connection_string(string adminCon public void Creates_default_builder_with_version(string version) { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithVersion(version); var grateConfiguration = builder.Build(); grateConfiguration.Version.Should().Be(version); @@ -97,7 +97,7 @@ public void Creates_default_builder_with_version(string version) public void Creates_default_builder_with_do_not_create_database() { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.DoNotCreateDatabase(); var grateConfiguration = builder.Build(); grateConfiguration.CreateDatabase.Should().Be(false); @@ -107,7 +107,7 @@ public void Creates_default_builder_with_do_not_create_database() public void Creates_default_builder_with_transaction() { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithTransaction(); var grateConfiguration = builder.Build(); grateConfiguration.Transaction.Should().Be(true); @@ -121,7 +121,7 @@ public void Creates_default_builder_with_transaction() public void Creates_default_builder_with_environment_name(string environmentName) { var serviceCollection = new ServiceCollection(); - var builder = GrateConfigurationBuilder.Create(serviceCollection); + var builder = GrateConfigurationBuilder.Create(); builder.WithEnvironment(environmentName); var grateConfiguration = builder.Build(); grateConfiguration.Environment.Should().NotBeNull(); diff --git a/unittests/Oracle/Basic_tests/BatchSplitterReplacer_.cs b/unittests/Oracle/Basic_tests/BatchSplitterReplacer_.cs index 9c8fcfc3..775e5bfa 100644 --- a/unittests/Oracle/Basic_tests/BatchSplitterReplacer_.cs +++ b/unittests/Oracle/Basic_tests/BatchSplitterReplacer_.cs @@ -25,10 +25,10 @@ public class should_replace_on private ITestOutputHelper _testOutput; private BatchSplitterReplacer Replacer; - public should_replace_on(ITestOutputHelper testOutput, IDatabase database) + public should_replace_on(ITestOutputHelper testOutput, ISyntax syntax) { _testOutput = testOutput; - Replacer = new BatchSplitterReplacer(database.StatementSeparatorRegex, StatementSplitter.BatchTerminatorReplacementString); + Replacer = new BatchSplitterReplacer(syntax); } [Fact] @@ -287,10 +287,10 @@ public class should_not_replace_on private ITestOutputHelper _testOutput; private BatchSplitterReplacer Replacer; - public should_not_replace_on(ITestOutputHelper testOutput, IDatabase database) + public should_not_replace_on(ITestOutputHelper testOutput, ISyntax syntax) { _testOutput = testOutput; - Replacer = new BatchSplitterReplacer(database.StatementSeparatorRegex, StatementSplitter.BatchTerminatorReplacementString); + Replacer = new BatchSplitterReplacer(syntax); } [Fact] diff --git a/unittests/Oracle/Basic_tests/StatementSplitter_.cs b/unittests/Oracle/Basic_tests/StatementSplitter_.cs index 2cdd6642..968b629b 100644 --- a/unittests/Oracle/Basic_tests/StatementSplitter_.cs +++ b/unittests/Oracle/Basic_tests/StatementSplitter_.cs @@ -10,9 +10,9 @@ public class StatementSplitter_ { private readonly StatementSplitter _splitter; - public StatementSplitter_(IDatabase database) + public StatementSplitter_(ISyntax syntax) { - _splitter = new StatementSplitter(database.StatementSeparatorRegex); + _splitter = new StatementSplitter(syntax); } [Fact] diff --git a/unittests/PostgreSQL/Statement_Splitting/StatementSplitter_.cs b/unittests/PostgreSQL/Statement_Splitting/StatementSplitter_.cs index 0a25fbc3..72547280 100644 --- a/unittests/PostgreSQL/Statement_Splitting/StatementSplitter_.cs +++ b/unittests/PostgreSQL/Statement_Splitting/StatementSplitter_.cs @@ -1,6 +1,7 @@ using FluentAssertions; using grate.Infrastructure; using grate.Migration; +using grate.PostgreSql.Infrastructure; namespace Basic_tests.Infrastructure.PostgreSQL.Statement_Splitting; @@ -10,9 +11,9 @@ public class StatementSplitter_ { private readonly StatementSplitter _statementSplitter; - public StatementSplitter_(IDatabase database) + public StatementSplitter_() { - _statementSplitter = new StatementSplitter(database.StatementSeparatorRegex); + _statementSplitter = new StatementSplitter(new PostgreSqlSyntax()); } [Fact] diff --git a/unittests/SqlServer/Basic_tests/BatchSplitterReplacer_.cs b/unittests/SqlServer/Basic_tests/BatchSplitterReplacer_.cs index 1eae9bab..ea252f67 100644 --- a/unittests/SqlServer/Basic_tests/BatchSplitterReplacer_.cs +++ b/unittests/SqlServer/Basic_tests/BatchSplitterReplacer_.cs @@ -19,10 +19,10 @@ public class should_replace_on private ITestOutputHelper _testOutput; private BatchSplitterReplacer Replacer; - public should_replace_on(ITestOutputHelper testOutput, IDatabase database) + public should_replace_on(ITestOutputHelper testOutput, ISyntax syntax) { _testOutput = testOutput; - Replacer = new BatchSplitterReplacer(database.StatementSeparatorRegex, StatementSplitter.BatchTerminatorReplacementString); + Replacer = new BatchSplitterReplacer(syntax); } [Fact] @@ -281,10 +281,10 @@ public class should_not_replace_on private readonly ITestOutputHelper _testOutput; private readonly BatchSplitterReplacer _replacer; - public should_not_replace_on(ITestOutputHelper testOutput, IDatabase database) + public should_not_replace_on(ITestOutputHelper testOutput, ISyntax syntax) { _testOutput = testOutput; - _replacer = new BatchSplitterReplacer(database.StatementSeparatorRegex, StatementSplitter.BatchTerminatorReplacementString); + _replacer = new BatchSplitterReplacer(syntax); } [Fact] diff --git a/unittests/SqlServer/Basic_tests/StatementSplitter_.cs b/unittests/SqlServer/Basic_tests/StatementSplitter_.cs index 09491ddd..e1230e1c 100644 --- a/unittests/SqlServer/Basic_tests/StatementSplitter_.cs +++ b/unittests/SqlServer/Basic_tests/StatementSplitter_.cs @@ -10,9 +10,9 @@ public class StatementSplitter_ { private readonly StatementSplitter _splitter; - public StatementSplitter_(IDatabase database) + public StatementSplitter_(ISyntax syntax) { - _splitter = new StatementSplitter(database.StatementSeparatorRegex); + _splitter = new StatementSplitter(syntax); } [Fact] diff --git a/unittests/TestCommon/DependencyInjection/GrateServiceCollectionTest.cs b/unittests/TestCommon/DependencyInjection/GrateServiceCollectionTest.cs index bf005192..133ff1a9 100644 --- a/unittests/TestCommon/DependencyInjection/GrateServiceCollectionTest.cs +++ b/unittests/TestCommon/DependencyInjection/GrateServiceCollectionTest.cs @@ -39,8 +39,8 @@ public void Should_inject_all_necessary_services_to_container() ValidateService(serviceCollection, typeof(IGrateMigrator), ServiceLifetime.Transient, typeof(GrateMigrator)); ValidateService(serviceCollection, typeof(IDbMigrator), ServiceLifetime.Transient, typeof(DbMigrator)); ValidateService(serviceCollection, typeof(IHashGenerator), ServiceLifetime.Transient, typeof(HashGenerator)); - ValidateService(serviceCollection, typeof(BatchSplitterReplacer), ServiceLifetime.Transient); - ValidateService(serviceCollection, typeof(StatementSplitter), ServiceLifetime.Transient); + //ValidateService(serviceCollection, typeof(BatchSplitterReplacer), ServiceLifetime.Transient); + //ValidateService(serviceCollection, typeof(StatementSplitter), ServiceLifetime.Transient); ValidateService(serviceCollection, typeof(IDatabase), ServiceLifetime.Transient, Context.DatabaseType); }