diff --git a/Marr.Data/Converters/BooleanIntConverter.cs b/Marr.Data/Converters/BooleanIntConverter.cs
index 9dc9b41d3..18c964d15 100644
--- a/Marr.Data/Converters/BooleanIntConverter.cs
+++ b/Marr.Data/Converters/BooleanIntConverter.cs
@@ -20,14 +20,14 @@ namespace Marr.Data.Converters
{
public class BooleanIntConverter : IConverter
{
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- if (dbValue == DBNull.Value)
+ if (context.DbValue == DBNull.Value)
{
return DBNull.Value;
}
- int val = (int)dbValue;
+ int val = (int)context.DbValue;
if (val == 1)
{
@@ -40,7 +40,12 @@ namespace Marr.Data.Converters
throw new ConversionException(
string.Format(
"The BooleanCharConverter could not convert the value '{0}' to a boolean.",
- dbValue));
+ context.DbValue));
+ }
+
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
}
public object ToDB(object clrValue)
diff --git a/Marr.Data/Converters/BooleanYNConverter.cs b/Marr.Data/Converters/BooleanYNConverter.cs
index b116bdeaf..38003939c 100644
--- a/Marr.Data/Converters/BooleanYNConverter.cs
+++ b/Marr.Data/Converters/BooleanYNConverter.cs
@@ -20,14 +20,14 @@ namespace Marr.Data.Converters
{
public class BooleanYNConverter : IConverter
{
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- if (dbValue == DBNull.Value)
+ if (context.DbValue == DBNull.Value)
{
return DBNull.Value;
}
- string val = dbValue.ToString();
+ string val = context.DbValue.ToString();
if (val == "Y")
{
@@ -40,7 +40,12 @@ namespace Marr.Data.Converters
throw new ConversionException(
string.Format(
"The BooleanYNConverter could not convert the value '{0}' to a boolean.",
- dbValue));
+ context.DbValue));
+ }
+
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext {ColumnMap = map, DbValue = dbValue});
}
public object ToDB(object clrValue)
diff --git a/Marr.Data/Converters/CastConverter.cs b/Marr.Data/Converters/CastConverter.cs
index 4253357ed..2fa3b8eca 100644
--- a/Marr.Data/Converters/CastConverter.cs
+++ b/Marr.Data/Converters/CastConverter.cs
@@ -30,12 +30,17 @@ namespace Marr.Data.Converters
get { return typeof(TDb); }
}
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- TDb val = (TDb)dbValue;
+ TDb val = (TDb)context.DbValue;
return val.ToType(typeof(TClr), CultureInfo.InvariantCulture);
}
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
+ }
+
public object ToDB(object clrValue)
{
TClr val = (TClr)clrValue;
diff --git a/Marr.Data/Converters/ConverterContext.cs b/Marr.Data/Converters/ConverterContext.cs
new file mode 100644
index 000000000..341925077
--- /dev/null
+++ b/Marr.Data/Converters/ConverterContext.cs
@@ -0,0 +1,13 @@
+using System.Data;
+using Marr.Data.Mapping;
+
+namespace Marr.Data.Converters
+{
+ public class ConverterContext
+ {
+ public ColumnMap ColumnMap { get; set; }
+ public object DbValue { get; set; }
+ public ColumnMapCollection MapCollection { get; set; }
+ public IDataRecord DataRecord { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Marr.Data/Converters/EnumIntConverter.cs b/Marr.Data/Converters/EnumIntConverter.cs
index a7d528d16..5fe88a411 100644
--- a/Marr.Data/Converters/EnumIntConverter.cs
+++ b/Marr.Data/Converters/EnumIntConverter.cs
@@ -20,11 +20,16 @@ namespace Marr.Data.Converters
{
public class EnumIntConverter : IConverter
{
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- if (dbValue == null || dbValue == DBNull.Value)
+ if (context.DbValue == null || context.DbValue == DBNull.Value)
return null;
- return Enum.ToObject(map.FieldType, (int)dbValue);
+ return Enum.ToObject(context.ColumnMap.FieldType, (int)context.DbValue);
+ }
+
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
}
public object ToDB(object clrValue)
diff --git a/Marr.Data/Converters/EnumStringConverter.cs b/Marr.Data/Converters/EnumStringConverter.cs
index 4e304fc10..eb4f8b01a 100644
--- a/Marr.Data/Converters/EnumStringConverter.cs
+++ b/Marr.Data/Converters/EnumStringConverter.cs
@@ -20,11 +20,16 @@ namespace Marr.Data.Converters
{
public class EnumStringConverter : IConverter
{
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- if (dbValue == null || dbValue == DBNull.Value)
+ if (context.DbValue == null || context.DbValue == DBNull.Value)
return null;
- return Enum.Parse(map.FieldType, (string)dbValue);
+ return Enum.Parse(context.ColumnMap.FieldType, (string)context.DbValue);
+ }
+
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
}
public object ToDB(object clrValue)
diff --git a/Marr.Data/Converters/IConverter.cs b/Marr.Data/Converters/IConverter.cs
index 318f26957..f2e9685a9 100644
--- a/Marr.Data/Converters/IConverter.cs
+++ b/Marr.Data/Converters/IConverter.cs
@@ -20,6 +20,9 @@ namespace Marr.Data.Converters
{
public interface IConverter
{
+ object FromDB(ConverterContext context);
+
+ [Obsolete("use FromDB(ConverterContext context) instead")]
object FromDB(ColumnMap map, object dbValue);
object ToDB(object clrValue);
Type DbType { get; }
diff --git a/Marr.Data/Mapping/MappingHelper.cs b/Marr.Data/Mapping/MappingHelper.cs
index f025528be..0b4c73681 100644
--- a/Marr.Data/Mapping/MappingHelper.cs
+++ b/Marr.Data/Mapping/MappingHelper.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Data.Common;
+using Marr.Data.Converters;
namespace Marr.Data.Mapping
{
@@ -53,7 +54,15 @@ namespace Marr.Data.Mapping
// Handle conversions
if (dataMap.Converter != null)
{
- dbValue = dataMap.Converter.FromDB(dataMap, dbValue);
+ var convertContext = new ConverterContext
+ {
+ DbValue = dbValue,
+ ColumnMap = dataMap,
+ MapCollection = mappings,
+ DataRecord = reader
+ };
+
+ dbValue = dataMap.Converter.FromDB(convertContext);
}
if (dbValue != DBNull.Value && dbValue != null)
diff --git a/Marr.Data/Marr.Data.csproj b/Marr.Data/Marr.Data.csproj
index f7e58cb01..9ae7c2082 100644
--- a/Marr.Data/Marr.Data.csproj
+++ b/Marr.Data/Marr.Data.csproj
@@ -52,6 +52,7 @@
+
diff --git a/NzbDrone.Core/Datastore/Converters/BooleanIntConverter.cs b/NzbDrone.Core/Datastore/Converters/BooleanIntConverter.cs
index 88d06c669..7ec60e201 100644
--- a/NzbDrone.Core/Datastore/Converters/BooleanIntConverter.cs
+++ b/NzbDrone.Core/Datastore/Converters/BooleanIntConverter.cs
@@ -6,14 +6,14 @@ namespace NzbDrone.Core.Datastore.Converters
{
public class BooleanIntConverter : IConverter
{
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- if (dbValue == DBNull.Value)
+ if (context.DbValue == DBNull.Value)
{
return DBNull.Value;
}
- var val = (Int64)dbValue;
+ var val = (Int64)context.DbValue;
switch (val)
{
@@ -22,10 +22,15 @@ namespace NzbDrone.Core.Datastore.Converters
case 0:
return false;
default:
- throw new ConversionException(string.Format("The BooleanCharConverter could not convert the value '{0}' to a Boolean.", dbValue));
+ throw new ConversionException(string.Format("The BooleanCharConverter could not convert the value '{0}' to a Boolean.", context.DbValue));
}
}
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
+ }
+
public object ToDB(object clrValue)
{
var val = (Nullable)clrValue;
diff --git a/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs b/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs
index b222eb320..cde1c116d 100644
--- a/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs
+++ b/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs
@@ -5,24 +5,57 @@ using NzbDrone.Common.Serializer;
namespace NzbDrone.Core.Datastore.Converters
{
- public class EmbeddedDocumentConverter : IConverter
+
+ public class ProviderSettingConverter : EmbeddedDocumentConverter
{
+ public override object FromDB(ConverterContext context)
+ {
+ if (context.DbValue == DBNull.Value)
+ {
+ return DBNull.Value;
+ }
- public object FromDB(ColumnMap map, object dbValue)
+ var stringValue = (string)context.DbValue;
+
+ if (string.IsNullOrWhiteSpace(stringValue))
+ {
+ return null;
+ }
+
+ var ordinal = context.DataRecord.GetOrdinal("ConfigContract");
+
+ var implementation = context.DataRecord.GetString(ordinal);
+
+ var impType = Type.GetType(implementation, true, true);
+
+ return Json.Deserialize(stringValue, impType);
+ }
+
+ }
+
+
+ public class EmbeddedDocumentConverter : IConverter
+ {
+ public virtual object FromDB(ConverterContext context)
{
- if (dbValue == DBNull.Value)
+ if (context.DbValue == DBNull.Value)
{
return DBNull.Value;
}
- var stringValue = (string)dbValue;
+ var stringValue = (string)context.DbValue;
if (string.IsNullOrWhiteSpace(stringValue))
{
return null;
}
- return Json.Deserialize(stringValue, map.FieldType);
+ return Json.Deserialize(stringValue, context.ColumnMap.FieldType);
+ }
+
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
}
public object ToDB(object clrValue)
diff --git a/NzbDrone.Core/Datastore/Converters/EnumIntConverter.cs b/NzbDrone.Core/Datastore/Converters/EnumIntConverter.cs
index f79c736c2..40c2727bc 100644
--- a/NzbDrone.Core/Datastore/Converters/EnumIntConverter.cs
+++ b/NzbDrone.Core/Datastore/Converters/EnumIntConverter.cs
@@ -14,16 +14,21 @@ namespace NzbDrone.Core.Datastore.Converters
}
}
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- if (dbValue != null && dbValue != DBNull.Value)
+ if (context.DbValue != null && context.DbValue != DBNull.Value)
{
- return Enum.ToObject(map.FieldType, (Int64)dbValue);
+ return Enum.ToObject(context.ColumnMap.FieldType, (Int64)context.DbValue);
}
return null;
}
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
+ }
+
public object ToDB(object clrValue)
{
if (clrValue != null)
diff --git a/NzbDrone.Core/Datastore/Converters/Int32Converter.cs b/NzbDrone.Core/Datastore/Converters/Int32Converter.cs
index fcf66a045..c69bfb9a5 100644
--- a/NzbDrone.Core/Datastore/Converters/Int32Converter.cs
+++ b/NzbDrone.Core/Datastore/Converters/Int32Converter.cs
@@ -6,6 +6,21 @@ namespace NzbDrone.Core.Datastore.Converters
{
public class Int32Converter : IConverter
{
+ public object FromDB(ConverterContext context)
+ {
+ if (context.DbValue == DBNull.Value)
+ {
+ return DBNull.Value;
+ }
+
+ if (context.DbValue is Int32)
+ {
+ return context.DbValue;
+ }
+
+ return Convert.ToInt32(context.DbValue);
+ }
+
public object FromDB(ColumnMap map, object dbValue)
{
if (dbValue == DBNull.Value)
diff --git a/NzbDrone.Core/Datastore/Converters/QualityIntConverter.cs b/NzbDrone.Core/Datastore/Converters/QualityIntConverter.cs
index 839ef85be..6dc9d6c24 100644
--- a/NzbDrone.Core/Datastore/Converters/QualityIntConverter.cs
+++ b/NzbDrone.Core/Datastore/Converters/QualityIntConverter.cs
@@ -7,18 +7,23 @@ namespace NzbDrone.Core.Datastore.Converters
{
public class QualityIntConverter : IConverter
{
- public object FromDB(ColumnMap map, object dbValue)
+ public object FromDB(ConverterContext context)
{
- if (dbValue == DBNull.Value)
+ if (context.DbValue == DBNull.Value)
{
return Quality.Unknown;
}
- var val = Convert.ToInt32(dbValue);
+ var val = Convert.ToInt32(context.DbValue);
return (Quality)val;
}
+ public object FromDB(ColumnMap map, object dbValue)
+ {
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
+ }
+
public object ToDB(object clrValue)
{
if(clrValue == null) return 0;
diff --git a/NzbDrone.Core/Datastore/Converters/UtcConverter.cs b/NzbDrone.Core/Datastore/Converters/UtcConverter.cs
index 0bdc802dc..25d313a6c 100644
--- a/NzbDrone.Core/Datastore/Converters/UtcConverter.cs
+++ b/NzbDrone.Core/Datastore/Converters/UtcConverter.cs
@@ -6,9 +6,14 @@ namespace NzbDrone.Core.Datastore.Converters
{
public class UtcConverter : IConverter
{
+ public object FromDB(ConverterContext context)
+ {
+ return context.DbValue;
+ }
+
public object FromDB(ColumnMap map, object dbValue)
{
- return dbValue;
+ return FromDB(new ConverterContext { ColumnMap = map, DbValue = dbValue });
}
public object ToDB(object clrValue)