mirror of
https://github.com/Radarr/Radarr
synced 2025-12-06 16:32:36 +01:00
Bump FluentMigrator to official 6.2.0
(cherry picked from commit 82299cfc04732371e6709612cdb7d8d4eaf6ead3)
This commit is contained in:
parent
1b6b68ccb2
commit
b18ddefca2
8 changed files with 147 additions and 38 deletions
|
|
@ -7,6 +7,5 @@
|
||||||
<add key="Mono.Posix.NETStandard" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/Mono.Posix.NETStandard/nuget/v3/index.json" />
|
<add key="Mono.Posix.NETStandard" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/Mono.Posix.NETStandard/nuget/v3/index.json" />
|
||||||
<add key="SQLite" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/SQLite/nuget/v3/index.json" />
|
<add key="SQLite" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/SQLite/nuget/v3/index.json" />
|
||||||
<add key="FFMpegCore" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/FFMpegCore/nuget/v3/index.json" />
|
<add key="FFMpegCore" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/FFMpegCore/nuget/v3/index.json" />
|
||||||
<add key="FluentMigrator" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/FluentMigrator/nuget/v3/index.json" />
|
|
||||||
</packageSources>
|
</packageSources>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
namespace NzbDrone.Core.Datastore.Migration
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
{
|
{
|
||||||
[Maintenance(MigrationStage.BeforeAll, TransactionBehavior.None)]
|
[Maintenance(MigrationStage.BeforeAll, TransactionBehavior.None)]
|
||||||
public class DatabaseEngineVersionCheck : FluentMigrator.Migration
|
public class DatabaseEngineVersionCheck : ForwardOnlyMigration
|
||||||
{
|
{
|
||||||
protected readonly Logger _logger;
|
protected readonly Logger _logger;
|
||||||
|
|
||||||
|
|
@ -22,11 +22,6 @@ public override void Up()
|
||||||
IfDatabase("postgres").Execute.WithConnection(LogPostgresVersion);
|
IfDatabase("postgres").Execute.WithConnection(LogPostgresVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Down()
|
|
||||||
{
|
|
||||||
// No-op
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LogSqliteVersion(IDbConnection conn, IDbTransaction tran)
|
private void LogSqliteVersion(IDbConnection conn, IDbTransaction tran)
|
||||||
{
|
{
|
||||||
using (var versionCmd = conn.CreateCommand())
|
using (var versionCmd = conn.CreateCommand())
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ protected override void MainDbUpgrade()
|
||||||
if (!Schema.Table("ImportExclusions").Exists())
|
if (!Schema.Table("ImportExclusions").Exists())
|
||||||
{
|
{
|
||||||
Create.TableForModel("ImportExclusions")
|
Create.TableForModel("ImportExclusions")
|
||||||
.WithColumn("TmdbId").AsInt64().NotNullable().Unique().PrimaryKey()
|
.WithColumn("TmdbId").AsInt64().NotNullable().Unique()
|
||||||
.WithColumn("MovieTitle").AsString().Nullable()
|
.WithColumn("MovieTitle").AsString().Nullable()
|
||||||
.WithColumn("MovieYear").AsInt64().Nullable().WithDefaultValue(0);
|
.WithColumn("MovieYear").AsInt64().Nullable().WithDefaultValue(0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
using FluentMigrator.Runner.Initialization;
|
using FluentMigrator.Runner.Initialization;
|
||||||
using FluentMigrator.Runner.Processors;
|
using FluentMigrator.Runner.Processors;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using NLog;
|
using NLog;
|
||||||
using NLog.Extensions.Logging;
|
using NLog.Extensions.Logging;
|
||||||
|
|
||||||
|
|
@ -20,13 +19,10 @@ public interface IMigrationController
|
||||||
public class MigrationController : IMigrationController
|
public class MigrationController : IMigrationController
|
||||||
{
|
{
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
private readonly ILoggerProvider _migrationLoggerProvider;
|
|
||||||
|
|
||||||
public MigrationController(Logger logger,
|
public MigrationController(Logger logger)
|
||||||
ILoggerProvider migrationLoggerProvider)
|
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_migrationLoggerProvider = migrationLoggerProvider;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
public void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
||||||
|
|
@ -35,16 +31,13 @@ public void Migrate(string connectionString, MigrationContext migrationContext,
|
||||||
|
|
||||||
_logger.Info("*** Migrating {0} ***", connectionString);
|
_logger.Info("*** Migrating {0} ***", connectionString);
|
||||||
|
|
||||||
ServiceProvider serviceProvider;
|
|
||||||
|
|
||||||
var db = databaseType == DatabaseType.SQLite ? "sqlite" : "postgres";
|
var db = databaseType == DatabaseType.SQLite ? "sqlite" : "postgres";
|
||||||
|
|
||||||
serviceProvider = new ServiceCollection()
|
var serviceProvider = new ServiceCollection()
|
||||||
.AddLogging(b => b.AddNLog())
|
.AddLogging(b => b.AddNLog())
|
||||||
.AddFluentMigratorCore()
|
.AddFluentMigratorCore()
|
||||||
.Configure<RunnerOptions>(cfg => cfg.IncludeUntaggedMaintenances = true)
|
.Configure<RunnerOptions>(cfg => cfg.IncludeUntaggedMaintenances = true)
|
||||||
.ConfigureRunner(
|
.ConfigureRunner(builder => builder
|
||||||
builder => builder
|
|
||||||
.AddPostgres()
|
.AddPostgres()
|
||||||
.AddNzbDroneSQLite()
|
.AddNzbDroneSQLite()
|
||||||
.WithGlobalConnectionString(connectionString)
|
.WithGlobalConnectionString(connectionString)
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,14 @@
|
||||||
using FluentMigrator.Builders.Create.Table;
|
using FluentMigrator.Builders.Create.Table;
|
||||||
using FluentMigrator.Runner;
|
using FluentMigrator.Runner;
|
||||||
using FluentMigrator.Runner.BatchParser;
|
using FluentMigrator.Runner.BatchParser;
|
||||||
|
using FluentMigrator.Runner.Generators;
|
||||||
using FluentMigrator.Runner.Generators.SQLite;
|
using FluentMigrator.Runner.Generators.SQLite;
|
||||||
|
using FluentMigrator.Runner.Initialization;
|
||||||
|
using FluentMigrator.Runner.Processors;
|
||||||
using FluentMigrator.Runner.Processors.SQLite;
|
using FluentMigrator.Runner.Processors.SQLite;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Datastore.Migration.Framework
|
namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||||
{
|
{
|
||||||
|
|
@ -26,23 +31,40 @@ public static IDbCommand CreateCommand(this IDbConnection conn, IDbTransaction t
|
||||||
return command;
|
return command;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddParameter(this System.Data.IDbCommand command, object value)
|
public static void AddParameter(this IDbCommand command, object value)
|
||||||
{
|
{
|
||||||
var parameter = command.CreateParameter();
|
var parameter = command.CreateParameter();
|
||||||
parameter.Value = value;
|
parameter.Value = value;
|
||||||
command.Parameters.Add(parameter);
|
command.Parameters.Add(parameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMigrationRunnerBuilder AddNzbDroneSQLite(this IMigrationRunnerBuilder builder)
|
public static IMigrationRunnerBuilder AddNzbDroneSQLite(this IMigrationRunnerBuilder builder, bool binaryGuid = false, bool useStrictTables = false)
|
||||||
{
|
{
|
||||||
builder.Services
|
builder.Services
|
||||||
.AddTransient<SQLiteBatchParser>()
|
.AddTransient<SQLiteBatchParser>()
|
||||||
.AddScoped<SQLiteDbFactory>()
|
.AddScoped<SQLiteDbFactory>()
|
||||||
.AddScoped<NzbDroneSQLiteProcessor>()
|
.AddScoped<NzbDroneSQLiteProcessor>(sp =>
|
||||||
|
{
|
||||||
|
var factory = sp.GetService<SQLiteDbFactory>();
|
||||||
|
var logger = sp.GetService<ILogger<NzbDroneSQLiteProcessor>>();
|
||||||
|
var options = sp.GetService<IOptionsSnapshot<ProcessorOptions>>();
|
||||||
|
var connectionStringAccessor = sp.GetService<IConnectionStringAccessor>();
|
||||||
|
var sqliteQuoter = new SQLiteQuoter(false);
|
||||||
|
return new NzbDroneSQLiteProcessor(factory, sp.GetService<SQLiteGenerator>(), logger, options, connectionStringAccessor, sp, sqliteQuoter);
|
||||||
|
})
|
||||||
|
.AddScoped<ISQLiteTypeMap>(_ => new NzbDroneSQLiteTypeMap(useStrictTables))
|
||||||
.AddScoped<IMigrationProcessor>(sp => sp.GetRequiredService<NzbDroneSQLiteProcessor>())
|
.AddScoped<IMigrationProcessor>(sp => sp.GetRequiredService<NzbDroneSQLiteProcessor>())
|
||||||
.AddScoped<SQLiteQuoter>()
|
.AddScoped(
|
||||||
.AddScoped<SQLiteGenerator>()
|
sp =>
|
||||||
|
{
|
||||||
|
var typeMap = sp.GetRequiredService<ISQLiteTypeMap>();
|
||||||
|
return new SQLiteGenerator(
|
||||||
|
new SQLiteQuoter(binaryGuid),
|
||||||
|
typeMap,
|
||||||
|
new OptionsWrapper<GeneratorOptions>(new GeneratorOptions()));
|
||||||
|
})
|
||||||
.AddScoped<IMigrationGenerator>(sp => sp.GetRequiredService<SQLiteGenerator>());
|
.AddScoped<IMigrationGenerator>(sp => sp.GetRequiredService<SQLiteGenerator>());
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||||
{
|
{
|
||||||
public class NzbDroneSQLiteProcessor : SQLiteProcessor
|
public class NzbDroneSQLiteProcessor : SQLiteProcessor
|
||||||
{
|
{
|
||||||
|
private readonly SQLiteQuoter _quoter;
|
||||||
|
|
||||||
public NzbDroneSQLiteProcessor(SQLiteDbFactory factory,
|
public NzbDroneSQLiteProcessor(SQLiteDbFactory factory,
|
||||||
SQLiteGenerator generator,
|
SQLiteGenerator generator,
|
||||||
ILogger<NzbDroneSQLiteProcessor> logger,
|
ILogger<NzbDroneSQLiteProcessor> logger,
|
||||||
|
|
@ -24,6 +26,7 @@ public NzbDroneSQLiteProcessor(SQLiteDbFactory factory,
|
||||||
SQLiteQuoter quoter)
|
SQLiteQuoter quoter)
|
||||||
: base(factory, generator, logger, options, connectionStringAccessor, serviceProvider, quoter)
|
: base(factory, generator, logger, options, connectionStringAccessor, serviceProvider, quoter)
|
||||||
{
|
{
|
||||||
|
_quoter = quoter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Process(AlterColumnExpression expression)
|
public override void Process(AlterColumnExpression expression)
|
||||||
|
|
@ -35,7 +38,7 @@ public override void Process(AlterColumnExpression expression)
|
||||||
|
|
||||||
if (columnIndex == -1)
|
if (columnIndex == -1)
|
||||||
{
|
{
|
||||||
throw new ApplicationException(string.Format("Column {0} does not exist on table {1}.", expression.Column.Name, expression.TableName));
|
throw new ApplicationException($"Column {expression.Column.Name} does not exist on table {expression.TableName}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
columnDefinitions[columnIndex] = expression.Column;
|
columnDefinitions[columnIndex] = expression.Column;
|
||||||
|
|
@ -45,6 +48,28 @@ public override void Process(AlterColumnExpression expression)
|
||||||
ProcessAlterTable(tableDefinition);
|
ProcessAlterTable(tableDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Process(AlterDefaultConstraintExpression expression)
|
||||||
|
{
|
||||||
|
var tableDefinition = GetTableSchema(expression.TableName);
|
||||||
|
|
||||||
|
var columnDefinitions = tableDefinition.Columns.ToList();
|
||||||
|
var columnIndex = columnDefinitions.FindIndex(c => c.Name == expression.ColumnName);
|
||||||
|
|
||||||
|
if (columnIndex == -1)
|
||||||
|
{
|
||||||
|
throw new ApplicationException($"Column {expression.ColumnName} does not exist on table {expression.TableName}.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var changedColumn = columnDefinitions[columnIndex];
|
||||||
|
changedColumn.DefaultValue = expression.DefaultValue;
|
||||||
|
|
||||||
|
columnDefinitions[columnIndex] = changedColumn;
|
||||||
|
|
||||||
|
tableDefinition.Columns = columnDefinitions;
|
||||||
|
|
||||||
|
ProcessAlterTable(tableDefinition);
|
||||||
|
}
|
||||||
|
|
||||||
public override void Process(DeleteColumnExpression expression)
|
public override void Process(DeleteColumnExpression expression)
|
||||||
{
|
{
|
||||||
var tableDefinition = GetTableSchema(expression.TableName);
|
var tableDefinition = GetTableSchema(expression.TableName);
|
||||||
|
|
@ -62,7 +87,7 @@ public override void Process(DeleteColumnExpression expression)
|
||||||
|
|
||||||
if (columnsToRemove.Any())
|
if (columnsToRemove.Any())
|
||||||
{
|
{
|
||||||
throw new ApplicationException(string.Format("Column {0} does not exist on table {1}.", columnsToRemove.First(), expression.TableName));
|
throw new ApplicationException($"Column {columnsToRemove.First()} does not exist on table {expression.TableName}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessAlterTable(tableDefinition);
|
ProcessAlterTable(tableDefinition);
|
||||||
|
|
@ -78,12 +103,12 @@ public override void Process(RenameColumnExpression expression)
|
||||||
|
|
||||||
if (columnIndex == -1)
|
if (columnIndex == -1)
|
||||||
{
|
{
|
||||||
throw new ApplicationException(string.Format("Column {0} does not exist on table {1}.", expression.OldName, expression.TableName));
|
throw new ApplicationException($"Column {expression.OldName} does not exist on table {expression.TableName}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (columnDefinitions.Any(c => c.Name == expression.NewName))
|
if (columnDefinitions.Any(c => c.Name == expression.NewName))
|
||||||
{
|
{
|
||||||
throw new ApplicationException(string.Format("Column {0} already exists on table {1}.", expression.NewName, expression.TableName));
|
throw new ApplicationException($"Column {expression.NewName} already exists on table {expression.TableName}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
oldColumnDefinitions[columnIndex] = (ColumnDefinition)columnDefinitions[columnIndex].Clone();
|
oldColumnDefinitions[columnIndex] = (ColumnDefinition)columnDefinitions[columnIndex].Clone();
|
||||||
|
|
@ -128,21 +153,20 @@ protected virtual void ProcessAlterTable(TableDefinition tableDefinition, List<C
|
||||||
}
|
}
|
||||||
|
|
||||||
// What is the cleanest way to do this? Add function to Generator?
|
// What is the cleanest way to do this? Add function to Generator?
|
||||||
var quoter = new SQLiteQuoter();
|
var columnsToInsert = string.Join(", ", tableDefinition.Columns.Select(c => _quoter.QuoteColumnName(c.Name)));
|
||||||
var columnsToInsert = string.Join(", ", tableDefinition.Columns.Select(c => quoter.QuoteColumnName(c.Name)));
|
var columnsToFetch = string.Join(", ", (oldColumnDefinitions ?? tableDefinition.Columns).Select(c => _quoter.QuoteColumnName(c.Name)));
|
||||||
var columnsToFetch = string.Join(", ", (oldColumnDefinitions ?? tableDefinition.Columns).Select(c => quoter.QuoteColumnName(c.Name)));
|
|
||||||
|
|
||||||
Process(new CreateTableExpression() { TableName = tempTableName, Columns = tableDefinition.Columns.ToList() });
|
Process(new CreateTableExpression { TableName = tempTableName, Columns = tableDefinition.Columns.ToList() });
|
||||||
|
|
||||||
Process(string.Format("INSERT INTO {0} ({1}) SELECT {2} FROM {3}", quoter.QuoteTableName(tempTableName), columnsToInsert, columnsToFetch, quoter.QuoteTableName(tableName)));
|
Process($"INSERT INTO {_quoter.QuoteTableName(tempTableName)} ({columnsToInsert}) SELECT {columnsToFetch} FROM {_quoter.QuoteTableName(tableName)}");
|
||||||
|
|
||||||
Process(new DeleteTableExpression() { TableName = tableName });
|
Process(new DeleteTableExpression { TableName = tableName });
|
||||||
|
|
||||||
Process(new RenameTableExpression() { OldName = tempTableName, NewName = tableName });
|
Process(new RenameTableExpression { OldName = tempTableName, NewName = tableName });
|
||||||
|
|
||||||
foreach (var index in tableDefinition.Indexes)
|
foreach (var index in tableDefinition.Indexes)
|
||||||
{
|
{
|
||||||
Process(new CreateIndexExpression() { Index = index });
|
Process(new CreateIndexExpression { Index = index });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
using System.Data;
|
||||||
|
using FluentMigrator.Runner.Generators.Base;
|
||||||
|
using FluentMigrator.Runner.Generators.SQLite;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
|
||||||
|
// Based on https://github.com/fluentmigrator/fluentmigrator/blob/v6.2.0/src/FluentMigrator.Runner.SQLite/Generators/SQLite/SQLiteTypeMap.cs
|
||||||
|
public sealed class NzbDroneSQLiteTypeMap : TypeMapBase, ISQLiteTypeMap
|
||||||
|
{
|
||||||
|
public bool UseStrictTables { get; }
|
||||||
|
|
||||||
|
public NzbDroneSQLiteTypeMap(bool useStrictTables = false)
|
||||||
|
{
|
||||||
|
UseStrictTables = useStrictTables;
|
||||||
|
|
||||||
|
SetupTypeMaps();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must be kept in sync with upstream
|
||||||
|
protected override void SetupTypeMaps()
|
||||||
|
{
|
||||||
|
SetTypeMap(DbType.Binary, "BLOB");
|
||||||
|
SetTypeMap(DbType.Byte, "INTEGER");
|
||||||
|
SetTypeMap(DbType.Int16, "INTEGER");
|
||||||
|
SetTypeMap(DbType.Int32, "INTEGER");
|
||||||
|
SetTypeMap(DbType.Int64, "INTEGER");
|
||||||
|
SetTypeMap(DbType.SByte, "INTEGER");
|
||||||
|
SetTypeMap(DbType.UInt16, "INTEGER");
|
||||||
|
SetTypeMap(DbType.UInt32, "INTEGER");
|
||||||
|
SetTypeMap(DbType.UInt64, "INTEGER");
|
||||||
|
|
||||||
|
if (!UseStrictTables)
|
||||||
|
{
|
||||||
|
SetTypeMap(DbType.Currency, "NUMERIC");
|
||||||
|
SetTypeMap(DbType.Decimal, "NUMERIC");
|
||||||
|
SetTypeMap(DbType.Double, "NUMERIC");
|
||||||
|
SetTypeMap(DbType.Single, "NUMERIC");
|
||||||
|
SetTypeMap(DbType.VarNumeric, "NUMERIC");
|
||||||
|
SetTypeMap(DbType.Date, "DATETIME");
|
||||||
|
SetTypeMap(DbType.DateTime, "DATETIME");
|
||||||
|
SetTypeMap(DbType.DateTime2, "DATETIME");
|
||||||
|
SetTypeMap(DbType.Time, "DATETIME");
|
||||||
|
SetTypeMap(DbType.Guid, "UNIQUEIDENTIFIER");
|
||||||
|
|
||||||
|
// Custom so that we can use DateTimeOffset in Postgres for appropriate DB typing
|
||||||
|
SetTypeMap(DbType.DateTimeOffset, "DATETIME");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetTypeMap(DbType.Currency, "TEXT");
|
||||||
|
SetTypeMap(DbType.Decimal, "TEXT");
|
||||||
|
SetTypeMap(DbType.Double, "REAL");
|
||||||
|
SetTypeMap(DbType.Single, "REAL");
|
||||||
|
SetTypeMap(DbType.VarNumeric, "TEXT");
|
||||||
|
SetTypeMap(DbType.Date, "TEXT");
|
||||||
|
SetTypeMap(DbType.DateTime, "TEXT");
|
||||||
|
SetTypeMap(DbType.DateTime2, "TEXT");
|
||||||
|
SetTypeMap(DbType.Time, "TEXT");
|
||||||
|
SetTypeMap(DbType.Guid, "TEXT");
|
||||||
|
|
||||||
|
// Custom so that we can use DateTimeOffset in Postgres for appropriate DB typing
|
||||||
|
SetTypeMap(DbType.DateTimeOffset, "TEXT");
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTypeMap(DbType.AnsiString, "TEXT");
|
||||||
|
SetTypeMap(DbType.String, "TEXT");
|
||||||
|
SetTypeMap(DbType.AnsiStringFixedLength, "TEXT");
|
||||||
|
SetTypeMap(DbType.StringFixedLength, "TEXT");
|
||||||
|
SetTypeMap(DbType.Boolean, "INTEGER");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetTypeMap(DbType type, int? size, int? precision)
|
||||||
|
{
|
||||||
|
return base.GetTypeMap(type, size: null, precision: null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -17,9 +17,9 @@
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
||||||
<PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />
|
<PackageReference Include="FluentMigrator.Runner" Version="6.2.0" />
|
||||||
<PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
|
<PackageReference Include="FluentMigrator.Runner.SQLite" Version="6.2.0" />
|
||||||
<PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
|
<PackageReference Include="FluentMigrator.Runner.Postgres" Version="6.2.0" />
|
||||||
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.11" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.11" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue