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