diff --git a/NzbDrone.Core/Datastore/Migration/Framework/MigrationExtension.cs b/NzbDrone.Core/Datastore/Migration/Framework/MigrationExtension.cs new file mode 100644 index 000000000..565630165 --- /dev/null +++ b/NzbDrone.Core/Datastore/Migration/Framework/MigrationExtension.cs @@ -0,0 +1,14 @@ +using FluentMigrator.Builders.Create; +using FluentMigrator.Builders.Create.Table; + +namespace NzbDrone.Core.Datastore.Migration.Framework +{ + public static class MigrationExtension + { + public static ICreateTableColumnOptionOrWithColumnSyntax TableForModel(this ICreateExpressionRoot expressionRoot, string name) + { + return expressionRoot.Table(name).WithColumn("Id").AsInt32().PrimaryKey().Identity(); + } + + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migration/Migration20130324.cs b/NzbDrone.Core/Datastore/Migration/Migration20130324.cs index 879857db2..0be6fcbf9 100644 --- a/NzbDrone.Core/Datastore/Migration/Migration20130324.cs +++ b/NzbDrone.Core/Datastore/Migration/Migration20130324.cs @@ -9,157 +9,137 @@ public class Migration20130324 : NzbDroneMigrationBase { protected override void MainDbUpgrade() { - Create.Table("Config") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Key").AsString().PrimaryKey() - .WithColumn("Value").AsString().NotNullable(); + Create.TableForModel("Config") + .WithColumn("Key").AsString().Unique() + .WithColumn("Value").AsString(); - Create.Table("EpisodeFiles") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("SeriesId").AsInt32().NotNullable() - .WithColumn("Path").AsString().NotNullable() - .WithColumn("Quality").AsInt32().NotNullable() - .WithColumn("Proper").AsBoolean().NotNullable() - .WithColumn("Size").AsInt64().NotNullable() - .WithColumn("DateAdded").AsDateTime().NotNullable() - .WithColumn("SeasonNumber").AsInt32().NotNullable() + Create.TableForModel("RootFolders") + .WithColumn("Path").AsString().Unique(); + + Create.TableForModel("Series") + .WithColumn("TvdbId").AsInt32().Unique() + .WithColumn("TvRageId").AsInt32().Unique() + .WithColumn("ImdbId").AsString().Unique() + .WithColumn("Title").AsString() + .WithColumn("TitleSlug").AsString().Unique() + .WithColumn("CleanTitle").AsString() + .WithColumn("Status").AsInt32() + .WithColumn("Overview").AsString().Nullable() + .WithColumn("AirTime").AsString().Nullable() + .WithColumn("Images").AsString() + .WithColumn("Path").AsString().Unique() + .WithColumn("Monitored").AsBoolean() + .WithColumn("QualityProfileId").AsInt32() + .WithColumn("SeasonFolder").AsBoolean() + .WithColumn("LastInfoSync").AsDateTime().Nullable() + .WithColumn("LastDiskSync").AsDateTime().Nullable() + .WithColumn("Runtime").AsInt32() + .WithColumn("SeriesType").AsInt32() + .WithColumn("BacklogSetting").AsInt32() + .WithColumn("Network").AsString().Nullable() + .WithColumn("CustomStartDate").AsDateTime().Nullable() + .WithColumn("UseSceneNumbering").AsBoolean() + .WithColumn("UtcOffSet").AsInt32() + .WithColumn("FirstAired").AsDateTime().Nullable() + .WithColumn("NextAiring").AsDateTime().Nullable(); + + Create.TableForModel("Seasons") + .WithColumn("SeriesId").AsInt32() + .WithColumn("SeasonNumber").AsInt32() + .WithColumn("Ignored").AsBoolean(); + + Create.TableForModel("Episodes") + .WithColumn("TvDbEpisodeId").AsInt32().Unique() + .WithColumn("SeriesId").AsInt32() + .WithColumn("SeasonNumber").AsInt32() + .WithColumn("EpisodeNumber").AsInt32() + .WithColumn("Title").AsString().Nullable() + .WithColumn("Overview").AsString().Nullable() + .WithColumn("Ignored").AsBoolean().Nullable() + .WithColumn("EpisodeFileId").AsInt32().Nullable() + .WithColumn("AirDate").AsDateTime().Nullable() + .WithColumn("GrabDate").AsDateTime().Nullable() + .WithColumn("PostDownloadStatus").AsInt32().Nullable() + .WithColumn("AbsoluteEpisodeNumber").AsInt32().Nullable() + .WithColumn("SceneAbsoluteEpisodeNumber").AsInt32().Nullable() + .WithColumn("SceneSeasonNumber").AsInt32().Nullable() + .WithColumn("SceneEpisodeNumber").AsInt32().Nullable(); + + Create.TableForModel("EpisodeFiles") + .WithColumn("SeriesId").AsInt32() + .WithColumn("Path").AsString().Unique() + .WithColumn("Quality").AsInt32() + .WithColumn("Proper").AsBoolean() + .WithColumn("Size").AsInt64() + .WithColumn("DateAdded").AsDateTime() + .WithColumn("SeasonNumber").AsInt32() .WithColumn("SceneName").AsString().Nullable() .WithColumn("ReleaseGroup").AsString().Nullable(); - Create.Table("Episodes") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("TvDbEpisodeId").AsInt32().Nullable() - .WithColumn("SeriesId").AsInt32().NotNullable() - .WithColumn("SeasonNumber").AsInt32().NotNullable() - .WithColumn("EpisodeNumber").AsInt32().NotNullable() - .WithColumn("Title").AsString().Nullable() - .WithColumn("Overview").AsString().Nullable() - .WithColumn("Ignored").AsBoolean().Nullable() - .WithColumn("EpisodeFileId").AsInt32().Nullable() - .WithColumn("AirDate").AsDateTime().Nullable() - .WithColumn("GrabDate").AsDateTime().Nullable() - .WithColumn("PostDownloadStatus").AsInt32().Nullable() - .WithColumn("AbsoluteEpisodeNumber").AsInt32().Nullable() - .WithColumn("SceneAbsoluteEpisodeNumber").AsInt32().Nullable() - .WithColumn("SceneSeasonNumber").AsInt32().Nullable() - .WithColumn("SceneEpisodeNumber").AsInt32().Nullable(); - - Create.Table("ExternalNotificationDefinitions") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Enable").AsBoolean().NotNullable() - .WithColumn("Type").AsString().NotNullable() - .WithColumn("Name").AsString().NotNullable(); - - Create.Table("History") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("EpisodeId").AsInt32().NotNullable() - .WithColumn("SeriesId").AsInt32().NotNullable() - .WithColumn("NzbTitle").AsString().NotNullable() - .WithColumn("Date").AsDateTime().NotNullable() - .WithColumn("Quality").AsString().NotNullable() - .WithColumn("Indexer").AsString().NotNullable() + Create.TableForModel("History") + .WithColumn("EpisodeId").AsInt32() + .WithColumn("SeriesId").AsInt32() + .WithColumn("NzbTitle").AsString() + .WithColumn("Date").AsDateTime() + .WithColumn("Quality").AsString() + .WithColumn("Indexer").AsString() .WithColumn("NzbInfoUrl").AsString().Nullable() .WithColumn("ReleaseGroup").AsString().Nullable(); - Create.Table("IndexerDefinitions") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Enable").AsBoolean().NotNullable() - .WithColumn("Type").AsString().NotNullable() - .WithColumn("Name").AsString().NotNullable(); + Create.TableForModel("ExternalNotificationDefinitions") + .WithColumn("Enable").AsBoolean() + .WithColumn("Type").AsString().Unique() + .WithColumn("Name").AsString().Unique(); - Create.Table("JobDefinitions") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Enable").AsBoolean().NotNullable() - .WithColumn("Type").AsString().NotNullable() - .WithColumn("Name").AsString().NotNullable() - .WithColumn("Interval").AsInt32().NotNullable() - .WithColumn("LastExecution").AsDateTime().NotNullable() - .WithColumn("Success").AsBoolean().NotNullable(); + Create.TableForModel("JobDefinitions") + .WithColumn("Enable").AsBoolean() + .WithColumn("Type").AsString().Unique() + .WithColumn("Name").AsString().Unique() + .WithColumn("Interval").AsInt32() + .WithColumn("LastExecution").AsDateTime() + .WithColumn("Success").AsBoolean(); - Create.Table("NewznabDefinitions") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Enable").AsBoolean().NotNullable() - .WithColumn("Name").AsString().NotNullable() - .WithColumn("Url").AsString().NotNullable() + Create.TableForModel("IndexerDefinitions") + .WithColumn("Enable").AsBoolean() + .WithColumn("Type").AsString().Unique() + .WithColumn("Name").AsString().Unique(); + + Create.TableForModel("NewznabDefinitions") + .WithColumn("Enable").AsBoolean() + .WithColumn("Name").AsString().Unique() + .WithColumn("Url").AsString() .WithColumn("ApiKey").AsString().Nullable() - .WithColumn("BuiltIn").AsBoolean().NotNullable(); + .WithColumn("BuiltIn").AsBoolean(); - Create.Table("QualityProfiles") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Name").AsString().NotNullable() - .WithColumn("Cutoff").AsInt32().NotNullable() - .WithColumn("Allowed").AsString().NotNullable(); + Create.TableForModel("QualityProfiles") + .WithColumn("Name").AsString().Unique() + .WithColumn("Cutoff").AsInt32() + .WithColumn("Allowed").AsString(); - Create.Table("QualitySizes") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("QualityId").AsInt32().NotNullable().Unique() - .WithColumn("Name").AsString().NotNullable() - .WithColumn("MinSize").AsInt32().NotNullable() - .WithColumn("MaxSize").AsInt32().NotNullable(); + Create.TableForModel("QualitySizes") + .WithColumn("QualityId").AsInt32().Unique() + .WithColumn("Name").AsString().Unique() + .WithColumn("MinSize").AsInt32() + .WithColumn("MaxSize").AsInt32(); - Create.Table("RootFolders") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Path").AsString().NotNullable(); + Create.TableForModel("SceneMappings") + .WithColumn("CleanTitle").AsString() + .WithColumn("SceneName").AsString() + .WithColumn("TvdbId").AsInt32() + .WithColumn("SeasonNumber").AsInt32(); - Create.Table("SceneMappings") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("CleanTitle").AsString().NotNullable() - .WithColumn("SceneName").AsString().NotNullable() - .WithColumn("TvdbId").AsInt32().NotNullable() - .WithColumn("SeasonNumber").AsInt32().NotNullable(); - - Create.Table("Seasons") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("SeriesId").AsInt32().NotNullable() - .WithColumn("SeasonNumber").AsInt32().NotNullable() - .WithColumn("Ignored").AsBoolean().NotNullable(); - - Create.Table("Series") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("TvdbId").AsInt32().NotNullable() - .WithColumn("Title").AsString().NotNullable() - .WithColumn("TitleSlug").AsString().NotNullable() - .WithColumn("CleanTitle").AsString().NotNullable() - .WithColumn("Status").AsInt32().NotNullable() - .WithColumn("Overview").AsString().Nullable() - .WithColumn("AirTime").AsString().Nullable() - .WithColumn("Images").AsString() - .WithColumn("Path").AsString().NotNullable() - .WithColumn("Monitored").AsBoolean().NotNullable() - .WithColumn("QualityProfileId").AsString().NotNullable() - .WithColumn("SeasonFolder").AsBoolean().NotNullable() - .WithColumn("LastInfoSync").AsDateTime().Nullable() - .WithColumn("LastDiskSync").AsDateTime().Nullable() - .WithColumn("Runtime").AsInt32().NotNullable() - .WithColumn("SeriesType").AsInt32().NotNullable() - .WithColumn("BacklogSetting").AsInt32().NotNullable() - .WithColumn("Network").AsString().Nullable() - .WithColumn("CustomStartDate").AsDateTime().Nullable() - .WithColumn("UseSceneNumbering").AsBoolean().NotNullable() - .WithColumn("TvRageId").AsInt32().Nullable() - .WithColumn("TvRageTitle").AsString().Nullable() - .WithColumn("UtcOffSet").AsInt32().NotNullable() - .WithColumn("FirstAired").AsDateTime().Nullable() - .WithColumn("NextAiring").AsDateTime().Nullable(); - - Create.Table("MediaCovers") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("SeriesId").AsInt32().NotNullable() - .WithColumn("Url").AsString().NotNullable() - .WithColumn("CoverType").AsInt32().NotNullable(); } protected override void LogDbUpgrade() { - Create.Table("Logs") - .WithColumn("Id").AsInt32().PrimaryKey().Identity() - .WithColumn("Message").AsString().NotNullable() - .WithColumn("Time").AsDateTime().NotNullable() - .WithColumn("Logger").AsString().NotNullable() + Create.TableForModel("Logs") + .WithColumn("Message").AsString() + .WithColumn("Time").AsDateTime() + .WithColumn("Logger").AsString() .WithColumn("Method").AsString().Nullable() .WithColumn("Exception").AsString().Nullable() .WithColumn("ExceptionType").AsString().Nullable() - .WithColumn("Level").AsString().NotNullable(); + .WithColumn("Level").AsString(); } } } diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 80984c8ec..162736cb7 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -200,6 +200,7 @@ +