From 6dd56114e3e606212bb6a61d3802a2c6c075a300 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 24 Mar 2013 20:51:32 -0700 Subject: [PATCH] added Marr.Data.Mapping --- Libraries/Sqlite/Mono.Data.Sqlite.dll | Bin 0 -> 169472 bytes .../Datastore/BasicRepositoryFixture.cs | 31 +++--- .../Datastore/ObjectDatabaseFixture.cs | 27 +++--- NzbDrone.Core.Test/Framework/DbTest.cs | 77 ++++++++++----- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 26 +---- NzbDrone.Core.Test/packages.config | 3 - NzbDrone.Core/Configuration/Config.cs | 2 - .../Configuration/ConfigRepository.cs | 4 +- NzbDrone.Core/Datastore/BasicRepository.cs | 89 +++++++----------- NzbDrone.Core/Datastore/Database.cs | 21 +++++ NzbDrone.Core/Datastore/DbFactory.cs | 26 ++--- NzbDrone.Core/Datastore/Migration.cs | 14 +-- NzbDrone.Core/Datastore/ModelBase.cs | 6 +- .../ExternalNotificationRepository.cs | 5 +- NzbDrone.Core/History/HistoryRepository.cs | 6 +- NzbDrone.Core/Indexers/IndexerRepository.cs | 5 +- NzbDrone.Core/Indexers/NewznabRepository.cs | 4 +- .../Instrumentation/LogRepository.cs | 4 +- NzbDrone.Core/Jobs/JobRepository.cs | 9 +- .../MediaFiles/MediaFileRepository.cs | 8 +- NzbDrone.Core/NzbDrone.Core.csproj | 28 ++---- .../Qualities/QualityProfileRepository.cs | 2 +- .../Qualities/QualitySizeRepository.cs | 4 +- .../ReferenceData/SceneMappingRepository.cs | 6 +- NzbDrone.Core/Tv/EpisodeRepository.cs | Bin 6944 -> 7033 bytes NzbDrone.Core/Tv/SeasonRepository.cs | 14 +-- NzbDrone.Core/Tv/SeriesRepository.cs | 11 ++- NzbDrone.Core/packages.config | 4 +- NzbDrone.ncrunchsolution | 1 + 29 files changed, 208 insertions(+), 229 deletions(-) create mode 100644 Libraries/Sqlite/Mono.Data.Sqlite.dll create mode 100644 NzbDrone.Core/Datastore/Database.cs diff --git a/Libraries/Sqlite/Mono.Data.Sqlite.dll b/Libraries/Sqlite/Mono.Data.Sqlite.dll new file mode 100644 index 0000000000000000000000000000000000000000..dad79f065d7b0f0cfc2e4cccffc0076d56679e42 GIT binary patch literal 169472 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�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 HXV?E9g!ML5 literal 0 HcmV?d00001 diff --git a/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs b/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs index a4e89b8fa..a15c00c6b 100644 --- a/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs +++ b/NzbDrone.Core.Test/Datastore/BasicRepositoryFixture.cs @@ -3,14 +3,14 @@ using System.Linq; using FizzWare.NBuilder; using FluentAssertions; +using Marr.Data.Mapping; using NUnit.Framework; using NzbDrone.Core.Datastore; using NzbDrone.Core.Test.Framework; -using ServiceStack.OrmLite; namespace NzbDrone.Core.Test.Datastore { - public class BaiscType : ModelBase + public class BasicType : ModelBase { public string Name { get; set; } public string Tilte { get; set; } @@ -18,26 +18,33 @@ public class BaiscType : ModelBase } [TestFixture] - public class BasicRepositoryFixture : DbTest,BaiscType> + public class + BasicRepositoryFixture : DbTest, BasicType> { - private BaiscType _baiscType; + private BasicType _basicType; [SetUp] public void Setup() { - _baiscType = Builder + _basicType = Builder .CreateNew() .With(c => c.Id = 0) .Build(); - Mocker.Resolve().CreateTable(); + var mapping = new FluentMappings(true); + + mapping.Entity() + .Columns.AutoMapSimpleTypeProperties() + .For(c => c.Id).SetAutoIncrement() + .SetPrimaryKey(); + } [Test] public void should_be_able_to_add() { - Subject.Insert(_baiscType); + Subject.Insert(_basicType); Subject.All().Should().HaveCount(1); } @@ -46,21 +53,21 @@ public void should_be_able_to_add() [Test] public void should_be_able_to_delete_model() { - Subject.Insert(_baiscType); + Subject.Insert(_basicType); Subject.All().Should().HaveCount(1); - Subject.Delete(_baiscType.Id); + Subject.Delete(_basicType.Id); Subject.All().Should().BeEmpty(); } [Test] public void should_be_able_to_find_by_id() { - Subject.Insert(_baiscType); - Subject.Get(_baiscType.Id) + Subject.Insert(_basicType); + Subject.Get(_basicType.Id) .ShouldHave() .AllProperties() - .EqualTo(_baiscType); + .EqualTo(_basicType); } [Test] diff --git a/NzbDrone.Core.Test/Datastore/ObjectDatabaseFixture.cs b/NzbDrone.Core.Test/Datastore/ObjectDatabaseFixture.cs index 42ca25dac..a42a03470 100644 --- a/NzbDrone.Core.Test/Datastore/ObjectDatabaseFixture.cs +++ b/NzbDrone.Core.Test/Datastore/ObjectDatabaseFixture.cs @@ -7,32 +7,29 @@ using NUnit.Framework; using NzbDrone.Core.Datastore; using NzbDrone.Core.Test.Framework; -using ServiceStack.OrmLite; namespace NzbDrone.Core.Test.Datastore { [TestFixture] - public class ObjectDatabaseFixture : DbTest, BaiscType> + public class ObjectDatabaseFixture : DbTest, BasicType> { - private BaiscType _sampleType; + private BasicType _sampleType; [SetUp] public void SetUp() { - _sampleType = Builder + _sampleType = Builder .CreateNew() .With(s => s.Id = 0) .Build(); - Mocker.Resolve().CreateTable(); - } [Test] public void should_be_able_to_write_to_database() { Subject.Insert(_sampleType); - Db.All().Should().HaveCount(1); + Db.All().Should().HaveCount(1); } [Test] @@ -52,7 +49,7 @@ public void update_item_with_root_index_0_should_faile() [Test] public void should_be_able_to_store_empty_list() { - var series = new List(); + var series = new List(); Subject.InsertMany(series); } @@ -71,7 +68,7 @@ public void new_object_should_get_new_id() _sampleType.Id = 0; Subject.Insert(_sampleType); - Db.All().Should().HaveCount(1); + Db.All().Should().HaveCount(1); _sampleType.Id.Should().Be(1); } @@ -83,7 +80,7 @@ public void should_have_id_when_returned_from_database() { _sampleType.Id = 0; Subject.Insert(_sampleType); - var item = Db.All(); + var item = Db.All(); item.Should().HaveCount(1); item.First().Id.Should().NotBe(0); @@ -95,7 +92,7 @@ public void should_have_id_when_returned_from_database() public void should_be_able_to_find_object_by_id() { Subject.Insert(_sampleType); - var item = Db.All().Single(c => c.Id == _sampleType.Id); + var item = Db.All().Single(c => c.Id == _sampleType.Id); item.Id.Should().NotBe(0); item.Id.Should().Be(_sampleType.Id); @@ -105,7 +102,7 @@ public void should_be_able_to_find_object_by_id() [Test] public void update_field_should_only_update_that_filed() { - var childModel = new BaiscType + var childModel = new BasicType { Address = "Address", Name = "Name", @@ -121,9 +118,9 @@ public void update_field_should_only_update_that_filed() Subject.UpdateFields(childModel, t => t.Name); - Db.All().Single().Address.Should().Be("Address"); - Db.All().Single().Name.Should().Be("B"); - Db.All().Single().Tilte.Should().Be("Title"); + Db.All().Single().Address.Should().Be("Address"); + Db.All().Single().Name.Should().Be("B"); + Db.All().Single().Tilte.Should().Be("Title"); } diff --git a/NzbDrone.Core.Test/Framework/DbTest.cs b/NzbDrone.Core.Test/Framework/DbTest.cs index 8dad18197..0bc4e78c9 100644 --- a/NzbDrone.Core.Test/Framework/DbTest.cs +++ b/NzbDrone.Core.Test/Framework/DbTest.cs @@ -1,11 +1,12 @@ using System; using System.Collections.Generic; using System.Data; +using System.IO; using System.Linq; +using Marr.Data; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Datastore; -using ServiceStack.OrmLite; namespace NzbDrone.Core.Test.Framework { @@ -61,8 +62,12 @@ protected TSubject Subject public abstract class DbTest : CoreTest { - private IDatabase _db; - protected IDatabase Db + private string _dbName; + + private ITestDatabase _db; + private IDatabase _database; + + protected ITestDatabase Db { get { @@ -75,10 +80,15 @@ protected IDatabase Db private void WithObjectDb(bool memory = true) { + + _dbName = DateTime.Now.Ticks.ToString() + ".db"; + + MapRepository.Instance.EnableTraceLogging = true; + var factory = new DbFactory(); - var dbConnection = factory.Create(); - _db = new TestDatabase(dbConnection); - Mocker.SetConstant(dbConnection); + _database = factory.Create(_dbName); + _db = new TestTestDatabase(_database); + Mocker.SetConstant(_database); } [SetUp] @@ -87,51 +97,68 @@ public void SetupReadDb() WithObjectDb(); } + [TearDown] + public void TearDown() + { + var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.db"); + + foreach (var file in files) + { + try + { + File.Delete(file); + } + catch (Exception) + { + + } + } + } } - public interface IDatabase + public interface ITestDatabase { - void InsertMany(IEnumerable items) where T : new(); - void Insert(T item) where T : new(); - IEnumerable All() where T : new(); - void Update(T childModel) where T : new(); - void Delete(T childModel) where T : new(); + void InsertMany(IEnumerable items) where T : ModelBase, new(); + void Insert(T item) where T : ModelBase, new(); + IEnumerable All() where T : ModelBase, new(); + void Update(T childModel) where T : ModelBase, new(); + void Delete(T childModel) where T : ModelBase, new(); } - public class TestDatabase : IDatabase + public class TestTestDatabase : ITestDatabase { - private readonly IDbConnection _dbConnection; + private readonly IDatabase _dbConnection; - public TestDatabase(IDbConnection dbConnection) + public TestTestDatabase(IDatabase dbConnection) { _dbConnection = dbConnection; } - public void InsertMany(IEnumerable items) where T : new() + public void InsertMany(IEnumerable items) where T : ModelBase, new() { - _dbConnection.InsertAll(items); + new BasicRepository(_dbConnection).InsertMany(items.ToList()); } - public void Insert(T item) where T : new() + public void Insert(T item) where T : ModelBase, new() { - _dbConnection.Insert(item); + new BasicRepository(_dbConnection).Insert(item); } - public IEnumerable All() where T : new() + public IEnumerable All() where T : ModelBase, new() { - return _dbConnection.Select(); + return new BasicRepository(_dbConnection).All(); } - public void Update(T childModel) where T : new() + public void Update(T childModel) where T : ModelBase, new() { - _dbConnection.Update(childModel); + new BasicRepository(_dbConnection).Update(childModel); } - public void Delete(T childModel) where T : new() + public void Delete(T childModel) where T : ModelBase, new() { - _dbConnection.Delete(childModel); + new BasicRepository(_dbConnection).Delete(childModel); } } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index b63cca0d2..ace617aae 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -77,6 +77,9 @@ False ..\packages\FluentAssertions.2.0.0.1\lib\net40\FluentAssertions.dll + + ..\packages\MarrDataMapper.3.17.4747.34302\lib\Marr.Data.dll + False @@ -89,9 +92,6 @@ ..\packages\Unity.2.1.505.2\lib\NET35\Microsoft.Practices.Unity.Configuration.dll - - ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.42\lib\net35\Mono.Data.Sqlite.dll - ..\packages\Moq.4.0.10827\lib\NET40\Moq.dll @@ -114,26 +114,6 @@ False ..\packages\Prowlin.0.9.4456.26422\lib\net40\Prowlin.dll - - False - ..\packages\ServiceStack.Common.3.9.42\lib\net35\ServiceStack.Common.dll - - - ..\packages\ServiceStack.Common.3.9.42\lib\net35\ServiceStack.Interfaces.dll - True - - - ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.42\lib\net35\ServiceStack.OrmLite.dll - True - - - ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.42\lib\net35\ServiceStack.OrmLite.Sqlite.dll - True - - - False - ..\packages\ServiceStack.Text.3.9.42\lib\net35\ServiceStack.Text.dll - False ..\packages\SignalR.Server.0.5.3\lib\net40\SignalR.dll diff --git a/NzbDrone.Core.Test/packages.config b/NzbDrone.Core.Test/packages.config index 75d53ccde..03b747121 100644 --- a/NzbDrone.Core.Test/packages.config +++ b/NzbDrone.Core.Test/packages.config @@ -11,9 +11,6 @@ - - - \ No newline at end of file diff --git a/NzbDrone.Core/Configuration/Config.cs b/NzbDrone.Core/Configuration/Config.cs index 211d5055d..53ff3f921 100644 --- a/NzbDrone.Core/Configuration/Config.cs +++ b/NzbDrone.Core/Configuration/Config.cs @@ -1,11 +1,9 @@ using NzbDrone.Core.Datastore; -using ServiceStack.DataAnnotations; namespace NzbDrone.Core.Configuration { public class Config : ModelBase { - [Index(Unique = true)] public string Key { get; set; } public string Value { get; set; } } diff --git a/NzbDrone.Core/Configuration/ConfigRepository.cs b/NzbDrone.Core/Configuration/ConfigRepository.cs index 3c282dee6..c3acb5785 100644 --- a/NzbDrone.Core/Configuration/ConfigRepository.cs +++ b/NzbDrone.Core/Configuration/ConfigRepository.cs @@ -12,7 +12,7 @@ public interface IConfigRepository : IBasicRepository public class ConfigRepository : BasicRepository, IConfigRepository { - public ConfigRepository(IDbConnection database) + public ConfigRepository(IDatabase database) : base(database) { } @@ -20,7 +20,7 @@ public ConfigRepository(IDbConnection database) public Config Get(string key) { - return SingleOrDefault(c => c.Key == key); + return Queryable().SingleOrDefault(c => c.Key == key); } diff --git a/NzbDrone.Core/Datastore/BasicRepository.cs b/NzbDrone.Core/Datastore/BasicRepository.cs index 5b175978f..a6112c81c 100644 --- a/NzbDrone.Core/Datastore/BasicRepository.cs +++ b/NzbDrone.Core/Datastore/BasicRepository.cs @@ -3,7 +3,9 @@ using System.Data; using System.Linq; using System.Linq.Expressions; -using ServiceStack.OrmLite; +using Marr.Data; +using Marr.Data.QGen; + namespace NzbDrone.Core.Datastore { @@ -11,12 +13,8 @@ namespace NzbDrone.Core.Datastore { IEnumerable All(); int Count(); - bool Any(Expression> predicate); TModel Get(int id); - TModel Single(Expression> predicate); TModel SingleOrDefault(); - TModel SingleOrDefault(Expression> predicate); - List Where(Expression> predicate); TModel Insert(TModel model); TModel Update(TModel model); TModel Upsert(TModel model); @@ -29,38 +27,39 @@ namespace NzbDrone.Core.Datastore bool HasItems(); void DeleteMany(IEnumerable ids); void UpdateFields(TModel model, Expression> onlyFields); - List Where(SqlExpressionVisitor expression); } public class BasicRepository : IBasicRepository where TModel : ModelBase, new() { - private readonly IDbConnection _database; + private readonly IDataMapper _dataMapper; - public BasicRepository(IDbConnection database) + public BasicRepository(IDatabase database) { - _database = database; + _dataMapper = database.DataMapper; + } + + protected QueryBuilder Queryable() + { + return _dataMapper.Query(); } public IEnumerable All() { - return _database.Select(); + return _dataMapper.Query().ToList(); } public int Count() { - return (int)_database.Count(); - } - - public bool Any(Expression> predicate) - { - return _database.Exists(predicate); + return _dataMapper.Query().Count(); } public TModel Get(int id) { try { - return _database.GetById(id); + var c = _dataMapper.Query().FromTable(typeof(TModel).Name); + + return null; } catch (ArgumentNullException e) { @@ -69,36 +68,12 @@ public TModel Get(int id) } - public TModel Single(Expression> predicate) - { - return _database.Select(predicate).Single(); - } public TModel SingleOrDefault() { return All().Single(); } - public TModel Single() - { - throw new System.NotImplementedException(); - } - - public TModel SingleOrDefault(Expression> predicate) - { - return _database.Select(predicate).SingleOrDefault(); - } - - public List Where(Expression> predicate) - { - return _database.Select(predicate); - } - - public List Where(SqlExpressionVisitor expression) - { - return _database.Select(expression); - } - public TModel Insert(TModel model) { if (model.Id != 0) @@ -106,8 +81,7 @@ public TModel Insert(TModel model) throw new InvalidOperationException("Can't insert model with existing ID"); } - _database.Insert(model); - model.Id = (int)_database.GetLastInsertId(); + var id = _dataMapper.Insert(model); return model; } @@ -118,56 +92,61 @@ public TModel Update(TModel model) throw new InvalidOperationException("Can't update model with ID 0"); } - _database.Update(model); + _dataMapper.Update(model, c => c.Id == model.Id); return model; } public void Delete(TModel model) { - _database.Delete(model); + _dataMapper.Delete(c => c.Id == model.Id); } public void InsertMany(IList models) { - _database.InsertAll(models); + foreach (var model in models) + { + Insert(model); + } } public void UpdateMany(IList models) { - _database.UpdateAll(models); + foreach (var model in models) + { + Update(model); + } } public void DeleteMany(List models) { - _database.DeleteAll(models); + models.ForEach(Delete); } public TModel Upsert(TModel model) { if (model.Id == 0) { - _database.Insert(model); - model.Id = (int)_database.GetLastInsertId(); + Insert(model); return model; } - _database.Update(model); + Update(model); return model; } public void Delete(int id) { - _database.DeleteById(id); + _dataMapper.Delete(c => c.Id == id); } public void DeleteMany(IEnumerable ids) { - _database.DeleteByIds(ids); + ids.ToList().ForEach(Delete); } public void Purge() { - _database.DeleteAll(); + _dataMapper.Delete(c => c.Id > -1); } public bool HasItems() @@ -182,7 +161,7 @@ public void UpdateFields(TModel model, Expression> only throw new InvalidOperationException("Attempted to updated model without ID"); } - _database.UpdateOnly(model, onlyFields, m => m.Id == model.Id); + // _database.UpdateOnly(model, onlyFields, m => m.Id == model.Id); } } } diff --git a/NzbDrone.Core/Datastore/Database.cs b/NzbDrone.Core/Datastore/Database.cs new file mode 100644 index 000000000..2786600f1 --- /dev/null +++ b/NzbDrone.Core/Datastore/Database.cs @@ -0,0 +1,21 @@ +using System; +using Marr.Data; + +namespace NzbDrone.Core.Datastore +{ + public interface IDatabase + { + IDataMapper DataMapper { get; } + } + + public class Database : IDatabase + { + + public Database(IDataMapper dataMapper) + { + DataMapper = dataMapper; + } + + public IDataMapper DataMapper { get; private set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/DbFactory.cs b/NzbDrone.Core/Datastore/DbFactory.cs index 171aec337..357f3f2f1 100644 --- a/NzbDrone.Core/Datastore/DbFactory.cs +++ b/NzbDrone.Core/Datastore/DbFactory.cs @@ -1,25 +1,21 @@ using System; using System.Data; -using ServiceStack.OrmLite; -using ServiceStack.OrmLite.Sqlite; +using Marr.Data; +using Mono.Data.Sqlite; + namespace NzbDrone.Core.Datastore { public interface IDbFactory { - IDbConnection Create(string dbPath = null); + IDatabase Create(string dbPath = null); } public class DbFactory : IDbFactory { private const string MemoryConnectionString = "Data Source=:memory:;Version=3;New=True;"; - static DbFactory() - { - OrmLiteConfig.DialectProvider = new SqliteOrmLiteDialectProvider(); - } - - public IDbConnection Create(string dbPath = null) + public IDatabase Create(string dbPath = null) { var connectionString = MemoryConnectionString; @@ -29,16 +25,12 @@ public IDbConnection Create(string dbPath = null) } MigrationHelper.MigrateToLatest(connectionString, MigrationType.Main); - - OrmLiteConfig.DialectProvider = new SqliteOrmLiteDialectProvider(); - var dbFactory = new OrmLiteConnectionFactory(connectionString); - var connection = dbFactory.Open(); - - Migration.CreateTables(connection); - - return connection; + var dataMapper = new DataMapper(SqliteFactory.Instance, connectionString); + return new Database(dataMapper); } + + private string GetConnectionString(string dbPath) { return String.Format("Data Source={0};Version=3;", dbPath); diff --git a/NzbDrone.Core/Datastore/Migration.cs b/NzbDrone.Core/Datastore/Migration.cs index a43391811..8e381389f 100644 --- a/NzbDrone.Core/Datastore/Migration.cs +++ b/NzbDrone.Core/Datastore/Migration.cs @@ -1,22 +1,10 @@ using System.Data; using System.Linq; -using ServiceStack.OrmLite; + namespace NzbDrone.Core.Datastore { public static class Migration { - public static void CreateTables(IDbConnection dbConnection) - { - var types = typeof(ModelBase).Assembly.GetTypes(); - - var models = types.Where(c => c.BaseType == typeof(ModelBase)); - - foreach (var model in models) - { - dbConnection.CreateTable(true, model); - } - } - } } diff --git a/NzbDrone.Core/Datastore/ModelBase.cs b/NzbDrone.Core/Datastore/ModelBase.cs index 264fff0b8..5176ab4ad 100644 --- a/NzbDrone.Core/Datastore/ModelBase.cs +++ b/NzbDrone.Core/Datastore/ModelBase.cs @@ -1,12 +1,12 @@ -using System.Diagnostics; -using ServiceStack.DataAnnotations; +using System.Data; +using System.Diagnostics; +using Marr.Data; namespace NzbDrone.Core.Datastore { [DebuggerDisplay("{GetType()} ID = {Id}")] public abstract class ModelBase { - [AutoIncrement] public int Id { get; set; } } } diff --git a/NzbDrone.Core/ExternalNotification/ExternalNotificationRepository.cs b/NzbDrone.Core/ExternalNotification/ExternalNotificationRepository.cs index 667f28af9..6fe3326be 100644 --- a/NzbDrone.Core/ExternalNotification/ExternalNotificationRepository.cs +++ b/NzbDrone.Core/ExternalNotification/ExternalNotificationRepository.cs @@ -1,4 +1,5 @@ using System.Data; +using System.Linq; using NzbDrone.Core.Datastore; namespace NzbDrone.Core.ExternalNotification @@ -10,14 +11,14 @@ public interface IExternalNotificationRepository : IBasicRepository, IExternalNotificationRepository { - public ExternalNotificationRepository(IDbConnection database) + public ExternalNotificationRepository(IDatabase database) : base(database) { } public ExternalNotificationDefinition Get(string name) { - return SingleOrDefault(c => c.Name.ToLower() == name.ToLower()); + return Queryable().SingleOrDefault(c => c.Name.ToLower() == name.ToLower()); } } } \ No newline at end of file diff --git a/NzbDrone.Core/History/HistoryRepository.cs b/NzbDrone.Core/History/HistoryRepository.cs index 6774d0bd4..fecde87dd 100644 --- a/NzbDrone.Core/History/HistoryRepository.cs +++ b/NzbDrone.Core/History/HistoryRepository.cs @@ -14,21 +14,21 @@ public interface IHistoryRepository : IBasicRepository public class HistoryRepository : BasicRepository, IHistoryRepository { - public HistoryRepository(IDbConnection database) + public HistoryRepository(IDatabase database) : base(database) { } public void Trim() { - var oldIds = Where(c => c.Date < DateTime.Now.AddDays(-30).Date).Select(c => c.Id); + var oldIds = Queryable().Where(c => c.Date < DateTime.Now.AddDays(-30).Date).Select(c => c.Id); DeleteMany(oldIds); } public QualityModel GetBestQualityInHistory(int episodeId) { - var history = Where(c => c.EpisodeId == episodeId) + var history = Queryable().Where(c => c.EpisodeId == episodeId) .OrderByDescending(c => c.Quality).FirstOrDefault(); if (history != null) diff --git a/NzbDrone.Core/Indexers/IndexerRepository.cs b/NzbDrone.Core/Indexers/IndexerRepository.cs index f06af337f..7d7c9be33 100644 --- a/NzbDrone.Core/Indexers/IndexerRepository.cs +++ b/NzbDrone.Core/Indexers/IndexerRepository.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Linq; using NzbDrone.Core.Datastore; namespace NzbDrone.Core.Indexers @@ -11,14 +12,14 @@ public interface IIndexerRepository : IBasicRepository public class IndexerRepository : BasicRepository, IIndexerRepository { - public IndexerRepository(IDbConnection database) + public IndexerRepository(IDatabase database) : base(database) { } public Indexer Find(Type type) { - return Single(i => i.Type == type.ToString()); + return Queryable().Single(i => i.Type == type.ToString()); } } } diff --git a/NzbDrone.Core/Indexers/NewznabRepository.cs b/NzbDrone.Core/Indexers/NewznabRepository.cs index 4f20cfc01..e591af314 100644 --- a/NzbDrone.Core/Indexers/NewznabRepository.cs +++ b/NzbDrone.Core/Indexers/NewznabRepository.cs @@ -14,13 +14,13 @@ public interface INewznabRepository : IBasicRepository public class NewznabRepository : BasicRepository, INewznabRepository { - public NewznabRepository(IDbConnection database) : base(database) + public NewznabRepository(IDatabase database) : base(database) { } public IEnumerable Enabled() { - return Where(n => n.Enable); + return Queryable().Where(n => n.Enabled); } } } diff --git a/NzbDrone.Core/Instrumentation/LogRepository.cs b/NzbDrone.Core/Instrumentation/LogRepository.cs index 1d4d152c5..134531c84 100644 --- a/NzbDrone.Core/Instrumentation/LogRepository.cs +++ b/NzbDrone.Core/Instrumentation/LogRepository.cs @@ -12,14 +12,14 @@ public interface ILogRepository : IBasicRepository public class LogRepository : BasicRepository, ILogRepository { - public LogRepository(IDbConnection database) + public LogRepository(IDatabase database) : base(database) { } public void Trim() { - var oldIds = Where(c => c.Time < DateTime.Now.AddDays(-30).Date).Select(c => c.Id); + var oldIds = Queryable().Where(c => c.Time < DateTime.Now.AddDays(-30).Date).Select(c => c.Id); DeleteMany(oldIds); } } diff --git a/NzbDrone.Core/Jobs/JobRepository.cs b/NzbDrone.Core/Jobs/JobRepository.cs index 3094d74df..70185839f 100644 --- a/NzbDrone.Core/Jobs/JobRepository.cs +++ b/NzbDrone.Core/Jobs/JobRepository.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Data; using System.Linq; using NLog; using NzbDrone.Core.Datastore; @@ -19,7 +18,7 @@ public class JobRepository : BasicRepository, IJobRepository private readonly IEnumerable _jobs; private readonly Logger _logger; - public JobRepository(IDbConnection database, IEnumerable jobs, Logger logger) + public JobRepository(IDatabase database, IEnumerable jobs, Logger logger) : base(database) { _jobs = jobs; @@ -28,13 +27,13 @@ public JobRepository(IDbConnection database, IEnumerable jobs, Logger logg public JobDefinition GetDefinition(Type type) { - return Single(c => c.Type == type.FullName); + return Queryable().Single(c => c.TypeName == type.FullName); } public IList GetPendingJobs() { - return Where(c => c.Enable && c.LastExecution < DateTime.Now.AddMinutes(-c.Interval)).ToList(); + return Queryable().Where(c => c.Enable && c.LastExecution < DateTime.Now.AddMinutes(-c.Interval)).ToList(); } public void Init() @@ -73,4 +72,4 @@ public void Init() } } } -} \ No newline at end of file +} diff --git a/NzbDrone.Core/MediaFiles/MediaFileRepository.cs b/NzbDrone.Core/MediaFiles/MediaFileRepository.cs index 8c15e243a..2493ea591 100644 --- a/NzbDrone.Core/MediaFiles/MediaFileRepository.cs +++ b/NzbDrone.Core/MediaFiles/MediaFileRepository.cs @@ -15,7 +15,7 @@ public interface IMediaFileRepository : IBasicRepository public class MediaFileRepository : BasicRepository, IMediaFileRepository { - public MediaFileRepository(IDbConnection database) + public MediaFileRepository(IDatabase database) : base(database) { } @@ -23,17 +23,17 @@ public MediaFileRepository(IDbConnection database) public EpisodeFile GetFileByPath(string path) { - return SingleOrDefault(c => c.Path == path); + return Queryable().SingleOrDefault(c => c.Path == path); } public List GetFilesBySeries(int seriesId) { - return Where(c => c.SeriesId == seriesId).ToList(); + return Queryable().Where(c => c.SeriesId == seriesId).ToList(); } public List GetFilesBySeason(int seriesId, int seasonNumber) { - return Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber).ToList(); + return Queryable().Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber).ToList(); } } diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index fce2e8096..98c40be8a 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -132,6 +132,8 @@ ..\packages\FluentMigrator.1.0.6.0\tools\FluentMigrator.Runner.dll + + ..\packages\MarrDataMapper.3.17.4747.34302\lib\FastReflection.dll ..\packages\Growl.0.6\lib\Growl.Connector.dll @@ -142,12 +144,16 @@ ..\packages\DotNetZip.1.9.1.8\lib\net20\Ionic.Zip.dll + + ..\packages\MarrDataMapper.3.17.4747.34302\lib\Marr.Data.dll + ..\packages\MediaInfoNet.0.3\lib\MediaInfoDotNet.dll - - ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.42\lib\net35\Mono.Data.Sqlite.dll + + False + ..\Libraries\Sqlite\Mono.Data.Sqlite.dll False @@ -163,21 +169,6 @@ ..\packages\RestSharp.104.1\lib\net4\RestSharp.dll - - ..\packages\ServiceStack.Common.3.9.42\lib\net35\ServiceStack.Common.dll - - - ..\packages\ServiceStack.Common.3.9.42\lib\net35\ServiceStack.Interfaces.dll - - - ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.42\lib\net35\ServiceStack.OrmLite.dll - - - ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.42\lib\net35\ServiceStack.OrmLite.Sqlite.dll - - - ..\packages\ServiceStack.Text.3.9.42\lib\net35\ServiceStack.Text.dll - ..\packages\SignalR.Server.0.5.3\lib\net40\SignalR.dll @@ -214,6 +205,7 @@ + @@ -610,4 +602,4 @@ --> - \ No newline at end of file + diff --git a/NzbDrone.Core/Qualities/QualityProfileRepository.cs b/NzbDrone.Core/Qualities/QualityProfileRepository.cs index c57e2188a..c36b8f6c4 100644 --- a/NzbDrone.Core/Qualities/QualityProfileRepository.cs +++ b/NzbDrone.Core/Qualities/QualityProfileRepository.cs @@ -14,7 +14,7 @@ public interface IQualityProfileRepository : IBasicRepository public class QualityProfileRepository : BasicRepository, IQualityProfileRepository { - public QualityProfileRepository(IDbConnection database) + public QualityProfileRepository(IDatabase database) : base(database) { } diff --git a/NzbDrone.Core/Qualities/QualitySizeRepository.cs b/NzbDrone.Core/Qualities/QualitySizeRepository.cs index fe6f4bcb5..141247692 100644 --- a/NzbDrone.Core/Qualities/QualitySizeRepository.cs +++ b/NzbDrone.Core/Qualities/QualitySizeRepository.cs @@ -11,14 +11,14 @@ public interface IQualitySizeRepository : IBasicRepository public class QualitySizeRepository : BasicRepository, IQualitySizeRepository { - public QualitySizeRepository(IDbConnection database) + public QualitySizeRepository(IDatabase database) : base(database) { } public QualitySize GetByQualityId(int qualityId) { - return Single(q => q.QualityId == qualityId); + return Queryable().Single(q => q.QualityId == qualityId); } } } diff --git a/NzbDrone.Core/ReferenceData/SceneMappingRepository.cs b/NzbDrone.Core/ReferenceData/SceneMappingRepository.cs index b05b12741..db27c38a3 100644 --- a/NzbDrone.Core/ReferenceData/SceneMappingRepository.cs +++ b/NzbDrone.Core/ReferenceData/SceneMappingRepository.cs @@ -13,19 +13,19 @@ public interface ISceneMappingRepository : IBasicRepository public class SceneMappingRepository : BasicRepository, ISceneMappingRepository { - public SceneMappingRepository(IDbConnection database) + public SceneMappingRepository(IDatabase database) : base(database) { } public SceneMapping FindByTvdbId(int tvdbId) { - return SingleOrDefault(c => c.TvdbId == tvdbId); + return Queryable().SingleOrDefault(c => c.TvdbId == tvdbId); } public SceneMapping FindByCleanTitle(string cleanTitle) { - return SingleOrDefault(c => c.CleanTitle == cleanTitle); + return Queryable().SingleOrDefault(c => c.CleanTitle == cleanTitle); } } } \ No newline at end of file diff --git a/NzbDrone.Core/Tv/EpisodeRepository.cs b/NzbDrone.Core/Tv/EpisodeRepository.cs index c8eb94002435f9d3ad424090c5a2de8f53e37971..51beb68d5ef1b72159780b78bdfb24c80850436e 100644 GIT binary patch delta 232 zcmZ2r_S0-a)yAon%{rnxGSCGSCTnocLluO$Y8k2^ P#LO8ef}35rZ}S5HrYKRj delta 133 zcmexqw!mycm2_!wW?s5NaB5LmW^!t9Nn&!go_|rUPi9G~^~S17X6_{C{Jgx>12uL5bw$&Wbv Z!E_ksQlL(|$*x=zfc%Y{=W*ZW2LQd6G}8b8 diff --git a/NzbDrone.Core/Tv/SeasonRepository.cs b/NzbDrone.Core/Tv/SeasonRepository.cs index 43d183194..890d71e21 100644 --- a/NzbDrone.Core/Tv/SeasonRepository.cs +++ b/NzbDrone.Core/Tv/SeasonRepository.cs @@ -2,7 +2,7 @@ using System.Data; using System.Linq; using NzbDrone.Core.Datastore; -using ServiceStack.OrmLite; + namespace NzbDrone.Core.Tv { @@ -18,33 +18,33 @@ public class SeasonRepository : BasicRepository, ISeasonRepository { private readonly IDbConnection _database; - public SeasonRepository(IDbConnection database) + public SeasonRepository(IDatabase database) : base(database) { } public IList GetSeasonNumbers(int seriesId) { - return _database.List("SELECT SeasonNumber WHERE SeriesId = {0}", seriesId); + return Queryable().Where(c => c.SeriesId == seriesId).Select(c => c.SeriesId).ToList(); } public Season Get(int seriesId, int seasonNumber) { - return _database.Select(s => s.SeriesId == seriesId && s.SeasonNumber == seasonNumber).Single(); + return Queryable().Single(s => s.SeriesId == seriesId && s.SeasonNumber == seasonNumber); } public bool IsIgnored(int seriesId, int seasonNumber) { - var season = _database.Select(s => s.SeriesId == seriesId && s.SeasonNumber == seasonNumber).SingleOrDefault(); + var season = Queryable().SingleOrDefault(s => s.SeriesId == seriesId && s.SeasonNumber == seasonNumber); - if(season == null) return false; + if (season == null) return false; return season.Ignored; } public List GetSeasonBySeries(int seriesId) { - return _database.Select(s => s.SeriesId == seriesId); + return Queryable().Where(s => s.SeriesId == seriesId); } } } \ No newline at end of file diff --git a/NzbDrone.Core/Tv/SeriesRepository.cs b/NzbDrone.Core/Tv/SeriesRepository.cs index a6386fbde..8f1297a49 100644 --- a/NzbDrone.Core/Tv/SeriesRepository.cs +++ b/NzbDrone.Core/Tv/SeriesRepository.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Data; +using System.Linq; using NzbDrone.Core.Datastore; namespace NzbDrone.Core.Tv @@ -15,29 +16,29 @@ public interface ISeriesRepository : IBasicRepository public class SeriesRepository : BasicRepository, ISeriesRepository { - public SeriesRepository(IDbConnection database) + public SeriesRepository(IDatabase database) : base(database) { } public bool SeriesPathExists(string path) { - return Any(c => c.Path == path); + return Queryable().Any(c => c.Path == path); } public List Search(string title) { - return Where(s => s.Title.Contains(title)); + return Queryable().Where(s => s.Title.Contains(title)); } public Series GetByTitle(string cleanTitle) { - return SingleOrDefault(s => s.CleanTitle.Equals(cleanTitle)); + return Queryable().SingleOrDefault(s => s.CleanTitle.Equals(cleanTitle)); } public Series FindByTvdbId(int tvdbId) { - return SingleOrDefault(s => s.TvDbId.Equals(tvdbId)); + return Queryable().SingleOrDefault(s => s.TvDbId.Equals(tvdbId)); } public void SetSeriesType(int seriesId, SeriesTypes seriesType) diff --git a/NzbDrone.Core/packages.config b/NzbDrone.Core/packages.config index 4a760c222..ac76e5c2b 100644 --- a/NzbDrone.Core/packages.config +++ b/NzbDrone.Core/packages.config @@ -4,15 +4,13 @@ + - - - diff --git a/NzbDrone.ncrunchsolution b/NzbDrone.ncrunchsolution index c725a019c..969da6dd4 100644 --- a/NzbDrone.ncrunchsolution +++ b/NzbDrone.ncrunchsolution @@ -2,6 +2,7 @@ 1 True true + true UseDynamicAnalysis Disabled Disabled