From fd5ac3c713971ca715b1cbd5623c9a463de30d44 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 29 Jul 2021 00:09:21 -0400 Subject: [PATCH] Upgrade FluentMigrator from 1.6.2 to v3 Co-Authored-By: ta264 --- src/NuGet.Config | 1 - .../072_history_downloadIdFixture.cs | 6 +- .../SqliteSchemaDumperFixture.cs | 2 +- src/NzbDrone.Core.Test/Framework/DbTest.cs | 9 ++- .../Framework/MigrationTest.cs | 8 ++- ...me_quality_profiles_add_upgrade_allowed.cs | 43 ------------- .../Migration/Framework/MigrationContext.cs | 4 +- .../Framework/MigrationController.cs | 61 +++++++++++-------- .../Migration/Framework/MigrationDbFactory.cs | 14 ----- .../Migration/Framework/MigrationExtension.cs | 25 +++++++- .../Migration/Framework/MigrationLogger.cs | 33 +++++----- .../Framework/MigrationLoggerProvider.cs | 26 ++++++++ .../Migration/Framework/MigrationOptions.cs | 11 ---- .../Framework/NzbDroneMigrationBase.cs | 19 +----- .../Framework/NzbDroneSqliteProcessor.cs | 26 ++++---- .../NzbDroneSqliteProcessorFactory.cs | 18 ------ .../Migration/Framework/SqliteSchemaDumper.cs | 24 ++++---- .../Migration/Framework/SqliteSyntaxReader.cs | 31 ++++++++-- .../Migration/Framework/TableDefinition.cs | 49 +++++++++++++++ src/NzbDrone.Core/Sonarr.Core.csproj | 3 +- 20 files changed, 224 insertions(+), 189 deletions(-) delete mode 100644 src/NzbDrone.Core/Datastore/Migration/Framework/MigrationDbFactory.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLoggerProvider.cs delete mode 100644 src/NzbDrone.Core/Datastore/Migration/Framework/MigrationOptions.cs delete mode 100644 src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessorFactory.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/Framework/TableDefinition.cs diff --git a/src/NuGet.Config b/src/NuGet.Config index 7cfd5fb88..43cd33c3b 100644 --- a/src/NuGet.Config +++ b/src/NuGet.Config @@ -6,7 +6,6 @@ - \ No newline at end of file diff --git a/src/NzbDrone.Core.Test/Datastore/Migration/072_history_downloadIdFixture.cs b/src/NzbDrone.Core.Test/Datastore/Migration/072_history_downloadIdFixture.cs index c976f9b10..4798b931a 100644 --- a/src/NzbDrone.Core.Test/Datastore/Migration/072_history_downloadIdFixture.cs +++ b/src/NzbDrone.Core.Test/Datastore/Migration/072_history_downloadIdFixture.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Linq; using FluentAssertions; -using FluentMigrator; using NUnit.Framework; using NzbDrone.Common.Serializer; using NzbDrone.Core.Datastore.Migration; +using NzbDrone.Core.Datastore.Migration.Framework; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.Datastore.Migration @@ -89,9 +89,9 @@ namespace NzbDrone.Core.Test.Datastore.Migration history.DownloadId.Should().Be("123"); } - private void InsertHistory(MigrationBase migrationBase, Dictionary data) + private void InsertHistory(NzbDroneMigrationBase migration, Dictionary data) { - migrationBase.Insert.IntoTable("History").Row(new + migration.Insert.IntoTable("History").Row(new { EpisodeId = 1, SeriesId = 1, diff --git a/src/NzbDrone.Core.Test/Datastore/SqliteSchemaDumperTests/SqliteSchemaDumperFixture.cs b/src/NzbDrone.Core.Test/Datastore/SqliteSchemaDumperTests/SqliteSchemaDumperFixture.cs index f99e08254..9fb7be2b8 100644 --- a/src/NzbDrone.Core.Test/Datastore/SqliteSchemaDumperTests/SqliteSchemaDumperFixture.cs +++ b/src/NzbDrone.Core.Test/Datastore/SqliteSchemaDumperTests/SqliteSchemaDumperFixture.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Test.Datastore.SqliteSchemaDumperTests [SetUp] public void Setup() { - Subject = new SqliteSchemaDumper(null, null); + Subject = new SqliteSchemaDumper(null); } [TestCase(@"CREATE TABLE TestTable (MyId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT)", "TestTable", "MyId")] diff --git a/src/NzbDrone.Core.Test/Framework/DbTest.cs b/src/NzbDrone.Core.Test/Framework/DbTest.cs index 1eb68a55f..773c8bb21 100644 --- a/src/NzbDrone.Core.Test/Framework/DbTest.cs +++ b/src/NzbDrone.Core.Test/Framework/DbTest.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using System.Data.SQLite; -using System.IO; using System.Linq; -using FluentMigrator.Runner; using Marr.Data; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using NUnit.Framework; using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore.Migration.Framework; @@ -96,9 +96,14 @@ namespace NzbDrone.Core.Test.Framework return testDb; } + protected virtual void SetupLogging() + { + Mocker.SetConstant(NullLoggerProvider.Instance); + } protected void SetupContainer() { WithTempAsAppPath(); + SetupLogging(); Mocker.SetConstant(Mocker.Resolve()); Mocker.SetConstant(Mocker.Resolve()); diff --git a/src/NzbDrone.Core.Test/Framework/MigrationTest.cs b/src/NzbDrone.Core.Test/Framework/MigrationTest.cs index 35f9a5ab2..417c59673 100644 --- a/src/NzbDrone.Core.Test/Framework/MigrationTest.cs +++ b/src/NzbDrone.Core.Test/Framework/MigrationTest.cs @@ -1,6 +1,6 @@ using System; using FluentMigrator; -using FluentMigrator.Runner; +using Microsoft.Extensions.Logging; using NUnit.Framework; using NzbDrone.Core.Datastore.Migration.Framework; @@ -35,10 +35,14 @@ namespace NzbDrone.Core.Test.Framework return db.GetDirectDataMapper(); } + protected override void SetupLogging() + { + Mocker.SetConstant(Mocker.Resolve()); + } + [SetUp] public override void SetupDb() { - Mocker.SetConstant(Mocker.Resolve()); SetupContainer(); } } diff --git a/src/NzbDrone.Core/Datastore/Migration/128_rename_quality_profiles_add_upgrade_allowed.cs b/src/NzbDrone.Core/Datastore/Migration/128_rename_quality_profiles_add_upgrade_allowed.cs index 12ee67eb0..91739863b 100644 --- a/src/NzbDrone.Core/Datastore/Migration/128_rename_quality_profiles_add_upgrade_allowed.cs +++ b/src/NzbDrone.Core/Datastore/Migration/128_rename_quality_profiles_add_upgrade_allowed.cs @@ -1,20 +1,13 @@ using FluentMigrator; -using FluentMigrator.Infrastructure; using NzbDrone.Core.Datastore.Migration.Framework; -using System.Data; -using System.Data.SQLite; namespace NzbDrone.Core.Datastore.Migration { [Migration(128)] public class rename_quality_profiles_add_upgrade_allowed : NzbDroneMigrationBase { - private IMigrationContext _capturedContext; - protected override void MainDbUpgrade() { - FixupMigration111(); - Rename.Table("Profiles").To("QualityProfiles"); Alter.Table("QualityProfiles").AddColumn("UpgradeAllowed").AsInt32().Nullable(); @@ -26,41 +19,5 @@ namespace NzbDrone.Core.Datastore.Migration Rename.Column("ProfileId").OnTable("Series").To("QualityProfileId"); } - - public override void GetUpExpressions(IMigrationContext context) - { - _capturedContext = context; - - base.GetUpExpressions(context); - - _capturedContext = null; - } - - // Early Radarr versions can mess up Sonarr's database if they point to the same config. Fixup the damage. - private void FixupMigration111() - { - var builder = new SQLiteConnectionStringBuilder(ConnectionString); - builder.Pooling = false; - - // In order to get the expressions we need to check the database directly - using (var connection = new SQLiteConnection(builder.ToString())) - using (var command = connection.CreateCommand()) - { - connection.Open(); - command.CommandText = "SELECT Description FROM VersionInfo WHERE Version = 111"; - - var description = command.ExecuteScalar() as string; - connection.Close(); - - if (description == "remove_bitmetv") - { - // Get the migration expressions from the 111 migration - var migration111 = new create_language_profiles(); - migration111.GetUpExpressions(_capturedContext); - - Execute.Sql("UPDATE VersionInfo SET Description = 'create_language_profiles fixup' WHERE Version = 111"); - } - } - } } } diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationContext.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationContext.cs index c8882aab0..232143d23 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationContext.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationContext.cs @@ -4,6 +4,8 @@ namespace NzbDrone.Core.Datastore.Migration.Framework { public class MigrationContext { + public static MigrationContext Current { get; set; } + public MigrationType MigrationType { get; private set; } public long? DesiredVersion { get; set; } @@ -15,4 +17,4 @@ namespace NzbDrone.Core.Datastore.Migration.Framework DesiredVersion = desiredVersion; } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs index 07fb25ee2..e49b7b493 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs @@ -1,8 +1,12 @@ -using System.Data.SQLite; +using System; using System.Diagnostics; using System.Reflection; using FluentMigrator.Runner; using FluentMigrator.Runner.Initialization; +using FluentMigrator.Runner.Processors; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog; namespace NzbDrone.Core.Datastore.Migration.Framework { @@ -13,56 +17,59 @@ namespace NzbDrone.Core.Datastore.Migration.Framework public class MigrationController : IMigrationController { - private readonly IAnnouncer _announcer; + private readonly Logger _logger; + private readonly ILoggerProvider _migrationLoggerProvider; - public MigrationController(IAnnouncer announcer) + public MigrationController(Logger logger, + ILoggerProvider migrationLoggerProvider) { - _announcer = announcer; + _logger = logger; + _migrationLoggerProvider = migrationLoggerProvider; } public void Migrate(string connectionString, MigrationContext migrationContext) { var sw = Stopwatch.StartNew(); - _announcer.Heading("Checking database for required migrations " + connectionString); + _logger.Info("*** Migrating {0} ***", connectionString); - var assembly = Assembly.GetExecutingAssembly(); + var serviceProvider = new ServiceCollection() + .AddLogging(lb => lb.AddProvider(_migrationLoggerProvider)) + .AddFluentMigratorCore() + .ConfigureRunner( + builder => builder + .AddNzbDroneSQLite() + .WithGlobalConnectionString(connectionString) + .WithMigrationsIn(Assembly.GetExecutingAssembly())) + .Configure(opt => opt.Namespace = "NzbDrone.Core.Datastore.Migration") + .Configure(opt => + { + opt.PreviewOnly = false; + opt.Timeout = TimeSpan.FromSeconds(60); + }) + .BuildServiceProvider(); - var runnerContext = new RunnerContext(_announcer) + using (var scope = serviceProvider.CreateScope()) { - Namespace = "NzbDrone.Core.Datastore.Migration", - ApplicationContext = migrationContext - }; + var runner = scope.ServiceProvider.GetRequiredService(); - var options = new MigrationOptions { PreviewOnly = false, Timeout = 60 }; - var factory = new NzbDroneSqliteProcessorFactory(); - var processor = factory.Create(connectionString, _announcer, options); - - try - { - var runner = new MigrationRunner(assembly, runnerContext, processor); + MigrationContext.Current = migrationContext; if (migrationContext.DesiredVersion.HasValue) { - runner.MigrateUp(migrationContext.DesiredVersion.Value, true); + runner.MigrateUp(migrationContext.DesiredVersion.Value); } else { - runner.MigrateUp(true); + runner.MigrateUp(); } - processor.Dispose(); - } - catch (SQLiteException) - { - processor.Dispose(); - SQLiteConnection.ClearAllPools(); - throw; + MigrationContext.Current = null; } sw.Stop(); - _announcer.ElapsedTime(sw.Elapsed); + _logger.Debug("Took: {0}", sw.Elapsed); } } } diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationDbFactory.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationDbFactory.cs deleted file mode 100644 index b28923d1c..000000000 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationDbFactory.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Data.Common; -using System.Data.SQLite; -using FluentMigrator.Runner.Processors; - -namespace NzbDrone.Core.Datastore.Migration.Framework -{ - public class MigrationDbFactory : DbFactoryBase - { - protected override DbProviderFactory CreateFactory() - { - return SQLiteFactory.Instance; - } - } -} \ No newline at end of file diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationExtension.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationExtension.cs index 24a63f2ad..e159135d1 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationExtension.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationExtension.cs @@ -1,6 +1,12 @@ -using System.Data; +using FluentMigrator; using FluentMigrator.Builders.Create; using FluentMigrator.Builders.Create.Table; +using FluentMigrator.Runner; +using FluentMigrator.Runner.BatchParser; +using FluentMigrator.Runner.Generators.SQLite; +using FluentMigrator.Runner.Processors.SQLite; +using Microsoft.Extensions.DependencyInjection; +using System.Data; namespace NzbDrone.Core.Datastore.Migration.Framework { @@ -20,11 +26,24 @@ namespace NzbDrone.Core.Datastore.Migration.Framework return command; } - public static void AddParameter(this IDbCommand command, object value) + public static void AddParameter(this System.Data.IDbCommand command, object value) { var parameter = command.CreateParameter(); parameter.Value = value; command.Parameters.Add(parameter); } + + public static IMigrationRunnerBuilder AddNzbDroneSQLite(this IMigrationRunnerBuilder builder) + { + builder.Services + .AddTransient() + .AddScoped() + .AddScoped() + .AddScoped(sp => sp.GetRequiredService()) + .AddScoped() + .AddScoped() + .AddScoped(sp => sp.GetRequiredService()); + return builder; + } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLogger.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLogger.cs index 3418dd921..47ff934e1 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLogger.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLogger.cs @@ -1,58 +1,59 @@ using System; using FluentMigrator.Runner; +using FluentMigrator.Runner.Logging; using NLog; namespace NzbDrone.Core.Datastore.Migration.Framework { - public class MigrationLogger : IAnnouncer + public class MigrationLogger : FluentMigratorLogger { private readonly Logger _logger; - - public MigrationLogger(Logger logger) + public MigrationLogger(Logger logger, + FluentMigratorLoggerOptions options) + : base(options) { _logger = logger; } - - public void Heading(string message) + protected override void WriteHeading(string message) { _logger.Info("*** {0} ***", message); } - public void Say(string message) + protected override void WriteSay(string message) { _logger.Debug(message); } - public void Emphasize(string message) + protected override void WriteEmphasize(string message) { _logger.Warn(message); } - public void Sql(string sql) + protected override void WriteSql(string sql) { _logger.Debug(sql); } - public void ElapsedTime(TimeSpan timeSpan) + protected override void WriteEmptySql() + { + _logger.Debug(@"No SQL statement executed."); + } + + protected override void WriteElapsedTime(TimeSpan timeSpan) { _logger.Debug("Took: {0}", timeSpan); } - public void Error(string message) + protected override void WriteError(string message) { _logger.Error(message); } - public void Error(Exception exception) + protected override void WriteError(Exception exception) { _logger.Error(exception); } - - public void Write(string message, bool escaped) - { - _logger.Info(message); - } } } diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLoggerProvider.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLoggerProvider.cs new file mode 100644 index 000000000..23d2dafe0 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationLoggerProvider.cs @@ -0,0 +1,26 @@ +using FluentMigrator.Runner; +using Microsoft.Extensions.Logging; +using NLog; +using ILogger = Microsoft.Extensions.Logging.ILogger; + +namespace NzbDrone.Core.Datastore.Migration.Framework +{ + public class MigrationLoggerProvider : ILoggerProvider + { + private readonly Logger _logger; + + public MigrationLoggerProvider(Logger logger) + { + _logger = logger; + } + + public ILogger CreateLogger(string categoryName) + { + return new MigrationLogger(_logger, new FluentMigratorLoggerOptions() { ShowElapsedTime = true, ShowSql = true }); + } + + public void Dispose() + { + } + } +} diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationOptions.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationOptions.cs deleted file mode 100644 index 6a12df8dc..000000000 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationOptions.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FluentMigrator; - -namespace NzbDrone.Core.Datastore.Migration.Framework -{ - public class MigrationOptions : IMigrationProcessorOptions - { - public bool PreviewOnly { get; set; } - public int Timeout { get; set; } - public string ProviderSwitches { get; private set; } - } -} \ No newline at end of file diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneMigrationBase.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneMigrationBase.cs index 309168033..20971d097 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneMigrationBase.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneMigrationBase.cs @@ -8,7 +8,6 @@ namespace NzbDrone.Core.Datastore.Migration.Framework public abstract class NzbDroneMigrationBase : FluentMigrator.Migration { protected readonly Logger _logger; - private MigrationContext _migrationContext; protected NzbDroneMigrationBase() { @@ -32,26 +31,14 @@ namespace NzbDrone.Core.Datastore.Migration.Framework } } - public MigrationContext Context - { - get - { - if (_migrationContext == null) - { - _migrationContext = (MigrationContext)ApplicationContext; - } - return _migrationContext; - } - } - public override void Up() { - if (Context.BeforeMigration != null) + if (MigrationContext.Current.BeforeMigration != null) { - Context.BeforeMigration(this); + MigrationContext.Current.BeforeMigration(this); } - switch (Context.MigrationType) + switch (MigrationContext.Current.MigrationType) { case MigrationType.Main: LogMigrationMessage(MigrationType.Main); diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessor.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessor.cs index 5b1fb0a58..507f5fc3d 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessor.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessor.cs @@ -1,28 +1,32 @@ using System; using System.Collections.Generic; -using System.Data; using System.Linq; -using FluentMigrator; +using System.Text.RegularExpressions; using FluentMigrator.Expressions; using FluentMigrator.Model; -using FluentMigrator.Runner; -using FluentMigrator.Runner.Announcers; using FluentMigrator.Runner.Generators.SQLite; +using FluentMigrator.Runner.Initialization; +using FluentMigrator.Runner.Processors; using FluentMigrator.Runner.Processors.SQLite; -using System.Text.RegularExpressions; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; namespace NzbDrone.Core.Datastore.Migration.Framework { - public class NzbDroneSqliteProcessor : SQLiteProcessor + public class NzbDroneSQLiteProcessor : SQLiteProcessor { - public NzbDroneSqliteProcessor(IDbConnection connection, IMigrationGenerator generator, IAnnouncer announcer, IMigrationProcessorOptions options, FluentMigrator.Runner.Processors.IDbFactory factory) - : base(connection, generator, announcer, options, factory) + public NzbDroneSQLiteProcessor(SQLiteDbFactory factory, + SQLiteGenerator generator, + ILogger logger, + IOptionsSnapshot options, + IConnectionStringAccessor connectionStringAccessor, + IServiceProvider serviceProvider, + SQLiteQuoter quoter) + : base(factory, generator, logger, options, connectionStringAccessor, serviceProvider, quoter) { } - public override bool SupportsTransactions => true; - public override void Process(AlterColumnExpression expression) { var tableDefinition = GetTableSchema(expression.TableName); @@ -107,7 +111,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework protected virtual TableDefinition GetTableSchema(string tableName) { - var schemaDumper = new SqliteSchemaDumper(this, Announcer); + var schemaDumper = new SqliteSchemaDumper(this); var schema = schemaDumper.ReadDbSchema(); return schema.Single(v => v.Name == tableName); diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessorFactory.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessorFactory.cs deleted file mode 100644 index 52ea473e9..000000000 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/NzbDroneSqliteProcessorFactory.cs +++ /dev/null @@ -1,18 +0,0 @@ -using FluentMigrator; -using FluentMigrator.Runner; -using FluentMigrator.Runner.Generators.SQLite; -using FluentMigrator.Runner.Processors.SQLite; - -namespace NzbDrone.Core.Datastore.Migration.Framework -{ - public class NzbDroneSqliteProcessorFactory : SQLiteProcessorFactory - { - public override IMigrationProcessor Create(string connectionString, IAnnouncer announcer, IMigrationProcessorOptions options) - { - var factory = new MigrationDbFactory(); - var connection = factory.CreateConnection(connectionString); - var generator = new SQLiteGenerator { compatabilityMode = CompatabilityMode.STRICT }; - return new NzbDroneSqliteProcessor(connection, generator, announcer, options, factory); - } - } -} diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSchemaDumper.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSchemaDumper.cs index c97c0ea4b..042b124bc 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSchemaDumper.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSchemaDumper.cs @@ -2,7 +2,6 @@ using System.Data; using System.Linq; using FluentMigrator.Model; -using FluentMigrator.Runner; using FluentMigrator.Runner.Processors.SQLite; namespace NzbDrone.Core.Datastore.Migration.Framework @@ -11,13 +10,11 @@ namespace NzbDrone.Core.Datastore.Migration.Framework // The original implementation had bad support for escaped identifiers, amongst other things. public class SqliteSchemaDumper { - public SqliteSchemaDumper(SQLiteProcessor processor, IAnnouncer announcer) + public SqliteSchemaDumper(SQLiteProcessor processor) { - Announcer = announcer; Processor = processor; } - public virtual IAnnouncer Announcer { get; set; } public SQLiteProcessor Processor { get; set; } protected internal virtual TableDefinition ReadTableSchema(string sqlSchema) @@ -42,7 +39,9 @@ namespace NzbDrone.Core.Datastore.Migration.Framework { var table = new TableDefinition(); - while (reader.Read() != SqliteSyntaxReader.TokenType.StringToken || reader.ValueToUpper != "TABLE") ; + while (reader.Read() != SqliteSyntaxReader.TokenType.StringToken || reader.ValueToUpper != "TABLE") + { + } if (reader.Read() == SqliteSyntaxReader.TokenType.StringToken && reader.ValueToUpper == "IF") { @@ -108,7 +107,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework var column = new ColumnDefinition(); column.Name = ParseIdentifier(reader); - + reader.TrimBuffer(); reader.Read(); @@ -135,7 +134,10 @@ namespace NzbDrone.Core.Datastore.Migration.Framework reader.Read(); index.IsUnique = reader.ValueToUpper == "UNIQUE"; - while (reader.ValueToUpper != "INDEX") reader.Read(); + while (reader.ValueToUpper != "INDEX") + { + reader.Read(); + } if (reader.Read() == SqliteSyntaxReader.TokenType.StringToken && reader.ValueToUpper == "IF") { @@ -152,7 +154,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework reader.Read(); // ON index.TableName = ParseIdentifier(reader); - + // Find Column List reader.SkipTillToken(SqliteSyntaxReader.TokenType.ListStart); @@ -196,8 +198,6 @@ namespace NzbDrone.Core.Datastore.Migration.Framework return reader.Value; } - #region ISchemaDumper Members - public virtual IList ReadDbSchema() { IList tables = ReadTables(); @@ -210,8 +210,6 @@ namespace NzbDrone.Core.Datastore.Migration.Framework return tables; } - #endregion - protected virtual DataSet Read(string template, params object[] args) { return Processor.Read(template, args); @@ -276,4 +274,4 @@ namespace NzbDrone.Core.Datastore.Migration.Framework return indexes; } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSyntaxReader.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSyntaxReader.cs index fd7db0215..d77c84439 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSyntaxReader.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/SqliteSyntaxReader.cs @@ -48,18 +48,25 @@ namespace NzbDrone.Core.Datastore.Migration.Framework public void SkipWhitespace() { - while (!IsEndOfFile && char.IsWhiteSpace(Buffer[Index])) Index++; + while (!IsEndOfFile && char.IsWhiteSpace(Buffer[Index])) + { + Index++; + } } public void SkipTillToken(TokenType tokenType) { if (IsEndOfFile) + { return; + } while (Read() != tokenType) { if (Type == TokenType.ListStart) + { SkipTillToken(TokenType.ListEnd); + } } } @@ -148,9 +155,12 @@ namespace NzbDrone.Core.Datastore.Migration.Framework { var start = Index; var end = start + 1; - while (end < Buffer.Length && (char.IsLetter(Buffer[end]) || char.IsNumber(Buffer[end]) || Buffer[end] == '_')) end++; + while (end < Buffer.Length && (char.IsLetter(Buffer[end]) || char.IsNumber(Buffer[end]) || Buffer[end] == '_')) + { + end++; + } - if (end >= Buffer.Length || Buffer[end] == ',' || Buffer[end] == '(' || Buffer[end] == ')' || char.IsWhiteSpace(Buffer[end])) + if (end >= Buffer.Length || Buffer[end] == ',' || Buffer[end] == ')' || Buffer[end] == '(' || char.IsWhiteSpace(Buffer[end])) { Index = end; } @@ -215,7 +225,10 @@ namespace NzbDrone.Core.Datastore.Migration.Framework var start = Index + 1; var end = Buffer.IndexOf(terminator, Index); - if (end == -1) throw new SyntaxErrorException(); + if (end == -1) + { + throw new SyntaxErrorException(); + } Index = end + 1; return Buffer.Substring(start, end - start); @@ -230,12 +243,18 @@ namespace NzbDrone.Core.Datastore.Migration.Framework var start = Index + 1; var end = Buffer.IndexOf(escape, start); - if (end == -1) throw new SyntaxErrorException(); + if (end == -1) + { + throw new SyntaxErrorException(); + } Index = end + 1; identifier.Append(Buffer.Substring(start, end - start)); - if (Buffer[Index] != escape) break; + if (Buffer[Index] != escape) + { + break; + } identifier.Append(escape); } diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/TableDefinition.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/TableDefinition.cs new file mode 100644 index 000000000..0e7d78f13 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/TableDefinition.cs @@ -0,0 +1,49 @@ +// Copyright (c) 2007-2009, Sean Chambers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +using System; +using System.Collections.Generic; +using System.Linq; +using FluentMigrator.Infrastructure.Extensions; +using FluentMigrator.Model; + +namespace NzbDrone.Core.Datastore.Migration.Framework +{ + public class TableDefinition : ICloneable + { + public TableDefinition() + { + Columns = new List(); + ForeignKeys = new List(); + Indexes = new List(); + } + + public virtual string Name { get; set; } + public virtual string SchemaName { get; set; } + public virtual ICollection Columns { get; set; } + public virtual ICollection ForeignKeys { get; set; } + public virtual ICollection Indexes { get; set; } + + public object Clone() + { + return new TableDefinition + { + Name = Name, + SchemaName = SchemaName, + Columns = Columns.CloneAll().ToList(), + Indexes = Indexes.CloneAll().ToList() + }; + } + } +} diff --git a/src/NzbDrone.Core/Sonarr.Core.csproj b/src/NzbDrone.Core/Sonarr.Core.csproj index a1e3651ad..2b6ca9ea6 100644 --- a/src/NzbDrone.Core/Sonarr.Core.csproj +++ b/src/NzbDrone.Core/Sonarr.Core.csproj @@ -4,7 +4,8 @@ x86 - + +