Commit 3ce97f74 authored by mgravell's avatar mgravell

add Binary support

parent c3e7dbc9
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Data.Linq" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Dapper\Properties\AssemblyInfo.cs"> <Compile Include="..\Dapper\Properties\AssemblyInfo.cs">
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Data.Linq" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="SqlMapper.cs" /> <Compile Include="SqlMapper.cs" />
......
...@@ -183,6 +183,7 @@ static SqlMapper() ...@@ -183,6 +183,7 @@ static SqlMapper()
typeMap[typeof(Guid?).TypeHandle] = DbType.Guid; typeMap[typeof(Guid?).TypeHandle] = DbType.Guid;
typeMap[typeof(DateTime?).TypeHandle] = DbType.DateTime; typeMap[typeof(DateTime?).TypeHandle] = DbType.DateTime;
typeMap[typeof(DateTimeOffset?).TypeHandle] = DbType.DateTimeOffset; typeMap[typeof(DateTimeOffset?).TypeHandle] = DbType.DateTimeOffset;
typeMap[typeof(System.Data.Linq.Binary).TypeHandle] = DbType.Binary;
} }
private static DbType LookupDbType(Type type, string name) private static DbType LookupDbType(Type type, string name)
...@@ -669,7 +670,7 @@ private static CacheInfo GetCacheInfo(Identity identity) ...@@ -669,7 +670,7 @@ private static CacheInfo GetCacheInfo(Identity identity)
} }
#endif #endif
if (type.IsClass && type != typeof(string) && type != typeof(byte[])) if (type.IsClass && type != typeof(string) && type != typeof(byte[]) && type != typeof(System.Data.Linq.Binary))
{ {
return GetClassDeserializer<T>(reader, startBound, length, returnNullIfFirstMissing); return GetClassDeserializer<T>(reader, startBound, length, returnNullIfFirstMissing);
} }
...@@ -1032,6 +1033,10 @@ private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyIn ...@@ -1032,6 +1033,10 @@ private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyIn
il.MarkLabel(lenDone); il.MarkLabel(lenDone);
il.Emit(OpCodes.Stloc_1); // [string] il.Emit(OpCodes.Stloc_1); // [string]
} }
if (prop.PropertyType == typeof(System.Data.Linq.Binary))
{
il.EmitCall(OpCodes.Callvirt, typeof(System.Data.Linq.Binary).GetMethod("ToArray", BindingFlags.Public | BindingFlags.Instance), null);
}
if (allDone != null) il.MarkLabel(allDone.Value); if (allDone != null) il.MarkLabel(allDone.Value);
// relative stack [boxed value or DBNull] // relative stack [boxed value or DBNull]
} }
...@@ -1099,6 +1104,10 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction, ...@@ -1099,6 +1104,10 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction,
{ {
return (Func<IDataReader, T>)(object)new Func<IDataReader, char?>(r => SqlMapper.ReadNullableChar(r.GetValue(index))); return (Func<IDataReader, T>)(object)new Func<IDataReader, char?>(r => SqlMapper.ReadNullableChar(r.GetValue(index)));
} }
if (typeof(T) == typeof(System.Data.Linq.Binary))
{
return (Func<IDataReader, T>)(object)new Func<IDataReader, System.Data.Linq.Binary>(r => new System.Data.Linq.Binary((byte[])r.GetValue(index)));
}
#pragma warning restore 618 #pragma warning restore 618
return r => return r =>
{ {
...@@ -1253,7 +1262,15 @@ static readonly MethodInfo ...@@ -1253,7 +1262,15 @@ static readonly MethodInfo
il.MarkLabel(isNotString); il.MarkLabel(isNotString);
} }
il.Emit(OpCodes.Unbox_Any, unboxType); // stack is now [target][target][typed-value] if (memberType == typeof(System.Data.Linq.Binary))
{
il.Emit(OpCodes.Unbox_Any, typeof(byte[])); // stack is now [target][target][byte-array]
il.Emit(OpCodes.Newobj, typeof(System.Data.Linq.Binary).GetConstructor(new Type[] { typeof(byte[]) }));// stack is now [target][target][binary]
}
else
{
il.Emit(OpCodes.Unbox_Any, unboxType); // stack is now [target][target][typed-value]
}
if (nullUnderlyingType != null && nullUnderlyingType.IsEnum) if (nullUnderlyingType != null && nullUnderlyingType.IsEnum)
{ {
il.Emit(OpCodes.Newobj, memberType.GetConstructor(new[] { nullUnderlyingType })); il.Emit(OpCodes.Newobj, memberType.GetConstructor(new[] { nullUnderlyingType }));
...@@ -1267,6 +1284,7 @@ static readonly MethodInfo ...@@ -1267,6 +1284,7 @@ static readonly MethodInfo
{ {
il.Emit(OpCodes.Stfld, item.Field); // stack is now [target] il.Emit(OpCodes.Stfld, item.Field); // stack is now [target]
} }
il.Emit(OpCodes.Br_S, finishLabel); // stack is now [target] il.Emit(OpCodes.Br_S, finishLabel); // stack is now [target]
il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value] il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]
......
...@@ -1036,5 +1036,32 @@ public void TestDynamicParamNullSupport() ...@@ -1036,5 +1036,32 @@ public void TestDynamicParamNullSupport()
p.Get<int?>("@b").IsNull(); p.Get<int?>("@b").IsNull();
} }
public void TestLinqBinaryToClass()
{
byte[] orig = new byte[20];
new Random(123456).NextBytes(orig);
var input = new System.Data.Linq.Binary(orig);
var output = connection.Query<WithBinary>("select @input as [Value]", new { input }).First().Value;
output.ToArray().IsSequenceEqualTo(orig);
}
public void TestLinqBinaryRaw()
{
byte[] orig = new byte[20];
new Random(123456).NextBytes(orig);
var input = new System.Data.Linq.Binary(orig);
var output = connection.Query<System.Data.Linq.Binary>("select @input as [Value]", new { input }).First();
output.ToArray().IsSequenceEqualTo(orig);
}
class WithBinary
{
public System.Data.Linq.Binary Value { get; set; }
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment