Commit 34e1ae8f authored by mgravell's avatar mgravell

help avoid thread race init on multi-map

parent effaff00
...@@ -486,7 +486,7 @@ class DontMap { } ...@@ -486,7 +486,7 @@ class DontMap { }
static IEnumerable<TReturn> MultiMapImpl<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(this IDbConnection cnn, string sql, object map, object param, IDbTransaction transaction, string splitOn, int? commandTimeout, CommandType? commandType, IDataReader reader, Identity identity) static IEnumerable<TReturn> MultiMapImpl<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>(this IDbConnection cnn, string sql, object map, object param, IDbTransaction transaction, string splitOn, int? commandTimeout, CommandType? commandType, IDataReader reader, Identity identity)
{ {
identity = identity ?? new Identity(sql, cnn, typeof(TFirst), (object)param == null ? null : ((object)param).GetType(), new[] { typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth) }); identity = identity ?? new Identity(sql, cnn, typeof(TFirst), (object)param == null ? null : ((object)param).GetType(), new[] { typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth) });
CacheInfo info = GetCacheInfo(identity); CacheInfo cinfo = GetCacheInfo(identity);
IDbCommand ownedCommand = null; IDbCommand ownedCommand = null;
IDataReader ownedReader = null; IDataReader ownedReader = null;
...@@ -495,12 +495,13 @@ class DontMap { } ...@@ -495,12 +495,13 @@ class DontMap { }
{ {
if (reader == null) if (reader == null)
{ {
ownedCommand = SetupCommand(cnn, transaction, sql, info.ParamReader, (object)param, commandTimeout, commandType); ownedCommand = SetupCommand(cnn, transaction, sql, cinfo.ParamReader, (object)param, commandTimeout, commandType);
ownedReader = ownedCommand.ExecuteReader(); ownedReader = ownedCommand.ExecuteReader();
reader = ownedReader; reader = ownedReader;
} }
object deserializer;
if (info.Deserializer == null) object[] otherDeserializers;
if ((deserializer = cinfo.Deserializer) == null || (otherDeserializers = cinfo.OtherDeserializers) == null)
{ {
int current = 0; int current = 0;
...@@ -530,7 +531,7 @@ class DontMap { } ...@@ -530,7 +531,7 @@ class DontMap { }
var otherDeserializer = new List<object>(); var otherDeserializer = new List<object>();
int split = nextSplit(); int split = nextSplit();
info.Deserializer = GetDeserializer<TFirst>(reader, 0, split, false); deserializer = cinfo.Deserializer = GetDeserializer<TFirst>(reader, 0, split, false);
if (typeof(TSecond) != typeof(DontMap)) if (typeof(TSecond) != typeof(DontMap))
{ {
...@@ -556,45 +557,45 @@ class DontMap { } ...@@ -556,45 +557,45 @@ class DontMap { }
otherDeserializer.Add(GetDeserializer<TFifth>(reader, split, next - split, true)); otherDeserializer.Add(GetDeserializer<TFifth>(reader, split, next - split, true));
} }
info.OtherDeserializers = otherDeserializer.ToArray(); otherDeserializers = cinfo.OtherDeserializers = otherDeserializer.ToArray();
SetQueryCache(identity, info); SetQueryCache(identity, cinfo);
} }
var deserializer = (Func<IDataReader, TFirst>)info.Deserializer; var rootDeserializer = (Func<IDataReader, TFirst>)deserializer;
var deserializer2 = (Func<IDataReader, TSecond>)info.OtherDeserializers[0]; var deserializer2 = (Func<IDataReader, TSecond>)otherDeserializers[0];
Func<IDataReader, TReturn> mapIt = null; Func<IDataReader, TReturn> mapIt = null;
if (info.OtherDeserializers.Length == 1) if (otherDeserializers.Length == 1)
{ {
mapIt = r => ((Func<TFirst, TSecond, TReturn>)map)(deserializer(r), deserializer2(r)); mapIt = r => ((Func<TFirst, TSecond, TReturn>)map)(rootDeserializer(r), deserializer2(r));
} }
if (info.OtherDeserializers.Length > 1) if (otherDeserializers.Length > 1)
{ {
var deserializer3 = (Func<IDataReader, TThird>)info.OtherDeserializers[1]; var deserializer3 = (Func<IDataReader, TThird>)otherDeserializers[1];
if (info.OtherDeserializers.Length == 2) if (otherDeserializers.Length == 2)
{ {
mapIt = r => ((Func<TFirst, TSecond, TThird, TReturn>)map)(deserializer(r), deserializer2(r), deserializer3(r)); mapIt = r => ((Func<TFirst, TSecond, TThird, TReturn>)map)(rootDeserializer(r), deserializer2(r), deserializer3(r));
} }
if (info.OtherDeserializers.Length > 2) if (otherDeserializers.Length > 2)
{ {
var deserializer4 = (Func<IDataReader, TFourth>)info.OtherDeserializers[2]; var deserializer4 = (Func<IDataReader, TFourth>)otherDeserializers[2];
if (info.OtherDeserializers.Length == 3) if (otherDeserializers.Length == 3)
{ {
mapIt = r => ((Func<TFirst, TSecond, TThird, TFourth, TReturn>)map)(deserializer(r), deserializer2(r), deserializer3(r), deserializer4(r)); mapIt = r => ((Func<TFirst, TSecond, TThird, TFourth, TReturn>)map)(rootDeserializer(r), deserializer2(r), deserializer3(r), deserializer4(r));
} }
if (info.OtherDeserializers.Length > 3) if (otherDeserializers.Length > 3)
{ {
#if CSHARP30 #if CSHARP30
throw new NotSupportedException(); throw new NotSupportedException();
#else #else
var deserializer5 = (Func<IDataReader, TFifth>)info.OtherDeserializers[3]; var deserializer5 = (Func<IDataReader, TFifth>)otherDeserializers[3];
mapIt = r => ((Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>)map)(deserializer(r), deserializer2(r), deserializer3(r), deserializer4(r), deserializer5(r)); mapIt = r => ((Func<TFirst, TSecond, TThird, TFourth, TFifth, TReturn>)map)(rootDeserializer(r), deserializer2(r), deserializer3(r), deserializer4(r), deserializer5(r));
#endif #endif
} }
} }
......
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