using System; using System.Collections.Generic; using System.Linq; using Dapper; using NzbDrone.Common.Reflection; using NzbDrone.Core.Applications; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration; using NzbDrone.Core.CustomFilters; using NzbDrone.Core.Datastore.Converters; using NzbDrone.Core.Download; using NzbDrone.Core.IndexerProxies; using NzbDrone.Core.Indexers; using NzbDrone.Core.IndexerVersions; using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Jobs; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Notifications; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Profiles; using NzbDrone.Core.Tags; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Update.History; using static Dapper.SqlMapper; namespace NzbDrone.Core.Datastore { public static class TableMapping { static TableMapping() { Mapper = new TableMapper(); } public static TableMapper Mapper { get; private set; } public static void Map() { RegisterMappers(); Mapper.Entity("Config").RegisterModel(); Mapper.Entity("ScheduledTasks").RegisterModel() .Ignore(i => i.Priority); Mapper.Entity("Indexers").RegisterModel() .Ignore(x => x.ImplementationName) .Ignore(i => i.Description) .Ignore(i => i.Language) .Ignore(i => i.Encoding) .Ignore(i => i.IndexerUrls) .Ignore(i => i.LegacyUrls) .Ignore(i => i.Protocol) .Ignore(i => i.Privacy) .Ignore(i => i.SupportsRss) .Ignore(i => i.SupportsSearch) .Ignore(i => i.SupportsRedirect) .Ignore(i => i.SupportsPagination) .Ignore(i => i.Capabilities) .HasOne(a => a.AppProfile, a => a.AppProfileId); Mapper.Entity("DownloadClients").RegisterModel() .Ignore(x => x.ImplementationName) .Ignore(d => d.SupportsCategories) .Ignore(d => d.Protocol) .Ignore(d => d.Tags); Mapper.Entity("Notifications").RegisterModel() .Ignore(x => x.ImplementationName) .Ignore(i => i.SupportsOnGrab) .Ignore(i => i.SupportsOnHealthIssue) .Ignore(i => i.SupportsOnApplicationUpdate); Mapper.Entity("IndexerProxies").RegisterModel() .Ignore(x => x.ImplementationName); Mapper.Entity("Applications").RegisterModel() .Ignore(x => x.ImplementationName); Mapper.Entity("History").RegisterModel(); Mapper.Entity("Logs").RegisterModel(); Mapper.Entity("Tags").RegisterModel(); Mapper.Entity("ApplicationIndexerMapping").RegisterModel(); Mapper.Entity("Users").RegisterModel(); Mapper.Entity("Commands").RegisterModel() .Ignore(c => c.Message); Mapper.Entity("IndexerStatus").RegisterModel(); Mapper.Entity("DownloadClientStatus").RegisterModel(); Mapper.Entity("ApplicationStatus").RegisterModel(); Mapper.Entity("CustomFilters").RegisterModel(); Mapper.Entity("UpdateHistory").RegisterModel(); Mapper.Entity("AppSyncProfiles").RegisterModel(); Mapper.Entity("IndexerDefinitionVersions").RegisterModel(); } private static void RegisterMappers() { RegisterEmbeddedConverter(); RegisterProviderSettingConverter(); SqlMapper.RemoveTypeMap(typeof(DateTime)); SqlMapper.AddTypeHandler(new DapperUtcConverter()); SqlMapper.AddTypeHandler(new DapperTimeSpanConverter()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>()); SqlMapper.AddTypeHandler(new CookieConverter()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>>()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>()); SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>()); SqlMapper.AddTypeHandler(new OsPathConverter()); SqlMapper.RemoveTypeMap(typeof(Guid)); SqlMapper.RemoveTypeMap(typeof(Guid?)); SqlMapper.AddTypeHandler(new GuidConverter()); SqlMapper.AddTypeHandler(new CommandConverter()); SqlMapper.AddTypeHandler(new SystemVersionConverter()); } private static void RegisterProviderSettingConverter() { var settingTypes = typeof(IProviderConfig).Assembly.ImplementationsOf() .Where(x => !x.ContainsGenericParameters); var providerSettingConverter = new ProviderSettingConverter(); foreach (var embeddedType in settingTypes) { SqlMapper.AddTypeHandler(embeddedType, providerSettingConverter); } } private static void RegisterEmbeddedConverter() { var embeddedTypes = typeof(IEmbeddedDocument).Assembly.ImplementationsOf(); var embeddedConverterDefinition = typeof(EmbeddedDocumentConverter<>).GetGenericTypeDefinition(); var genericListDefinition = typeof(List<>).GetGenericTypeDefinition(); foreach (var embeddedType in embeddedTypes) { var embeddedListType = genericListDefinition.MakeGenericType(embeddedType); RegisterEmbeddedConverter(embeddedType, embeddedConverterDefinition); RegisterEmbeddedConverter(embeddedListType, embeddedConverterDefinition); } } private static void RegisterEmbeddedConverter(Type embeddedType, Type embeddedConverterDefinition) { var embeddedConverterType = embeddedConverterDefinition.MakeGenericType(embeddedType); var converter = (ITypeHandler)Activator.CreateInstance(embeddedConverterType); SqlMapper.AddTypeHandler(embeddedType, converter); } } }