diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index e15fed7..a84d298 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -18,8 +18,11 @@ jobs: with: dotnet-version: 3.1.301 - name: Restore dependencies + working-directory: src run: dotnet restore - name: Build + working-directory: src run: dotnet build --no-restore - name: Test + working-directory: src run: dotnet test --no-build --verbosity normal diff --git a/src/MigrationEngine.Tests/MigrationEngine.Tests.csproj b/src/MigrationEngine.Tests/MigrationEngine.Tests.csproj index aae5613..4762c8e 100644 --- a/src/MigrationEngine.Tests/MigrationEngine.Tests.csproj +++ b/src/MigrationEngine.Tests/MigrationEngine.Tests.csproj @@ -1,7 +1,7 @@ - net472 + netstandard21 false @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/src/MigrationEngine/Implementations/DryRun/DryRunConnectionManager.cs b/src/MigrationEngine/Implementations/DryRun/DryRunConnectionManager.cs new file mode 100644 index 0000000..5f28435 --- /dev/null +++ b/src/MigrationEngine/Implementations/DryRun/DryRunConnectionManager.cs @@ -0,0 +1,28 @@ +using System; +using System.Data.Common; +using System.Threading.Tasks; +using MigrationEngine.Interfaces; + +namespace MigrationEngine.Implementations.DryRun +{ + public class DryRunConnectionManager : IConnectionManager + { + private readonly IConnectionManager manager; + + public DryRunConnectionManager(IConnectionManager manager) + { + this.manager = manager; + } + + public Task RunCommand(Func> action) => manager.RunCommand(action); + + public void Commit() + { + // NEVER COMMIT IN A DRY RUN + } + + public void Dispose() + { + } + } +} diff --git a/src/MigrationEngine/Implementations/DryRun/DryRunDatabase.cs b/src/MigrationEngine/Implementations/DryRun/DryRunDatabase.cs new file mode 100644 index 0000000..880fb9c --- /dev/null +++ b/src/MigrationEngine/Implementations/DryRun/DryRunDatabase.cs @@ -0,0 +1,28 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using MigrationEngine.Interfaces; + +namespace MigrationEngine.Implementations.DryRun +{ + public class DryRunDatabase : IDatabase + { + public string Name { get; } + + private readonly IConnectionManager connection; + + public DryRunDatabase(string name, IConnectionManager connection) + { + Name = name; + this.connection = new DryRunConnectionManager(connection); + } + + public Task Drop(CancellationToken token = default) => throw new Exception("Cannot drop in a dry run"); + + public Task Exists(CancellationToken token = default) => Task.FromResult(true); + + public Task Create(CancellationToken token = default) => throw new Exception("Cannot create databases in a dry run"); + + public Task OpenConnection(bool withTransaction = false) => Task.FromResult(connection); + } +} diff --git a/src/MigrationEngine/MigrationEngine.cs b/src/MigrationEngine/MigrationEngine.cs index 17f1fa8..4d2e78f 100644 --- a/src/MigrationEngine/MigrationEngine.cs +++ b/src/MigrationEngine/MigrationEngine.cs @@ -26,19 +26,22 @@ public MigrationEngine(IDatabase database, ILogger log) this.log = log ?? NullLogger.Instance; } - public async Task EnsureDatabase(CancellationToken ct = default) + public async Task DryRun(IEnumerable> migrations, IJournal journal = null, CancellationToken ct = default) + where T : IJournalEntry { - if (!await database.Exists(ct)) + using (var connection = await database.OpenConnection(true)) { - await database.Create(ct); + return await MigrateInternal(new DryRunDatabase(database.Name, connection), migrations, journal, ct); } } - public Task Migrate(IEnumerable> migrations, CancellationToken token = default) + public Task Migrate(IEnumerable> migrations, IJournal journal = null, CancellationToken ct = default) where T : IJournalEntry - => Migrate(migrations, new NullJournal(), token); + { + return MigrateInternal(database, migrations, journal, ct); + } - public async Task Migrate(IEnumerable> migrations, IJournal journal = null, CancellationToken token = default) + private async Task MigrateInternal(IDatabase db, IEnumerable> migrations, IJournal journal, CancellationToken ct) where T : IJournalEntry { journal = journal ?? new NullJournal(); @@ -52,11 +55,11 @@ public async Task Migrate(IEnumerable> migrations, IJ try { sw.Start(); - await mig.Run(database, journal, token); + await mig.Run(db, journal, ct); sw.Stop(); times[mig.Name] = sw.Elapsed; - log.LogDebug("{0} ({1}) {2}", database.Name, sw.Elapsed, mig.Name); + log.LogDebug("{0} ({1}) {2}", db.Name, sw.Elapsed, mig.Name); sw.Reset(); } @@ -71,12 +74,12 @@ public async Task Migrate(IEnumerable> migrations, IJ async Task> EnsureJournal() { - using (var con = await database.OpenConnection()) + using (var con = await db.OpenConnection()) { - log.LogInformation("{0} -> Getting journal entries", database.Name); - return await journal.EnsureJournal(con, token); + log.LogInformation("{0} -> Getting journal entries", db.Name); + return await journal.EnsureJournal(con, ct); } } } } -} \ No newline at end of file +} diff --git a/src/MigrationEngine/MigrationEngine.csproj b/src/MigrationEngine/MigrationEngine.csproj index 6f96232..c7a7342 100644 --- a/src/MigrationEngine/MigrationEngine.csproj +++ b/src/MigrationEngine/MigrationEngine.csproj @@ -4,7 +4,7 @@ MigrationEngine pitermarx - net472 + netstandard21 MigrationEngine MigrationEngine MigrationEngine