using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Marr.Data; using Marr.Data.Mapping; namespace NzbDrone.Core.Datastore { public static class MappingExtensions { public static ColumnMapBuilder RegisterModel(this FluentMappings.MappingsFluentEntity mapBuilder, string tableName) where T : ModelBase { return mapBuilder.Table.MapTable(tableName) .Columns .AutoMapPropertiesWhere(IsMappableProperty) .For(c => c.Id) .SetPrimaryKey() .SetReturnValue() .SetAutoIncrement(); } public static bool IsMappableProperty(MemberInfo memberInfo) { var propertyInfo = memberInfo as PropertyInfo; if (propertyInfo == null) return false; if (!propertyInfo.IsReadable() || !propertyInfo.IsWritable()) { return false; } if (IsSimpleType(propertyInfo.PropertyType) || MapRepository.Instance.TypeConverters.ContainsKey(propertyInfo.PropertyType)) { return true; } return false; } public static bool IsSimpleType(Type type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { type = type.GetGenericArguments()[0]; } return type.IsPrimitive || type.IsEnum || type == typeof(string) || type == typeof(DateTime) || type == typeof(Decimal); } private static bool IsReadable(this PropertyInfo propertyInfo) { return propertyInfo.CanRead && propertyInfo.GetGetMethod(false) != null; } private static bool IsWritable(this PropertyInfo propertyInfo) { return propertyInfo.CanWrite && propertyInfo.GetSetMethod(false) != null; } } }