diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index b82a5ab4f..43b983662 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -123,7 +123,7 @@ - + diff --git a/NzbDrone.Common/PathExtentions.cs b/NzbDrone.Common/PathExtensions.cs similarity index 95% rename from NzbDrone.Common/PathExtentions.cs rename to NzbDrone.Common/PathExtensions.cs index 3ab725f16..cacdf4f96 100644 --- a/NzbDrone.Common/PathExtentions.cs +++ b/NzbDrone.Common/PathExtensions.cs @@ -3,7 +3,7 @@ using System.IO; namespace NzbDrone.Common { - public static class PathExtentions + public static class PathExtensions { private const string WEB_FOLDER = "NzbDrone.Web\\"; private const string APP_DATA = "App_Data\\"; @@ -135,5 +135,10 @@ namespace NzbDrone.Common { return Path.Combine(environmentProvider.ApplicationPath, NZBDRONE_EXE); } + + public static string GetNzbDroneDatabase(this EnvironmentProvider environmentProvider) + { + return Path.Combine(environmentProvider.GetAppDataPath(), NZBDRONE_DB); + } } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/JobTests/JobControllerFixture.cs b/NzbDrone.Core.Test/JobTests/JobControllerFixture.cs index b076f786c..5ad9f3999 100644 --- a/NzbDrone.Core.Test/JobTests/JobControllerFixture.cs +++ b/NzbDrone.Core.Test/JobTests/JobControllerFixture.cs @@ -78,7 +78,7 @@ namespace NzbDrone.Core.Test.JobTests [Test] public void running_scheduled_jobs_should_updates_last_execution_time() { - GivenPendingJob(new List { new JobDefinition { TypeName = _fakeJob.GetType().FullName } }); + GivenPendingJob(new List { new JobDefinition { Type = _fakeJob.GetType().FullName } }); Subject.EnqueueScheduled(); WaitForQueue(); @@ -91,7 +91,7 @@ namespace NzbDrone.Core.Test.JobTests [Test] public void failing_scheduled_job_should_mark_job_as_failed() { - GivenPendingJob(new List { new JobDefinition { TypeName = _brokenJob.GetType().FullName } }); + GivenPendingJob(new List { new JobDefinition { Type = _brokenJob.GetType().FullName } }); Subject.EnqueueScheduled(); WaitForQueue(); @@ -193,7 +193,7 @@ namespace NzbDrone.Core.Test.JobTests [Test] public void Item_added_to_queue_while_scheduler_runs_should_be_executed() { - GivenPendingJob(new List { new JobDefinition { TypeName = _slowJob.GetType().FullName } }); + GivenPendingJob(new List { new JobDefinition { Type = _slowJob.GetType().FullName } }); var jobThread = new Thread(Subject.EnqueueScheduled); jobThread.Start(); @@ -219,7 +219,7 @@ namespace NzbDrone.Core.Test.JobTests [Test] public void scheduled_job_should_have_scheduler_as_source() { - GivenPendingJob(new List { new JobDefinition { TypeName = _slowJob.GetType().FullName }, new JobDefinition { TypeName = _slowJob2.GetType().FullName } }); + GivenPendingJob(new List { new JobDefinition { Type = _slowJob.GetType().FullName }, new JobDefinition { Type = _slowJob2.GetType().FullName } }); Subject.EnqueueScheduled(); Subject.Queue.Should().OnlyContain(c => c.Source == JobQueueItem.JobSourceType.Scheduler); diff --git a/NzbDrone.Core.Test/JobTests/JobRepositoryFixture.cs b/NzbDrone.Core.Test/JobTests/JobRepositoryFixture.cs index c17774ec1..c1f98f1c1 100644 --- a/NzbDrone.Core.Test/JobTests/JobRepositoryFixture.cs +++ b/NzbDrone.Core.Test/JobTests/JobRepositoryFixture.cs @@ -43,7 +43,7 @@ namespace NzbDrone.Core.Test.JobTests Storage.All().Should().HaveCount(1); StoredModel.Interval.Should().Be((Int32)_fakeJob.DefaultInterval.TotalMinutes); StoredModel.Name.Should().Be(_fakeJob.Name); - StoredModel.TypeName.Should().Be(_fakeJob.GetType().ToString()); + StoredModel.Type.Should().Be(_fakeJob.GetType().ToString()); StoredModel.LastExecution.Should().HaveYear(DateTime.Now.Year); StoredModel.LastExecution.Should().HaveMonth(DateTime.Now.Month); StoredModel.LastExecution.Should().HaveDay(DateTime.Today.Day); @@ -66,7 +66,7 @@ namespace NzbDrone.Core.Test.JobTests Subject.Init(); AllStoredModels.Should().HaveCount(1); - AllStoredModels.Should().NotContain(c => c.TypeName == deletedJob.TypeName); + AllStoredModels.Should().NotContain(c => c.Type == deletedJob.Type); } [Test] @@ -88,7 +88,7 @@ namespace NzbDrone.Core.Test.JobTests AllStoredModels.Should().HaveCount(1); - AllStoredModels.Should().NotContain(c => c.TypeName == deletedJob.TypeName); + AllStoredModels.Should().NotContain(c => c.Type == deletedJob.Type); } [Test] @@ -98,7 +98,7 @@ namespace NzbDrone.Core.Test.JobTests var oldJob = Builder.CreateNew() .With(c => c.Id = 0) .With(c => c.Name = "OldName") - .With(c => c.TypeName = typeof(FakeJob).ToString()) + .With(c => c.Type = typeof(FakeJob).ToString()) .With(c => c.Interval = 0) .With(c => c.Enable = true) .With(c => c.Success = true) @@ -116,7 +116,7 @@ namespace NzbDrone.Core.Test.JobTests AllStoredModels.Should().HaveCount(1); - StoredModel.TypeName.Should().Be(newJob.GetType().FullName); + StoredModel.Type.Should().Be(newJob.GetType().FullName); StoredModel.Name.Should().Be(newJob.Name); StoredModel.Interval.Should().Be((int)newJob.DefaultInterval.TotalMinutes); StoredModel.Enable.Should().Be(true); diff --git a/NzbDrone.Core/Configuration/Config.cs b/NzbDrone.Core/Configuration/Config.cs index bda68cb76..211d5055d 100644 --- a/NzbDrone.Core/Configuration/Config.cs +++ b/NzbDrone.Core/Configuration/Config.cs @@ -7,7 +7,6 @@ namespace NzbDrone.Core.Configuration { [Index(Unique = true)] public string Key { get; set; } - public string Value { get; set; } } } \ No newline at end of file diff --git a/NzbDrone.Core/ContainerExtensions.cs b/NzbDrone.Core/ContainerExtensions.cs index f9147ac34..fede47272 100644 --- a/NzbDrone.Core/ContainerExtensions.cs +++ b/NzbDrone.Core/ContainerExtensions.cs @@ -23,8 +23,7 @@ namespace NzbDrone.Core containerBuilder.RegisterAssembly("NzbDrone.Core"); containerBuilder.InitDatabase(); - - + containerBuilder.RegisterModule(); } @@ -53,22 +52,16 @@ namespace NzbDrone.Core { logger.Info("Registering Database..."); - var appDataPath = new EnvironmentProvider().GetAppDataPath(); + var environmentProvider = new EnvironmentProvider(); + var appDataPath = environmentProvider.GetAppDataPath(); if (!Directory.Exists(appDataPath)) Directory.CreateDirectory(appDataPath); container.Register(c => { - return c.Resolve().Create(); + return c.Resolve().Create(environmentProvider.GetNzbDroneDatabase()); }).As().SingleInstance(); - - container.Register(c => - { - return c.Resolve().Create(); - }).As().SingleInstance(); - container.RegisterGeneric(typeof(BasicRepository<>)).As(typeof(IBasicRepository<>)); - } } } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/DbFactory.cs b/NzbDrone.Core/Datastore/DbFactory.cs index 17d14578c..171aec337 100644 --- a/NzbDrone.Core/Datastore/DbFactory.cs +++ b/NzbDrone.Core/Datastore/DbFactory.cs @@ -28,6 +28,8 @@ namespace NzbDrone.Core.Datastore connectionString = GetConnectionString(dbPath); } + MigrationHelper.MigrateToLatest(connectionString, MigrationType.Main); + OrmLiteConfig.DialectProvider = new SqliteOrmLiteDialectProvider(); var dbFactory = new OrmLiteConnectionFactory(connectionString); var connection = dbFactory.Open(); diff --git a/NzbDrone.Core/Datastore/MigrationHelper.cs b/NzbDrone.Core/Datastore/MigrationHelper.cs new file mode 100644 index 000000000..f1209c891 --- /dev/null +++ b/NzbDrone.Core/Datastore/MigrationHelper.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using FluentMigrator; +using FluentMigrator.Runner; +using FluentMigrator.Runner.Initialization; + +namespace NzbDrone.Core.Datastore +{ + public static class MigrationHelper + { + public static void MigrateToLatest(string connectionString, MigrationType migrationType) + { + var announcer = new NlogAnnouncer(); + var assembly = Assembly.GetExecutingAssembly(); + + var migrationContext = new RunnerContext(announcer) + { + Namespace = "NzbDrone.Core.Datastore.Migrations", + ApplicationContext = migrationType + }; + + var options = new MigrationOptions { PreviewOnly = false, Timeout = 60 }; + var factory = new FluentMigrator.Runner.Processors.Sqlite.SqliteProcessorFactory(); + var processor = factory.Create(connectionString, announcer, options); + var runner = new MigrationRunner(assembly, migrationContext, processor); + runner.MigrateUp(true); + } + } + + public class MigrationOptions : IMigrationProcessorOptions + { + public bool PreviewOnly { get; set; } + public int Timeout { get; set; } + } +} diff --git a/NzbDrone.Core/Datastore/MigrationType.cs b/NzbDrone.Core/Datastore/MigrationType.cs new file mode 100644 index 000000000..b9bd958ce --- /dev/null +++ b/NzbDrone.Core/Datastore/MigrationType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NzbDrone.Core.Datastore +{ + public enum MigrationType + { + Main, + Log + } +} diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20130324.cs b/NzbDrone.Core/Datastore/Migrations/Migration20130324.cs new file mode 100644 index 000000000..1911125df --- /dev/null +++ b/NzbDrone.Core/Datastore/Migrations/Migration20130324.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FluentMigrator; + +namespace NzbDrone.Core.Datastore.Migrations +{ + [Tags("")] + [Migration(20130324)] + public class Migration20130324 : NzbDroneMigration + { + protected override void MainDbUpgrade() + { + Create.Table("Config") + .WithColumn("Id").AsInt32().PrimaryKey().Identity() + .WithColumn("Key").AsString().PrimaryKey() + .WithColumn("Value").AsString().NotNullable(); + + 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() + .WithColumn("SceneName").AsString().Nullable() + .WithColumn("ReleaseGroup").AsString().Nullable(); + + Create.Table("Episodes") + .WithColumn("Id").AsInt32().PrimaryKey().Identity() + .WithColumn("TvdbId").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").AsInt32().NotNullable() + .WithColumn("Proper").AsBoolean().NotNullable() + .WithColumn("Indexer").AsString().NotNullable() + .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.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.Table("MetadataDefinitions") + .WithColumn("Id").AsInt32().PrimaryKey().Identity() + .WithColumn("Enable").AsBoolean().NotNullable() + .WithColumn("Type").AsString().NotNullable() + .WithColumn("Name").AsString().NotNullable(); + + Create.Table("NewznabDefinitions") + .WithColumn("Id").AsInt32().PrimaryKey().Identity() + .WithColumn("Enable").AsBoolean().NotNullable() + .WithColumn("Name").AsString().NotNullable() + .WithColumn("Url").AsString().NotNullable() + .WithColumn("ApiKey").AsString().Nullable() + .WithColumn("BuiltIn").AsBoolean().NotNullable(); + + Create.Table("QualityProfiles") + .WithColumn("Id").AsInt32().PrimaryKey().Identity() + .WithColumn("Name").AsString().NotNullable() + .WithColumn("Cutoff").AsInt32().NotNullable() + .WithColumn("Allowed").AsString().NotNullable(); + + 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.Table("RootFolders") + .WithColumn("Id").AsInt32().PrimaryKey().Identity() + .WithColumn("Path").AsString().NotNullable(); + + Create.Table("SceneMappings") + .WithColumn("Id").AsInt32().PrimaryKey().Identity() + .WithColumn("CleanTitle").AsString().NotNullable() + .WithColumn("SceneName").AsString().NotNullable() + .WithColumn("SeriesId").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("CleanTitle").AsString().NotNullable() + .WithColumn("Status").AsInt32().NotNullable() + .WithColumn("Overview").AsString().NotNullable() + .WithColumn("AirTime").AsString().Nullable() + .WithColumn("Language").AsString().NotNullable() + .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("BannerUrl").AsString().NotNullable() + .WithColumn("SeriesType").AsInt32().NotNullable() + .WithColumn("BacklogSetting").AsInt32().NotNullable() + .WithColumn("Network").AsString().NotNullable() + .WithColumn("CustomStartDate").AsDateTime().Nullable() + .WithColumn("UseSceneNumbering").AsBoolean().NotNullable() + .WithColumn("TvRageId").AsInt32().Nullable() + .WithColumn("TvRageTitle").AsString().NotNullable() + .WithColumn("UtcOffSet").AsInt32().NotNullable() + .WithColumn("FirstAired").AsDateTime().Nullable(); + } + + protected override void LogDbUpgrade() + { + Create.Table("Logs") + .WithColumn("LogId").AsInt64().PrimaryKey().Identity() + .WithColumn("Message").AsString().NotNullable() + .WithColumn("Time").AsDateTime().NotNullable() + .WithColumn("Logger").AsString().NotNullable() + .WithColumn("Method").AsString().NotNullable() + .WithColumn("Exception").AsString().Nullable() + .WithColumn("ExceptionType").AsString().Nullable() + .WithColumn("Level").AsString().NotNullable(); + } + } +} diff --git a/NzbDrone.Core/Datastore/Migrations/NzbDroneMigration.cs b/NzbDrone.Core/Datastore/Migrations/NzbDroneMigration.cs new file mode 100644 index 000000000..a8ab45812 --- /dev/null +++ b/NzbDrone.Core/Datastore/Migrations/NzbDroneMigration.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FluentMigrator; +using NzbDrone.Common; + +namespace NzbDrone.Core.Datastore.Migrations +{ + public abstract class NzbDroneMigration : Migration + { + protected virtual void MainDbUpgrade() + { + } + + protected virtual void LogDbUpgrade() + { + } + + public override void Up() + { + if ((MigrationType)this.ApplicationContext == MigrationType.Main) + { + MainDbUpgrade(); + } + else if ((MigrationType)this.ApplicationContext == MigrationType.Log) + { + LogDbUpgrade(); + } + else + { + LogDbUpgrade(); + MainDbUpgrade(); + } + } + + + public override void Down() + { + throw new NotImplementedException(); + } + } +} diff --git a/NzbDrone.Core/Datastore/NlogAnnouncer.cs b/NzbDrone.Core/Datastore/NlogAnnouncer.cs new file mode 100644 index 000000000..3599266e3 --- /dev/null +++ b/NzbDrone.Core/Datastore/NlogAnnouncer.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FluentMigrator.Runner.Announcers; +using NLog; + +namespace NzbDrone.Core.Datastore +{ + public class NlogAnnouncer : Announcer + { + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + + public override void Write(string message, bool escaped) + { + logger.Info(message); + } + } +} diff --git a/NzbDrone.Core/Indexers/Indexer.cs b/NzbDrone.Core/Indexers/Indexer.cs index 45f60d89b..fe97b7ef9 100644 --- a/NzbDrone.Core/Indexers/Indexer.cs +++ b/NzbDrone.Core/Indexers/Indexer.cs @@ -1,9 +1,11 @@ using System; using NzbDrone.Core.Datastore; +using ServiceStack.DataAnnotations; namespace NzbDrone.Core.Indexers { + [Alias("IndexerDefinitions")] public class Indexer : ModelBase { public Boolean Enable { get; set; } diff --git a/NzbDrone.Core/Indexers/NewznabDefinition.cs b/NzbDrone.Core/Indexers/NewznabDefinition.cs index fecbd5f0b..2b52e2f78 100644 --- a/NzbDrone.Core/Indexers/NewznabDefinition.cs +++ b/NzbDrone.Core/Indexers/NewznabDefinition.cs @@ -1,12 +1,14 @@ using System; using NzbDrone.Core.Datastore; +using ServiceStack.DataAnnotations; namespace NzbDrone.Core.Indexers { + [Alias("NewznabDefinitions")] public class NewznabDefinition : ModelBase { - public Boolean Enabled { get; set; } + public Boolean Enable { get; set; } public String Name { get; set; } public String Url { get; set; } public String ApiKey { get; set; } diff --git a/NzbDrone.Core/Indexers/NewznabRepository.cs b/NzbDrone.Core/Indexers/NewznabRepository.cs index 9c4d67e2d..4f20cfc01 100644 --- a/NzbDrone.Core/Indexers/NewznabRepository.cs +++ b/NzbDrone.Core/Indexers/NewznabRepository.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Core.Indexers public IEnumerable Enabled() { - return Where(n => n.Enabled); + return Where(n => n.Enable); } } } diff --git a/NzbDrone.Core/Indexers/NewznabService.cs b/NzbDrone.Core/Indexers/NewznabService.cs index 39d406ed0..d491f67e0 100644 --- a/NzbDrone.Core/Indexers/NewznabService.cs +++ b/NzbDrone.Core/Indexers/NewznabService.cs @@ -79,9 +79,9 @@ namespace NzbDrone.Core.Indexers { var newznabIndexers = new List { - new NewznabDefinition { Enabled = false, Name = "Nzbs.org", Url = "http://nzbs.org", BuiltIn = true }, - new NewznabDefinition { Enabled = false, Name = "Nzb.su", Url = "https://nzb.su", BuiltIn = true }, - new NewznabDefinition { Enabled = false, Name = "Dognzb.cr", Url = "https://dognzb.cr", BuiltIn = true } + new NewznabDefinition { Enable = false, Name = "Nzbs.org", Url = "http://nzbs.org", BuiltIn = true }, + new NewznabDefinition { Enable = false, Name = "Nzb.su", Url = "https://nzb.su", BuiltIn = true }, + new NewznabDefinition { Enable = false, Name = "Dognzb.cr", Url = "https://dognzb.cr", BuiltIn = true } }; _logger.Debug("Initializing Newznab indexers. Count {0}", newznabIndexers); @@ -108,7 +108,7 @@ namespace NzbDrone.Core.Indexers { var definition = new NewznabDefinition { - Enabled = false, + Enable = false, Name = indexerLocal.Name, Url = indexerLocal.Url, ApiKey = indexerLocal.ApiKey, diff --git a/NzbDrone.Core/Jobs/JobController.cs b/NzbDrone.Core/Jobs/JobController.cs index 7b26c19b4..6f0398ae2 100644 --- a/NzbDrone.Core/Jobs/JobController.cs +++ b/NzbDrone.Core/Jobs/JobController.cs @@ -42,10 +42,8 @@ namespace NzbDrone.Core.Jobs Task.Factory.StartNew(ProcessQueue, _cancellationTokenSource.Token); } - public bool IsProcessing { get; private set; } - public IEnumerable Queue { get @@ -63,7 +61,7 @@ namespace NzbDrone.Core.Jobs } var pendingJobs = _jobRepository.GetPendingJobs() - .Select(c => _jobs.Single(t => t.GetType().ToString() == c.TypeName) + .Select(c => _jobs.Single(t => t.GetType().ToString() == c.Type) .GetType()).ToList(); @@ -99,7 +97,6 @@ namespace NzbDrone.Core.Jobs } - public bool Enqueue(string jobTypeString) { var type = Type.GetType(jobTypeString); diff --git a/NzbDrone.Core/Jobs/JobDefinition.cs b/NzbDrone.Core/Jobs/JobDefinition.cs index 8f19e11a5..b17cc0f00 100644 --- a/NzbDrone.Core/Jobs/JobDefinition.cs +++ b/NzbDrone.Core/Jobs/JobDefinition.cs @@ -1,21 +1,18 @@ using System; using System.Linq; using NzbDrone.Core.Datastore; +using ServiceStack.DataAnnotations; namespace NzbDrone.Core.Jobs { + [Alias("JobDefinitions")] public class JobDefinition : ModelBase { public Boolean Enable { get; set; } - - public String TypeName { get; set; } - + public String Type { get; set; } public String Name { get; set; } - public Int32 Interval { get; set; } - public DateTime LastExecution { get; set; } - public Boolean Success { get; set; } } } \ No newline at end of file diff --git a/NzbDrone.Core/Jobs/JobRepository.cs b/NzbDrone.Core/Jobs/JobRepository.cs index 52fc0be6e..3094d74df 100644 --- a/NzbDrone.Core/Jobs/JobRepository.cs +++ b/NzbDrone.Core/Jobs/JobRepository.cs @@ -28,7 +28,7 @@ namespace NzbDrone.Core.Jobs public JobDefinition GetDefinition(Type type) { - return Single(c => c.TypeName == type.FullName); + return Single(c => c.Type == type.FullName); } @@ -39,12 +39,12 @@ namespace NzbDrone.Core.Jobs public void Init() { - var currentJobs = All(); + var currentJobs = All().ToList(); _logger.Debug("Initializing jobs. Available: {0} Existing:{1}", _jobs.Count(), currentJobs.Count()); foreach (var currentJob in currentJobs) { - if (_jobs.All(c => c.GetType().ToString() != currentJob.TypeName)) + if (_jobs.All(c => c.GetType().ToString() != currentJob.Type)) { _logger.Debug("Removing job from database '{0}'", currentJob.Name); Delete(currentJob.Id); @@ -53,13 +53,13 @@ namespace NzbDrone.Core.Jobs foreach (var job in _jobs) { - var jobDefinition = currentJobs.SingleOrDefault(c => c.TypeName == job.GetType().ToString()); + var jobDefinition = currentJobs.SingleOrDefault(c => c.Type == job.GetType().ToString()); if (jobDefinition == null) { jobDefinition = new JobDefinition { - TypeName = job.GetType().ToString(), + Type = job.GetType().ToString(), LastExecution = DateTime.Now }; } diff --git a/NzbDrone.Core/MetadataSource/TvDbProxy.cs b/NzbDrone.Core/MetadataSource/TvDbProxy.cs index 0a22dc79c..cb1af57e0 100644 --- a/NzbDrone.Core/MetadataSource/TvDbProxy.cs +++ b/NzbDrone.Core/MetadataSource/TvDbProxy.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.MetadataSource series.Title = tvDbSeries.SeriesName; series.AirTime = CleanAirsTime(tvDbSeries.Airs_Time); series.Overview = tvDbSeries.Overview; - series.Status = tvDbSeries.Status; + series.Status = tvDbSeries.Status == "Continuing" ? SeriesStatusType.Continuing : SeriesStatusType.Ended ; series.Language = tvDbSeries.Language ?? string.Empty; series.CleanTitle = Parser.NormalizeTitle(tvDbSeries.SeriesName); series.LastInfoSync = DateTime.Now; diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index e3c36e5ec..fce2e8096 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -127,6 +127,12 @@ False ..\packages\Autofac.3.0.1\lib\net40\Autofac.dll + + ..\packages\FluentMigrator.1.0.6.0\lib\40\FluentMigrator.dll + + + ..\packages\FluentMigrator.1.0.6.0\tools\FluentMigrator.Runner.dll + ..\packages\Growl.0.6\lib\Growl.Connector.dll @@ -181,6 +187,14 @@ + + False + ..\packages\System.Data.SQLite.x64.1.0.84.0\lib\net40\System.Data.SQLite.dll + + + False + ..\packages\System.Data.SQLite.x64.1.0.84.0\lib\net40\System.Data.SQLite.Linq.dll + @@ -201,9 +215,14 @@ + + + + + @@ -530,6 +549,7 @@ + diff --git a/NzbDrone.Core/Qualities/QualityProfile.cs b/NzbDrone.Core/Qualities/QualityProfile.cs index 5ec6f799f..b33a6c8fa 100644 --- a/NzbDrone.Core/Qualities/QualityProfile.cs +++ b/NzbDrone.Core/Qualities/QualityProfile.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Datastore; +using ServiceStack.DataAnnotations; namespace NzbDrone.Core.Qualities { + [Alias("QualityProfiles")] public class QualityProfile : ModelBase { public string Name { get; set; } diff --git a/NzbDrone.Core/Qualities/QualitySize.cs b/NzbDrone.Core/Qualities/QualitySize.cs index 3e9e31032..b8521f2f1 100644 --- a/NzbDrone.Core/Qualities/QualitySize.cs +++ b/NzbDrone.Core/Qualities/QualitySize.cs @@ -1,9 +1,11 @@ using System.Linq; using NzbDrone.Core.Datastore; +using ServiceStack.DataAnnotations; namespace NzbDrone.Core.Qualities { + [Alias("QualitySizes")] public class QualitySize : ModelBase { public int QualityId { get; set; } diff --git a/NzbDrone.Core/ReferenceData/SceneMapping.cs b/NzbDrone.Core/ReferenceData/SceneMapping.cs index e92d9b260..de3ab5c92 100644 --- a/NzbDrone.Core/ReferenceData/SceneMapping.cs +++ b/NzbDrone.Core/ReferenceData/SceneMapping.cs @@ -1,8 +1,10 @@ using System.Linq; using NzbDrone.Core.Datastore; +using ServiceStack.DataAnnotations; namespace NzbDrone.Core.ReferenceData { + [Alias("SceneMappings")] public class SceneMapping : ModelBase { public string CleanTitle { get; set; } diff --git a/NzbDrone.Core/Tv/Series.cs b/NzbDrone.Core/Tv/Series.cs index a29df6b5c..4f900e05d 100644 --- a/NzbDrone.Core/Tv/Series.cs +++ b/NzbDrone.Core/Tv/Series.cs @@ -4,7 +4,7 @@ using System; using NzbDrone.Core.Datastore; using NzbDrone.Core.Model; using NzbDrone.Core.Qualities; - +using ServiceStack.DataAnnotations; namespace NzbDrone.Core.Tv @@ -21,11 +21,8 @@ namespace NzbDrone.Core.Tv public int TvDbId { get; set; } public string Title { get; set; } public string CleanTitle { get; set; } - public string Status { get; set; } - - + public SeriesStatusType Status { get; set; } public string Overview { get; set; } - public String AirTime { get; set; } public string Language { get; set; } public string Path { get; set; } diff --git a/NzbDrone.Core/Tv/SeriesStatusType.cs b/NzbDrone.Core/Tv/SeriesStatusType.cs new file mode 100644 index 000000000..1b9381d21 --- /dev/null +++ b/NzbDrone.Core/Tv/SeriesStatusType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NzbDrone.Core.Tv +{ + public enum SeriesStatusType + { + Continuing = 0, + Ended = 1 + } +} diff --git a/NzbDrone.Core/packages.config b/NzbDrone.Core/packages.config index 14799a275..4a760c222 100644 --- a/NzbDrone.Core/packages.config +++ b/NzbDrone.Core/packages.config @@ -2,6 +2,7 @@ + @@ -14,5 +15,6 @@ + \ No newline at end of file diff --git a/NzbDrone/NzbDrone.csproj b/NzbDrone/NzbDrone.csproj index 36c51b16c..807829a60 100644 --- a/NzbDrone/NzbDrone.csproj +++ b/NzbDrone/NzbDrone.csproj @@ -89,6 +89,14 @@ + + False + ..\packages\System.Data.SQLite.x86.1.0.84.0\lib\net40\System.Data.SQLite.dll + + + False + ..\packages\System.Data.SQLite.x86.1.0.84.0\lib\net40\System.Data.SQLite.Linq.dll + diff --git a/NzbDrone/packages.config b/NzbDrone/packages.config index bcfe36c81..baccdcc0c 100644 --- a/NzbDrone/packages.config +++ b/NzbDrone/packages.config @@ -9,4 +9,5 @@ + \ No newline at end of file