Commit 50131437 authored by Sam Saffron's avatar Sam Saffron

merge

parents 38a0a79c 40f28eac
...@@ -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)
...@@ -702,7 +703,7 @@ private static CacheInfo GetCacheInfo(Identity identity) ...@@ -702,7 +703,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);
} }
...@@ -1065,6 +1066,10 @@ private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyIn ...@@ -1065,6 +1066,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]
} }
...@@ -1132,6 +1137,10 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction, ...@@ -1132,6 +1137,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 =>
{ {
...@@ -1303,7 +1312,15 @@ static List<FieldInfo> GetSettableFields(Type t) ...@@ -1303,7 +1312,15 @@ static List<FieldInfo> GetSettableFields(Type t)
il.MarkLabel(isNotString); il.MarkLabel(isNotString);
} }
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] 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 }));
...@@ -1317,6 +1334,7 @@ static List<FieldInfo> GetSettableFields(Type t) ...@@ -1317,6 +1334,7 @@ static List<FieldInfo> GetSettableFields(Type t)
{ {
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]
......
See doco at: http://code.google.com/p/dapper-dot-net/ See doco at: http://code.google.com/p/dapper-dot-net/
...@@ -1036,29 +1036,50 @@ public void TestDynamicParamNullSupport() ...@@ -1036,29 +1036,50 @@ public void TestDynamicParamNullSupport()
p.Get<int?>("@b").IsNull(); p.Get<int?>("@b").IsNull();
} }
class Foo1 class Foo1
{ {
public int Id; public int Id;
public int BarId { get; set; } public int BarId { get; set; }
} }
class Bar1 class Bar1
{ {
public int BarId; public int BarId;
public string Name { get; set; } public string Name { get; set; }
} }
public void TestMultiMapperIsNotConfusedWithUnorderedCols() public void TestMultiMapperIsNotConfusedWithUnorderedCols()
{ {
var result = connection.Query<Foo1, Bar1, Tuple<Foo1, Bar1>>("select 1 as Id, 2 as BarId, 3 as BarId, 'a' as Name", (f, b) => Tuple.Create(f, b), splitOn: "BarId").First();
var result = connection.Query<Foo1,Bar1, Tuple<Foo1,Bar1>>("select 1 as Id, 2 as BarId, 3 as BarId, 'a' as Name", (f,b) => Tuple.Create(f,b), splitOn: "BarId").First();
result.Item1.Id.IsEqualTo(1); result.Item1.Id.IsEqualTo(1);
result.Item1.BarId.IsEqualTo(2); result.Item1.BarId.IsEqualTo(2);
result.Item2.BarId.IsEqualTo(3); result.Item2.BarId.IsEqualTo(3);
result.Item2.Name.IsEqualTo("a"); result.Item2.Name.IsEqualTo("a");
}
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