Skip to content

Commit

Permalink
NULL values in database are mapped to objects (#97)
Browse files Browse the repository at this point in the history
  • Loading branch information
satano authored Apr 25, 2022
1 parent 13ccda8 commit 542e2d7
Show file tree
Hide file tree
Showing 22 changed files with 982 additions and 180 deletions.
4 changes: 2 additions & 2 deletions Kros.KORM.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28714.193
# Visual Studio Version 17
VisualStudioVersion = 17.1.32319.34
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kros.KORM", "src\Kros.KORM.csproj", "{FD96C4FF-E562-4A5D-92B1-937AEA002192}"
EndProject
Expand Down
11 changes: 4 additions & 7 deletions src/Converter/IntToEnumConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ public IntToEnumConverter(Type enumType)
/// Converted enum value for Clr.
/// </returns>
public object Convert(object value)
{
return Enum.ToObject(_enumType, value);
}
=> value is null
? Enum.ToObject(_enumType, 0)
: Enum.ToObject(_enumType, value);

/// <summary>
/// Converts the enum value from Clr to Db int value.
Expand All @@ -48,9 +48,6 @@ public object Convert(object value)
/// <returns>
/// Converted int value for Db
/// </returns>
public object ConvertBack(object value)
{
return (int)value;
}
public object ConvertBack(object value) => value is null ? 0 : (int)value;
}
}
2 changes: 1 addition & 1 deletion src/Kros.KORM.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;net46</TargetFrameworks>
<TargetFrameworks>netcoreapp3.1;net46</TargetFrameworks>
<Version>4.4.3</Version>
<Authors>KROS a. s.</Authors>
<Company>KROS a. s.</Company>
Expand Down
34 changes: 15 additions & 19 deletions src/Materializer/DynamicMethodModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,16 @@ private Func<IDataReader, T> CreateFactoryForPropertySetters<T>(
ConstructorInfo ctor)
{
Type type = typeof(T);
var dynamicMethod = new DynamicMethod(GetFactoryName, type, new Type[] { typeof(IDataReader) }, true);
DynamicMethod dynamicMethod = new(GetFactoryName, type, new Type[] { typeof(IDataReader) }, true);
ILGenerator ilGenerator = dynamicMethod.GetILGenerator();

ilGenerator.Emit(OpCodes.Newobj, ctor);

ilGenerator.DeclareLocal(typeof(T));
ilGenerator.LogAndEmit(OpCodes.Newobj, ctor);
ilGenerator.LogAndEmit(OpCodes.Stloc_0);
EmitReaderFields(reader, tableInfo, ilGenerator, injector);

ilGenerator.CallOnAfterMaterialize(tableInfo);

ilGenerator.Emit(OpCodes.Ret);
ilGenerator.LogAndEmit(OpCodes.Ldloc_0);
ilGenerator.LogAndEmit(OpCodes.Ret);

return dynamicMethod.CreateDelegate(Expression.GetFuncType(typeof(IDataReader), type)) as Func<IDataReader, T>;
}
Expand Down Expand Up @@ -140,7 +140,6 @@ private static void EmitReaderFields(IDataReader reader,
{
EmitField(reader, tableInfo, ilGenerator, i);
}

EmitPropertyForInjecting(tableInfo, ilGenerator, injector);
}

Expand All @@ -152,36 +151,33 @@ private static void EmitPropertyForInjecting(TableInfo tableInfo,
.AllModelProperties
.Where(p => injector.IsInjectable(p.Name)))
{
ilGenerator.Emit(OpCodes.Dup);
ilGenerator.LogAndEmit(OpCodes.Ldloc_0);
ilGenerator.CallGetInjectedValue(injector, property.Name, property.PropertyType);
ilGenerator.Emit(OpCodes.Callvirt, property.GetSetMethod(true));
ilGenerator.LogAndEmit(OpCodes.Callvirt, property.GetSetMethod(true));
}
}

private static void EmitField(IDataReader reader,
private static void EmitField(
IDataReader reader,
TableInfo tableInfo,
ILGenerator ilGenerator,
int columnIndex)
{
ColumnInfo columnInfo = tableInfo.GetColumnInfo(reader.GetName(columnIndex));
if (columnInfo != null)
{
ilGenerator.LogAndEmit(OpCodes.Ldloc_0);
Type srcType = reader.GetFieldType(columnIndex);

Label truePart = ilGenerator.CallReaderIsDbNull(columnIndex);
IConverter converter = ConverterHelper.GetConverter(columnInfo, srcType);

if (converter == null)
if (converter is null)
{
ilGenerator.CallReaderGetValueWithoutConverter(columnIndex, columnInfo, srcType);
ilGenerator.EmitFieldWithoutConverter(srcType, columnInfo.PropertyInfo.PropertyType, columnIndex);
}
else
{
ilGenerator.CallReaderGetValueWithConverter(columnIndex, converter, columnInfo);
ilGenerator.EmitFieldWithConverter(converter, columnInfo.PropertyInfo.PropertyType, columnIndex);
}

ilGenerator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true));
ilGenerator.MarkLabel(truePart);
ilGenerator.LogAndEmit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true));
}
}

Expand Down
Loading

0 comments on commit 542e2d7

Please sign in to comment.