Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 28 additions & 29 deletions Respawn/Respawner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ public static async Task<Respawner> CreateAsync(string nameOrConnectionString, R

await using var connection = new SqlConnection(nameOrConnectionString);

await connection.OpenAsync();
await connection.OpenAsync().ConfigureAwait(false);

var respawner = new Respawner(options);

await respawner.BuildDeleteTables(connection);
await respawner.BuildDeleteTables(connection).ConfigureAwait(false);

return respawner;
}
Expand All @@ -59,80 +59,79 @@ public static async Task<Respawner> CreateAsync(DbConnection connection, Respawn

var respawner = new Respawner(options);

await respawner.BuildDeleteTables(connection);
await respawner.BuildDeleteTables(connection).ConfigureAwait(false);

return respawner;
}


public virtual async Task ResetAsync(string nameOrConnectionString)
{
await using var connection = new SqlConnection(nameOrConnectionString);

await connection.OpenAsync();
await connection.OpenAsync().ConfigureAwait(false);

await ResetAsync(connection);
await ResetAsync(connection).ConfigureAwait(false);
}

public virtual async Task ResetAsync(DbConnection connection)
{
if (_temporalTables.Any())
{
var turnOffVersioningCommandText = Options.DbAdapter.BuildTurnOffSystemVersioningCommandText(_temporalTables);
await ExecuteAlterSystemVersioningAsync(connection, turnOffVersioningCommandText);
await ExecuteAlterSystemVersioningAsync(connection, turnOffVersioningCommandText).ConfigureAwait(false);
}

try
{
await ExecuteDeleteSqlAsync(connection);
await ExecuteDeleteSqlAsync(connection).ConfigureAwait(false);
}
finally
{
if (_temporalTables.Any())
{
var turnOnVersioningCommandText = Options.DbAdapter.BuildTurnOnSystemVersioningCommandText(_temporalTables);
await ExecuteAlterSystemVersioningAsync(connection, turnOnVersioningCommandText);
await ExecuteAlterSystemVersioningAsync(connection, turnOnVersioningCommandText).ConfigureAwait(false);
}
}
}

private async Task ExecuteAlterSystemVersioningAsync(DbConnection connection, string commandText)
{
await using var tx = await connection.BeginTransactionAsync();
await using var tx = await connection.BeginTransactionAsync().ConfigureAwait(false);
await using var cmd = connection.CreateCommand();

cmd.CommandTimeout = Options.CommandTimeout ?? cmd.CommandTimeout;
cmd.CommandText = commandText;
cmd.Transaction = tx;

await cmd.ExecuteNonQueryAsync();
await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);

await tx.CommitAsync();
await tx.CommitAsync().ConfigureAwait(false);
}

private async Task ExecuteDeleteSqlAsync(DbConnection connection)
{
await using var tx = await connection.BeginTransactionAsync();
await using var tx = await connection.BeginTransactionAsync().ConfigureAwait(false);
await using var cmd = connection.CreateCommand();

cmd.CommandTimeout = Options.CommandTimeout ?? cmd.CommandTimeout;
cmd.CommandText = DeleteSql;
cmd.Transaction = tx;

await cmd.ExecuteNonQueryAsync();
await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);

if (ReseedSql != null)
{
cmd.CommandText = ReseedSql;
await cmd.ExecuteNonQueryAsync();
await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
}

await tx.CommitAsync();
await tx.CommitAsync().ConfigureAwait(false);
}

private async Task BuildDeleteTables(DbConnection connection)
{
var allTables = await GetAllTables(connection);
var allTables = await GetAllTables(connection).ConfigureAwait(false);

if (!allTables.Any())
{
Expand All @@ -142,10 +141,10 @@ private async Task BuildDeleteTables(DbConnection connection)

if (Options.CheckTemporalTables && await Options.DbAdapter.CheckSupportsTemporalTables(connection))
{
_temporalTables = await GetAllTemporalTables(connection);
_temporalTables = await GetAllTemporalTables(connection).ConfigureAwait(false);
}

var allRelationships = await GetRelationships(connection);
var allRelationships = await GetRelationships(connection).ConfigureAwait(false);

var graphBuilder = new GraphBuilder(allTables, allRelationships);

Expand All @@ -162,13 +161,13 @@ private async Task<HashSet<Relationship>> GetRelationships(DbConnection connecti

cmd.CommandText = commandText;

await using var reader = await cmd.ExecuteReaderAsync();
await using var reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false);

while (await reader.ReadAsync())
while (await reader.ReadAsync().ConfigureAwait(false))
{
relationships.Add(new Relationship(
new Table(await reader.IsDBNullAsync(0) ? null : reader.GetString(0), reader.GetString(1)),
new Table(await reader.IsDBNullAsync(2) ? null : reader.GetString(2), reader.GetString(3)),
new Table(await reader.IsDBNullAsync(0).ConfigureAwait(false) ? null : reader.GetString(0), reader.GetString(1)),
new Table(await reader.IsDBNullAsync(2).ConfigureAwait(false) ? null : reader.GetString(2), reader.GetString(3)),
reader.GetString(4)));
}

Expand All @@ -185,11 +184,11 @@ private async Task<HashSet<Table>> GetAllTables(DbConnection connection)

cmd.CommandText = commandText;

await using var reader = await cmd.ExecuteReaderAsync();
await using var reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false);

while (await reader.ReadAsync())
while (await reader.ReadAsync().ConfigureAwait(false))
{
tables.Add(new Table(await reader.IsDBNullAsync(0) ? null : reader.GetString(0), reader.GetString(1)));
tables.Add(new Table(await reader.IsDBNullAsync(0).ConfigureAwait(false) ? null : reader.GetString(0), reader.GetString(1)));
}

return tables;
Expand All @@ -205,11 +204,11 @@ private async Task<IList<TemporalTable>> GetAllTemporalTables(DbConnection conne

cmd.CommandText = commandText;

await using var reader = await cmd.ExecuteReaderAsync();
await using var reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false);

while (await reader.ReadAsync())
while (await reader.ReadAsync().ConfigureAwait(false))
{
tables.Add(new TemporalTable(await reader.IsDBNullAsync(0) ? null : reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3)));
tables.Add(new TemporalTable(await reader.IsDBNullAsync(0).ConfigureAwait(false) ? null : reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3)));
}

return tables;
Expand Down
8 changes: 4 additions & 4 deletions Respawn/SqlServerDbAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -308,8 +308,8 @@ public string BuildTurnOnSystemVersioningCommandText(IEnumerable<TemporalTable>

public async Task<bool> CheckSupportsTemporalTables(DbConnection connection)
{
_compatibilityLevel ??= await GetCompatibilityLevel(connection);
_engineEdition ??= await GetEngineEdition(connection);
_compatibilityLevel ??= await GetCompatibilityLevel(connection).ConfigureAwait(false);
_engineEdition ??= await GetEngineEdition(connection).ConfigureAwait(false);

//Code taken from https://github.com/dotnet/efcore/blob/main/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs
return _compatibilityLevel >= 130 && _engineEdition != 6;
Expand All @@ -320,7 +320,7 @@ private static async Task<int> GetEngineEdition(DbConnection connection)
await using var command = connection.CreateCommand();
command.CommandText = @"
SELECT SERVERPROPERTY('EngineEdition');";
var engineEdition = await command.ExecuteScalarAsync();
var engineEdition = await command.ExecuteScalarAsync().ConfigureAwait(false);
return (int)engineEdition!;
}

Expand All @@ -332,7 +332,7 @@ SELECT compatibility_level
FROM sys.databases
WHERE name = '{connection.Database}';";

var result = await command.ExecuteScalarAsync();
var result = await command.ExecuteScalarAsync().ConfigureAwait(false);
return result != null ? Convert.ToByte(result) : (byte)0;
}
}
Expand Down