From: <aye...@us...> - 2010-01-27 14:38:49
|
Revision: 4935 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4935&view=rev Author: ayenderahien Date: 2010-01-27 14:38:34 +0000 (Wed, 27 Jan 2010) Log Message: ----------- Fixing NH-2084 - multiple future queries using same parameter name. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2010-01-27 14:00:14 UTC (rev 4934) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2010-01-27 14:38:34 UTC (rev 4935) @@ -38,10 +38,8 @@ private readonly Dialect.Dialect dialect; private bool forceCacheRefresh; private QueryParameters combinedParameters; - private readonly List<string> namedParametersThatAreSafeToDuplicate = new List<string>(); private FlushMode flushMode = FlushMode.Unspecified; private FlushMode sessionFlushMode = FlushMode.Unspecified; - private static readonly Regex parseParameterListOrignialName = new Regex(@"(?<orgname>.*?)_\d+_", RegexOptions.Compiled); public MultiQueryImpl(ISessionImplementor session) { @@ -75,7 +73,6 @@ public IMultiQuery SetParameter(string name, object val, IType type) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetParameter(name, val, type); @@ -85,7 +82,6 @@ public IMultiQuery SetParameter(string name, object val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetParameter(name, val); @@ -95,7 +91,6 @@ public IMultiQuery SetParameterList(string name, ICollection vals, IType type) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetParameterList(name, vals, type); @@ -105,7 +100,6 @@ public IMultiQuery SetParameterList(string name, ICollection vals) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetParameterList(name, vals); @@ -115,7 +109,6 @@ public IMultiQuery SetAnsiString(string name, string val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetAnsiString(name, val); @@ -125,7 +118,6 @@ public IMultiQuery SetBinary(string name, byte[] val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetBinary(name, val); @@ -135,7 +127,6 @@ public IMultiQuery SetBoolean(string name, bool val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetBoolean(name, val); @@ -145,7 +136,6 @@ public IMultiQuery SetByte(string name, byte val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetByte(name, val); @@ -155,7 +145,6 @@ public IMultiQuery SetCharacter(string name, char val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetCharacter(name, val); @@ -165,7 +154,6 @@ public IMultiQuery SetDateTime(string name, DateTime val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetDateTime(name, val); @@ -175,7 +163,6 @@ public IMultiQuery SetDecimal(string name, decimal val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetDecimal(name, val); @@ -185,7 +172,6 @@ public IMultiQuery SetDouble(string name, double val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetDouble(name, val); @@ -195,7 +181,6 @@ public IMultiQuery SetEntity(string name, object val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetEntity(name, val); @@ -205,7 +190,6 @@ public IMultiQuery SetEnum(string name, Enum val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetEnum(name, val); @@ -215,7 +199,6 @@ public IMultiQuery SetInt16(string name, short val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetInt16(name, val); @@ -225,7 +208,6 @@ public IMultiQuery SetInt32(string name, int val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetInt32(name, val); @@ -235,7 +217,6 @@ public IMultiQuery SetInt64(string name, long val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetInt64(name, val); @@ -245,7 +226,6 @@ public IMultiQuery SetSingle(string name, float val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetSingle(name, val); @@ -255,7 +235,6 @@ public IMultiQuery SetString(string name, string val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetString(name, val); @@ -265,7 +244,6 @@ public IMultiQuery SetGuid(string name, Guid val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetGuid(name, val); @@ -275,7 +253,6 @@ public IMultiQuery SetTime(string name, DateTime val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetTime(name, val); @@ -285,7 +262,6 @@ public IMultiQuery SetTimestamp(string name, DateTime val) { - namedParametersThatAreSafeToDuplicate.Add(name); foreach (IQuery query in queries) { query.SetTimestamp(name, val); @@ -797,9 +773,14 @@ combinedQueryParameters.NamedParameters = new Dictionary<string, TypedValue>(); ArrayList positionalParameterTypes = new ArrayList(); ArrayList positionalParameterValues = new ArrayList(); + int index = 0; foreach (QueryParameters queryParameters in Parameters) { - CopyNamedParametersDictionary(combinedQueryParameters.NamedParameters, queryParameters.NamedParameters); + foreach (KeyValuePair<string, TypedValue> dictionaryEntry in queryParameters.NamedParameters) + { + combinedQueryParameters.NamedParameters.Add(dictionaryEntry.Key + index, dictionaryEntry.Value); + } + index += 1; positionalParameterTypes.AddRange(queryParameters.PositionalParameterTypes); positionalParameterValues.AddRange(queryParameters.PositionalParameterValues); } @@ -818,37 +799,6 @@ } } - private void CopyNamedParametersDictionary(IDictionary<string, TypedValue> dest, IDictionary<string, TypedValue> src) - { - foreach (KeyValuePair<string, TypedValue> dictionaryEntry in src) - { - if (dest.ContainsKey(dictionaryEntry.Key)) - { - if (IsParameterSafeToDuplicate(dictionaryEntry.Key)) - continue; //we specify it for all the queries, so it is okay. - - throw new QueryException( - string.Format( - "The named parameter {0} was used in more than one query. Either give unique names to your parameters, or use the multi query SetParameter() methods to set the named parameter", - dictionaryEntry.Key)); - } - dest.Add(dictionaryEntry.Key, dictionaryEntry.Value); - } - } - - private bool IsParameterSafeToDuplicate(string name) - { - if (namedParametersThatAreSafeToDuplicate.Contains(name)) - return true; - Match match = parseParameterListOrignialName.Match(name); - if (match != null) - { - string originalName = match.Groups["orgname"].Value; - return namedParametersThatAreSafeToDuplicate.Contains(originalName); - } - return false; - } - private void ThrowIfKeyAlreadyExists(string key) { if (criteriaResultPositions.ContainsKey(key)) Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2010-01-27 14:00:14 UTC (rev 4934) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2010-01-27 14:38:34 UTC (rev 4935) @@ -94,5 +94,37 @@ } } } + + [Test] + public void CanExecuteMultipleQueryWithSameParameterName() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var meContainer = s.CreateQuery("from Person p where p.Id = :personId") + .SetParameter("personId", 1) + .FutureValue<Person>(); + + var possiblefriends = s.CreateQuery("from Person p where p.Id != :personId") + .SetParameter("personId", 2) + .Future<Person>(); + + using (var logSpy = new SqlLogSpy()) + { + var me = meContainer.Value; + + foreach (var person in possiblefriends) + { + } + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + var wholeLog = logSpy.GetWholeLog(); + Assert.True(wholeLog.Contains("@p0 = 1 [Type: Int32 (0)], @p1 = 2 [Type: Int32 (0)]")); + } + } + + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |