Commit 95f5f9a2 authored by Marc Gravell's avatar Marc Gravell

re-use StringBuilder instances when possible

parent d9f2801f
......@@ -2364,7 +2364,7 @@ public bool TryGetValue(string name, out object value)
public override string ToString()
{
var sb = new StringBuilder("{DapperRow");
var sb = GetStringBuilder().Append("{DapperRow");
foreach (var kv in this)
{
var value = kv.Value;
......@@ -2379,7 +2379,7 @@ public override string ToString()
}
}
return sb.Append('}').ToString();
return sb.Append('}').__ToStringRecycle();
}
System.Dynamic.DynamicMetaObject System.Dynamic.IDynamicMetaObjectProvider.GetMetaObject(
......@@ -2752,21 +2752,21 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj
// looks like an optimize hint; expand it
var suffix = match.Groups[2].Value;
var sb = new StringBuilder(variableName).Append(1).Append(suffix);
var sb = GetStringBuilder().Append(variableName).Append(1).Append(suffix);
for (int i = 2; i <= count; i++)
{
sb.Append(',').Append(variableName).Append(i).Append(suffix);
}
return sb.ToString();
return sb.__ToStringRecycle();
}
else
{
var sb = new StringBuilder("(").Append(variableName).Append(1);
var sb = GetStringBuilder().Append('(').Append(variableName).Append(1);
for (int i = 2; i <= count; i++)
{
sb.Append(',').Append(variableName).Append(i);
}
return sb.Append(')').ToString();
return sb.Append(')').__ToStringRecycle();
}
});
}
......@@ -2862,12 +2862,20 @@ public static string Format(object value)
var multiExec = GetMultiExec(value);
if(multiExec != null)
{
var sb = new StringBuilder();
StringBuilder sb = null;
bool first = true;
foreach (object subval in multiExec)
{
sb.Append(first ? '(' : ',').Append(Format(subval));
first = false;
if(first)
{
sb = GetStringBuilder().Append('(');
first = false;
}
else
{
sb.Append(',');
}
sb.Append(Format(subval));
}
if(first)
{
......@@ -2875,7 +2883,7 @@ public static string Format(object value)
}
else
{
return sb.Append(')').ToString();
return sb.Append(')').__ToStringRecycle();
}
}
throw new NotSupportedException(value.GetType().Name);
......@@ -4327,6 +4335,33 @@ public static string GetTypeName(this DataTable table)
{
return table == null ? null : table.ExtendedProperties[DataTableTypeNameKey] as string;
}
// one per thread
[ThreadStatic]
private static StringBuilder perThreadStringBuilderCache;
private static StringBuilder GetStringBuilder()
{
var tmp = perThreadStringBuilderCache;
if (tmp != null)
{
perThreadStringBuilderCache = null;
tmp.Length = 0;
return tmp;
}
return new StringBuilder();
}
private static string __ToStringRecycle(this StringBuilder obj)
{
if (obj == null) return "";
var s = obj.ToString();
if(perThreadStringBuilderCache == null)
{
perThreadStringBuilderCache = obj;
}
return s;
}
}
/// <summary>
......
......@@ -3178,7 +3178,23 @@ public void DataTableParameters()
ex.Message.Equals("The table type parameter 'ids' must have a valid type name.");
}
}
public void SO26468710_InWithTVPs()
{
// this is just to make it re-runnable; normally you only do this once
try { connection.Execute("drop type MyIdList"); } catch { }
connection.Execute("create type MyIdList as table(id int);");
DataTable ids = new DataTable {
Columns = {{"id", typeof(int)}},
Rows = {{1},{3},{5}}
};
ids.SetTypeName("MyIdList");
int sum = connection.Query<int>(@"
declare @tmp table(id int not null);
insert @tmp (id) values(1), (2), (3), (4), (5), (6), (7);
select * from @tmp t inner join @ids i on i.id = t.id", new { ids }).Sum();
sum.IsEqualTo(9);
}
public void DataTableParametersWithExtendedProperty()
{
try { connection.Execute("drop proc #DataTableParameters"); } catch { }
......
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