Commit 536fed0d authored by Sam Saffron's avatar Sam Saffron

minor refactor to avoid copying a list fix test names

parent 7de47221
...@@ -118,10 +118,26 @@ public static int ExecuteMapperCommand(this IDbConnection cnn, string sql, objec ...@@ -118,10 +118,26 @@ public static int ExecuteMapperCommand(this IDbConnection cnn, string sql, objec
return ExecuteCommand(cnn, transaction, sql, GetParamInfo(param)); return ExecuteCommand(cnn, transaction, sql, GetParamInfo(param));
} }
static class DynamicStub
{
public static Type Type = typeof(DynamicStub);
}
public static List<dynamic> ExecuteMapperQuery (this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null) public static List<dynamic> ExecuteMapperQuery (this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null)
{ {
// TODO: get rid of casting hackery var identity = new Identity(sql, DynamicStub.Type);
return ExecuteMapperQuery<ExpandoObject>(cnn, sql, param, transaction).Select(s => s as dynamic).ToList(); var list = new List<dynamic>();
using (var reader = GetReader(cnn, transaction, sql, GetParamInfo(param)))
{
Func<IDataReader, ExpandoObject> deserializer = GetDeserializer<ExpandoObject>(identity, reader);
while (reader.Read())
{
list.Add(deserializer(reader));
}
}
return list;
} }
...@@ -131,11 +147,25 @@ public static List<T> ExecuteMapperQuery<T>(this IDbConnection cnn, string sql, ...@@ -131,11 +147,25 @@ public static List<T> ExecuteMapperQuery<T>(this IDbConnection cnn, string sql,
var rval = new List<T>(); var rval = new List<T>();
using (var reader = GetReader(cnn, transaction, sql, GetParamInfo(param))) using (var reader = GetReader(cnn, transaction, sql, GetParamInfo(param)))
{
Func<IDataReader, T> deserializer = GetDeserializer<T>(identity, reader);
while (reader.Read())
{
rval.Add(deserializer(reader));
}
// ignore any other grids; note that this might mean we miss exceptions that happen
// late in the TDS stream, but that is bad design anyhow
}
return rval;
}
private static Func<IDataReader, T> GetDeserializer<T>(Identity identity, IDataReader reader)
{ {
object oDeserializer; object oDeserializer;
if (!cachedSerializers.TryGetValue(identity, out oDeserializer)) if (!cachedSerializers.TryGetValue(identity, out oDeserializer))
{ {
if (typeof(T) == typeof(ExpandoObject)) if (typeof(T) == DynamicStub.Type || typeof(T) == typeof(ExpandoObject))
{ {
oDeserializer = GetDynamicDeserializer(reader); oDeserializer = GetDynamicDeserializer(reader);
} }
...@@ -151,15 +181,7 @@ public static List<T> ExecuteMapperQuery<T>(this IDbConnection cnn, string sql, ...@@ -151,15 +181,7 @@ public static List<T> ExecuteMapperQuery<T>(this IDbConnection cnn, string sql,
cachedSerializers[identity] = oDeserializer; cachedSerializers[identity] = oDeserializer;
} }
Func<IDataReader, T> deserializer = (Func<IDataReader, T>)oDeserializer; Func<IDataReader, T> deserializer = (Func<IDataReader, T>)oDeserializer;
while (reader.Read()) return deserializer;
{
rval.Add(deserializer(reader));
}
// ignore any other grids; note that this might mean we miss exceptions that happen
// late in the TDS stream, but that is bad design anyhow
}
return rval;
} }
private static List<ParamInfo> GetParamInfo(object param) private static List<ParamInfo> GetParamInfo(object param)
......
...@@ -9,7 +9,7 @@ namespace SqlMapper ...@@ -9,7 +9,7 @@ namespace SqlMapper
static class TestAssertions static class TestAssertions
{ {
public static void IsEquals<T>(this T obj, T other) public static void IsEqualTo<T>(this T obj, T other)
{ {
if (!obj.Equals(other)) if (!obj.Equals(other))
{ {
...@@ -17,7 +17,7 @@ public static void IsEquals<T>(this T obj, T other) ...@@ -17,7 +17,7 @@ public static void IsEquals<T>(this T obj, T other)
} }
} }
public static void IsSequenceEqual<T>(this IEnumerable<T> obj, IEnumerable<T> other) public static void IsSequenceEqualTo<T>(this IEnumerable<T> obj, IEnumerable<T> other)
{ {
if (!obj.SequenceEqual(other)) if (!obj.SequenceEqual(other))
{ {
...@@ -51,20 +51,20 @@ class Tests ...@@ -51,20 +51,20 @@ class Tests
public void SelectListInt() public void SelectListInt()
{ {
connection.ExecuteMapperQuery<int>("select 1 union all select 2 union all select 3") connection.ExecuteMapperQuery<int>("select 1 union all select 2 union all select 3")
.IsSequenceEqual(new[] { 1, 2, 3 }); .IsSequenceEqualTo(new[] { 1, 2, 3 });
} }
public void PassInIntArray() public void PassInIntArray()
{ {
connection.ExecuteMapperQuery<int>("select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids", new { Ids = new int[] { 1, 2, 3 }.AsEnumerable() }) connection.ExecuteMapperQuery<int>("select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids", new { Ids = new int[] { 1, 2, 3 }.AsEnumerable() })
.IsSequenceEqual(new[] { 1, 2, 3 }); .IsSequenceEqualTo(new[] { 1, 2, 3 });
} }
public void TestDoubleParam() public void TestDoubleParam()
{ {
connection.ExecuteMapperQuery<double>("select @d", new { d = 0.1d }).First() connection.ExecuteMapperQuery<double>("select @d", new { d = 0.1d }).First()
.IsEquals(0.1d); .IsEqualTo(0.1d);
} }
public void TestBoolParam() public void TestBoolParam()
...@@ -76,7 +76,7 @@ public void TestBoolParam() ...@@ -76,7 +76,7 @@ public void TestBoolParam()
public void TestStrings() public void TestStrings()
{ {
connection.ExecuteMapperQuery<string>(@"select 'a' a union select 'b'") connection.ExecuteMapperQuery<string>(@"select 'a' a union select 'b'")
.IsSequenceEqual(new[] { "a", "b" }); .IsSequenceEqualTo(new[] { "a", "b" });
} }
public class Dog public class Dog
...@@ -95,13 +95,13 @@ public void TestStrongType() ...@@ -95,13 +95,13 @@ public void TestStrongType()
var dog = connection.ExecuteMapperQuery<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid }); var dog = connection.ExecuteMapperQuery<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
dog.Count() dog.Count()
.IsEquals(1); .IsEqualTo(1);
dog.First().Age dog.First().Age
.IsNull(); .IsNull();
dog.First().Id dog.First().Id
.IsEquals(guid); .IsEqualTo(guid);
} }
public void TestExpando() public void TestExpando()
...@@ -109,22 +109,22 @@ public void TestExpando() ...@@ -109,22 +109,22 @@ public void TestExpando()
var rows = connection.ExecuteMapperQuery("select 1 A, 2 B union all select 3, 4"); var rows = connection.ExecuteMapperQuery("select 1 A, 2 B union all select 3, 4");
((int)rows[0].A) ((int)rows[0].A)
.IsEquals(1); .IsEqualTo(1);
((int)rows[0].B) ((int)rows[0].B)
.IsEquals(2); .IsEqualTo(2);
((int)rows[1].A) ((int)rows[1].A)
.IsEquals(3); .IsEqualTo(3);
((int)rows[1].B) ((int)rows[1].B)
.IsEquals(4); .IsEqualTo(4);
} }
public void TestStringList() public void TestStringList()
{ {
connection.ExecuteMapperQuery<string>("select * from (select 'a' as x union all select 'b' union all select 'c') as T where x in @strings", new {strings = new[] {"a","b","c"}}) connection.ExecuteMapperQuery<string>("select * from (select 'a' as x union all select 'b' union all select 'c') as T where x in @strings", new {strings = new[] {"a","b","c"}})
.IsSequenceEqual(new[] {"a","b","c"}); .IsSequenceEqualTo(new[] {"a","b","c"});
} }
public void TestExecuteCommand() public void TestExecuteCommand()
...@@ -136,14 +136,14 @@ public void TestExecuteCommand() ...@@ -136,14 +136,14 @@ public void TestExecuteCommand()
insert #t insert #t
select @a a union all select @b select @a a union all select @b
set nocount on set nocount on
drop table #t", new {a=1, b=2 }).IsEquals(2); drop table #t", new {a=1, b=2 }).IsEqualTo(2);
} }
public void TestMassiveStrings() public void TestMassiveStrings()
{ {
var str = new string('X', 20000); var str = new string('X', 20000);
connection.ExecuteMapperQuery<string>("select @a", new { a = str }).First() connection.ExecuteMapperQuery<string>("select @a", new { a = str }).First()
.IsEquals(str); .IsEqualTo(str);
} }
} }
......
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