Skip to content
Open
3 changes: 3 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions src/MigrationEngine.Tests/MigrationEngine.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<TargetFramework>netstandard21</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>

Expand All @@ -15,4 +15,4 @@
<ProjectReference Include="..\MigrationEngine\MigrationEngine.csproj" />
</ItemGroup>

</Project>
</Project>
Original file line number Diff line number Diff line change
@@ -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<T> RunCommand<T>(Func<DbCommand, Task<T>> action) => manager.RunCommand(action);

public void Commit()
{
// NEVER COMMIT IN A DRY RUN
}

public void Dispose()
{
}
}
}
28 changes: 28 additions & 0 deletions src/MigrationEngine/Implementations/DryRun/DryRunDatabase.cs
Original file line number Diff line number Diff line change
@@ -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<bool> 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<IConnectionManager> OpenConnection(bool withTransaction = false) => Task.FromResult(connection);
}
}
27 changes: 15 additions & 12 deletions src/MigrationEngine/MigrationEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<TimeSpan> DryRun<T>(IEnumerable<IMigration<T>> migrations, IJournal<T> 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<TimeSpan> Migrate<T>(IEnumerable<IMigration<T>> migrations, CancellationToken token = default)
public Task<TimeSpan> Migrate<T>(IEnumerable<IMigration<T>> migrations, IJournal<T> journal = null, CancellationToken ct = default)
where T : IJournalEntry
=> Migrate(migrations, new NullJournal<T>(), token);
{
return MigrateInternal(database, migrations, journal, ct);
}

public async Task<TimeSpan> Migrate<T>(IEnumerable<IMigration<T>> migrations, IJournal<T> journal = null, CancellationToken token = default)
private async Task<TimeSpan> MigrateInternal<T>(IDatabase db, IEnumerable<IMigration<T>> migrations, IJournal<T> journal, CancellationToken ct)
where T : IJournalEntry
{
journal = journal ?? new NullJournal<T>();
Expand All @@ -52,11 +55,11 @@ public async Task<TimeSpan> Migrate<T>(IEnumerable<IMigration<T>> 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();
}
Expand All @@ -71,12 +74,12 @@ public async Task<TimeSpan> Migrate<T>(IEnumerable<IMigration<T>> migrations, IJ

async Task<IReadOnlyList<T>> 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);
}
}
}
}
}
}
2 changes: 1 addition & 1 deletion src/MigrationEngine/MigrationEngine.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<PropertyGroup>
<Title>MigrationEngine</Title>
<Authors>pitermarx</Authors>
<TargetFrameworks>net472</TargetFrameworks>
<TargetFrameworks>netstandard21</TargetFrameworks>
<AssemblyName>MigrationEngine</AssemblyName>
<RootNamespace>MigrationEngine</RootNamespace>
<PackageId>MigrationEngine</PackageId>
Expand Down