Skip to content

Commit c063aca

Browse files
committed
fixed support for multiple registered IDatabaseMigrationProvider(s), added overridable AdoNetStubDatabaseMigrationProvider.GetSqlMigrationCommands, bumped version to 1.35.2
1 parent 7e2b709 commit c063aca

File tree

24 files changed

+194
-93
lines changed

24 files changed

+194
-93
lines changed

Common.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<Project>
22

33
<PropertyGroup>
4-
<VersionPrefix>1.35.1</VersionPrefix>
4+
<VersionPrefix>1.35.2</VersionPrefix>
55
</PropertyGroup>
66

77
<PropertyGroup>
88
<Authors>Revo Framework</Authors>
99
<Copyright>Copyright (c) 2017-2024 Martin Zima</Copyright>
1010
<EmbedUntrackedSources>true</EmbedUntrackedSources>
1111
<IncludeSymbols>true</IncludeSymbols>
12-
<LangVersion>11</LangVersion>
12+
<LangVersion>12</LangVersion>
1313
<PackageIcon>icon-128.png</PackageIcon>
1414
<PackageIconUrl>https://raw.githubusercontent.com/revoframework/Revo/develop/res/icon-128.png</PackageIconUrl>
1515
<PackageLicenseExpression>MIT</PackageLicenseExpression>

Examples/Todos/Revo.Examples.Todos.Tests/Revo.Examples.Todos.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1212
</PackageReference>
1313
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
14+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
1515
<PrivateAssets>all</PrivateAssets>
1616
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1717
</PackageReference>

Extensions/Tests/Revo.Extensions.History.Tests/Revo.Extensions.History.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1212
</PackageReference>
1313
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
14+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
1515
<PrivateAssets>all</PrivateAssets>
1616
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1717
</PackageReference>

Extensions/Tests/Revo.Extensions.Notifications.Tests/Revo.Extensions.Notifications.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1212
</PackageReference>
1313
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
14+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
1515
<PrivateAssets>all</PrivateAssets>
1616
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1717
</PackageReference>

Providers/EF6/Tests/Revo.EF6.Tests/Revo.EF6.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1212
</PackageReference>
1313
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
14+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
1515
<PrivateAssets>all</PrivateAssets>
1616
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1717
</PackageReference>

Providers/EFCore/Tests/Revo.EFCore.Tests/Revo.EFCore.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1313
</PackageReference>
1414
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
15-
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
15+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
1616
<PrivateAssets>all</PrivateAssets>
1717
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1818
</PackageReference>

Providers/EasyNetQ/Tests/Revo.EasyNetQ.Tests/Revo.EasyNetQ.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1313
</PackageReference>
1414
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
15-
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
15+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
1616
<PrivateAssets>all</PrivateAssets>
1717
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1818
</PackageReference>

RELEASE_NOTES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# RELEASE NOTES
22

3+
## [1.35.2] - 2024-03-14
4+
5+
### Fixed
6+
7+
- fixed support for multiple registered IDatabaseMigrationProvider(s)
8+
39
## [1.35.1] - 2024-01-18
410

511
### Changed

Revo.Infrastructure/DataAccess/Migrations/DatabaseMigrationExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private async Task<IReadOnlyCollection<PendingModuleMigration>> SelectModuleMigr
132132
.Distinct()
133133
.ToArray();
134134

135-
var selectedMigrations = await migrationSelector.SelectMigrationsAsync(migratedModules, environmentTags);
135+
var selectedMigrations = await migrationSelector.SelectMigrationsAsync(provider, migratedModules, environmentTags);
136136

137137
if (selectedMigrations.Count > 0 && selectedMigrations.SelectMany(x => x.Migrations)
138138
.All(provider.SupportsMigration))

Revo.Infrastructure/DataAccess/Migrations/DatabaseMigrationSelector.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,18 @@ namespace Revo.Infrastructure.DataAccess.Migrations
88
public class DatabaseMigrationSelector : IDatabaseMigrationSelector
99
{
1010
private readonly IDatabaseMigrationRegistry migrationRegistry;
11-
private readonly IDatabaseMigrationProvider migrationProvider;
1211
private readonly IDatabaseMigrationSelectorOptions selectorOptions;
1312
private IReadOnlyCollection<IDatabaseMigrationRecord> history;
1413

15-
public DatabaseMigrationSelector(IDatabaseMigrationRegistry migrationRegistry, IDatabaseMigrationProvider migrationProvider,
14+
public DatabaseMigrationSelector(IDatabaseMigrationRegistry migrationRegistry,
1615
IDatabaseMigrationSelectorOptions selectorOptions)
1716
{
1817
this.migrationRegistry = migrationRegistry;
19-
this.migrationProvider = migrationProvider;
2018
this.selectorOptions = selectorOptions;
2119
}
2220

23-
public async Task<IReadOnlyCollection<SelectedModuleMigrations>> SelectMigrationsAsync(DatabaseMigrationSpecifier[] modules, string[] tags)
21+
public async Task<IReadOnlyCollection<SelectedModuleMigrations>> SelectMigrationsAsync(IDatabaseMigrationProvider migrationProvider,
22+
DatabaseMigrationSpecifier[] modules, string[] tags)
2423
{
2524
try
2625
{
@@ -33,7 +32,7 @@ public async Task<IReadOnlyCollection<SelectedModuleMigrations>> SelectMigration
3332

3433
foreach (var module in sortedModules)
3534
{
36-
var migrations = await DoSelectMigrationsAsync(module, tags, queuedMigrations);
35+
var migrations = await DoSelectMigrationsAsync(module, tags, queuedMigrations, false);
3736

3837
if (migrations.Count > 0)
3938
{
@@ -58,10 +57,10 @@ private bool IsRepeatableMigration(DatabaseMigrationSpecifier specifier)
5857
}
5958

6059
private async Task<IReadOnlyCollection<IDatabaseMigration>> DoSelectMigrationsAsync(DatabaseMigrationSpecifier specifier, string[] tags,
61-
List<DatabaseMigrationSpecifier> queuedMigrations)
60+
List<DatabaseMigrationSpecifier> queuedMigrations, bool required)
6261
{
63-
var result = await SelectModuleMigrationsNoDependenciesAsync(specifier, tags, queuedMigrations);
64-
62+
var result = await SelectModuleMigrationsNoDependenciesAsync(specifier, tags, queuedMigrations, required);
63+
6564
foreach (var migration in result)
6665
{
6766
queuedMigrations.Add(new DatabaseMigrationSpecifier(migration.ModuleName, migration.Version));
@@ -81,7 +80,7 @@ private async Task AddRequiredDependenciesAsync(List<IDatabaseMigration> migrati
8180
var dependencySpecs = await GetRequiredMigrationDependenciesAsync(migration, queuedMigrations, tags);
8281
foreach (var dependencySpec in dependencySpecs)
8382
{
84-
var dependencyMigrations = await DoSelectMigrationsAsync(dependencySpec, tags, queuedMigrations);
83+
var dependencyMigrations = await DoSelectMigrationsAsync(dependencySpec, tags, queuedMigrations, true);
8584
migrations.InsertRange(i, dependencyMigrations);
8685
queuedMigrations.AddRange(dependencyMigrations.Select(x => new DatabaseMigrationSpecifier(x.ModuleName, x.Version)));
8786
i += dependencyMigrations.Count;
@@ -96,7 +95,7 @@ private async Task<List<DatabaseMigrationSpecifier>> GetRequiredMigrationDepende
9695

9796
foreach (var dependency in migration.Dependencies)
9897
{
99-
var dependencyMigrations = await SelectModuleMigrationsNoDependenciesAsync(dependency, tags, queuedMigrations);
98+
var dependencyMigrations = await SelectModuleMigrationsNoDependenciesAsync(dependency, tags, queuedMigrations, true);
10099
if (dependencyMigrations.Count > 0)
101100
{
102101
dependencies.Add(new DatabaseMigrationSpecifier(
@@ -109,18 +108,19 @@ private async Task<List<DatabaseMigrationSpecifier>> GetRequiredMigrationDepende
109108
}
110109

111110
private async Task<List<IDatabaseMigration>> SelectModuleMigrationsNoDependenciesAsync(DatabaseMigrationSpecifier specifier,
112-
string[] tags, List<DatabaseMigrationSpecifier> queuedMigrations)
111+
string[] tags, List<DatabaseMigrationSpecifier> queuedMigrations, bool required)
113112
{
114113
var moduleMigrations = migrationRegistry.Migrations
115-
.Where(x => string.Equals(x.ModuleName, specifier.ModuleName, StringComparison.InvariantCultureIgnoreCase))
114+
.Where(x => string.Equals(x.ModuleName, specifier.ModuleName, StringComparison.InvariantCultureIgnoreCase));
115+
var providerModuleMigrations = moduleMigrations
116116
.Where(x => x.Tags.All(tagGroup => tags.Any(tagGroup.Contains)));
117117

118118
if (specifier.Version != null)
119119
{
120-
moduleMigrations = moduleMigrations.Where(x => x.Version.CompareTo(specifier.Version) <= 0);
120+
providerModuleMigrations = providerModuleMigrations.Where(x => x.Version.CompareTo(specifier.Version) <= 0);
121121
}
122122

123-
moduleMigrations = moduleMigrations
123+
providerModuleMigrations = providerModuleMigrations
124124
.OrderBy(x => x.Version)
125125
.ToArray();
126126

@@ -131,14 +131,14 @@ private async Task<List<IDatabaseMigration>> SelectModuleMigrationsNoDependencie
131131

132132
if (specifier.Version != null)
133133
{
134-
if (moduleMigrations.Any() && moduleMigrations.Last().IsRepeatable)
134+
if (providerModuleMigrations.Any() && providerModuleMigrations.Last().IsRepeatable)
135135
{
136136
throw new DatabaseMigrationException($"Cannot select database migrations for module {specifier} because it is a repeatable migration module, which means it is versioned only by checksums");
137137
}
138138
}
139-
else if (!moduleMigrations.Any())
139+
else if (!providerModuleMigrations.Any())
140140
{
141-
if (!historyMigrations.Any())
141+
if (!historyMigrations.Any() && (required || !moduleMigrations.Any()))
142142
{
143143
// TODO maybe return without errors if there are migrations for this module with different tags?
144144
throw new DatabaseMigrationException($"Cannot select database migrations for module {specifier}: no migrations for specified module were found");
@@ -147,10 +147,10 @@ private async Task<List<IDatabaseMigration>> SelectModuleMigrationsNoDependencie
147147
return new List<IDatabaseMigration>();
148148
}
149149

150-
if (historyMigrations.Any() && moduleMigrations.Any())
150+
if (historyMigrations.Any() && providerModuleMigrations.Any())
151151
{
152152
bool wasRepeatable = historyMigrations.First().Version == null;
153-
bool isRepeatable = moduleMigrations.First().IsRepeatable;
153+
bool isRepeatable = providerModuleMigrations.First().IsRepeatable;
154154

155155
if (wasRepeatable != isRepeatable)
156156
{
@@ -166,7 +166,7 @@ private async Task<List<IDatabaseMigration>> SelectModuleMigrationsNoDependencie
166166
}
167167

168168
// repeatable-migration modules
169-
if (moduleMigrations.Any() && moduleMigrations.First().IsRepeatable)
169+
if (providerModuleMigrations.Any() && providerModuleMigrations.First().IsRepeatable)
170170
{
171171
if (moduleQueuedMigrations.Any())
172172
{
@@ -177,7 +177,7 @@ private async Task<List<IDatabaseMigration>> SelectModuleMigrationsNoDependencie
177177
.OrderByDescending(x => x.TimeApplied)
178178
.FirstOrDefault();
179179

180-
var migration = moduleMigrations.SingleOrDefault()
180+
var migration = providerModuleMigrations.SingleOrDefault()
181181
?? throw new DatabaseMigrationException($"Cannot select database migrations for repeatable module {specifier}: multiple migrations found");
182182

183183
// return if same and no dependencies got updated
@@ -214,21 +214,21 @@ private async Task<List<IDatabaseMigration>> SelectModuleMigrationsNoDependencie
214214

215215
if (version == null)
216216
{
217-
var baseline = moduleMigrations.FirstOrDefault(x => x.IsBaseline);
217+
var baseline = providerModuleMigrations.FirstOrDefault(x => x.IsBaseline);
218218
if (baseline != null)
219219
{
220220
result.Add(baseline);
221-
result.AddRange(moduleMigrations
221+
result.AddRange(providerModuleMigrations
222222
.Where(x => x.Version.CompareTo(baseline.Version) > 0));
223223
}
224224
else
225225
{
226-
result.AddRange(moduleMigrations);
226+
result.AddRange(providerModuleMigrations);
227227
}
228228
}
229229
else
230230
{
231-
result.AddRange(moduleMigrations
231+
result.AddRange(providerModuleMigrations
232232
.Where(x => !x.IsBaseline && x.Version.CompareTo(version) > 0));
233233
}
234234

@@ -242,7 +242,7 @@ private async Task<List<IDatabaseMigration>> SelectModuleMigrationsNoDependencie
242242
}
243243
else
244244
{
245-
var maxVersion = moduleMigrations.Select(x => x.Version).Max();
245+
var maxVersion = providerModuleMigrations.Select(x => x.Version).Max();
246246

247247
if ((!result.Any() && (version == null || version.CompareTo(maxVersion) < 0))
248248
|| (result.Any() && !result.Last().Version.Equals(maxVersion)))

0 commit comments

Comments
 (0)