|
From: <ric...@us...> - 2010-07-28 20:57:52
|
Revision: 5073
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5073&view=rev
Author: ricbrown
Date: 2010-07-28 20:57:45 +0000 (Wed, 28 Jul 2010)
Log Message:
-----------
Fix NH-2257 (Parameter ordering not working when driver does not support Named Parameters)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs
trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs
trunk/nhibernate/src/NHibernate/Driver/IDriver.cs
trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs
trunk/nhibernate/src/NHibernate/Loader/Loader.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml
Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2010-07-28 20:44:14 UTC (rev 5072)
+++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2010-07-28 20:57:45 UTC (rev 5073)
@@ -222,6 +222,11 @@
}
}
+ public void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString)
+ {
+ Driver.ExpandQueryParameters(cmd, sqlString);
+ }
+
public IDataReader ExecuteReader(IDbCommand cmd)
{
CheckReaders();
Modified: trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2010-07-28 20:44:14 UTC (rev 5072)
+++ trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2010-07-28 20:57:45 UTC (rev 5073)
@@ -208,6 +208,36 @@
return dbParam;
}
+ public virtual void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString)
+ {
+ if (UseNamedPrefixInSql)
+ return; // named parameters are ok
+
+ var expandedParameters = new List<IDbDataParameter>();
+ foreach (object part in sqlString.Parts)
+ {
+ if (part is Parameter)
+ {
+ var parameter = (Parameter)part;
+ var originalParameter = (IDbDataParameter)cmd.Parameters[parameter.ParameterPosition.Value];
+ expandedParameters.Add(CloneParameter(cmd, originalParameter));
+ }
+ }
+
+ cmd.Parameters.Clear();
+ foreach (var parameter in expandedParameters)
+ cmd.Parameters.Add(parameter);
+ }
+
+ protected virtual IDbDataParameter CloneParameter(IDbCommand cmd, IDbDataParameter originalParameter)
+ {
+ var clone = cmd.CreateParameter();
+ clone.DbType = originalParameter.DbType;
+ clone.ParameterName = originalParameter.ParameterName;
+ clone.Value = originalParameter.Value;
+ return clone;
+ }
+
public void PrepareCommand(IDbCommand command)
{
OnBeforePrepare(command);
Modified: trunk/nhibernate/src/NHibernate/Driver/IDriver.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2010-07-28 20:44:14 UTC (rev 5072)
+++ trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2010-07-28 20:57:45 UTC (rev 5073)
@@ -95,5 +95,16 @@
/// <param name="sqlType">The SqlType to set for IDbDataParameter.</param>
/// <returns>An IDbDataParameter ready to be added to an IDbCommand.</returns>
IDbDataParameter GenerateParameter(IDbCommand command, string name, SqlType sqlType);
+
+ /// <summary>
+ /// Expand the parameters of the cmd to have a single parameter for each parameter in the
+ /// sql string
+ /// </summary>
+ /// <remarks>
+ /// This is for databases that do not support named parameters. So, instead of a single parameter
+ /// for 'select ... from MyTable t where t.Col1 = @p0 and t.Col2 = @p0' we can issue
+ /// 'select ... from MyTable t where t.Col1 = ? and t.Col2 = ?'
+ /// </remarks>
+ void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString);
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs 2010-07-28 20:44:14 UTC (rev 5072)
+++ trunk/nhibernate/src/NHibernate/Engine/IBatcher.cs 2010-07-28 20:57:45 UTC (rev 5073)
@@ -132,6 +132,17 @@
int ExecuteNonQuery(IDbCommand cmd);
/// <summary>
+ /// Expand the parameters of the cmd to have a single parameter for each parameter in the
+ /// sql string
+ /// </summary>
+ /// <remarks>
+ /// This is for databases that do not support named parameters. So, instead of a single parameter
+ /// for 'select ... from MyTable t where t.Col1 = @p0 and t.Col2 = @p0' we can issue
+ /// 'select ... from MyTable t where t.Col1 = ? and t.Col2 = ?'
+ /// </remarks>
+ void ExpandQueryParameters(IDbCommand cmd, SqlString sqlString);
+
+ /// <summary>
/// Must be called when an exception occurs.
/// </summary>
/// <param name="e"></param>
Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2010-07-28 20:44:14 UTC (rev 5072)
+++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2010-07-28 20:57:45 UTC (rev 5073)
@@ -1148,6 +1148,8 @@
BindLimitParameters(command, colIndex, selection, session);
}
+ session.Batcher.ExpandQueryParameters(command, sqlString);
+
if (!useLimit)
{
SetMaxRows(command, selection);
Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257
___________________________________________________________________
Added: bugtraq:url
+ http://jira.nhibernate.org/browse/%BUGID%
Added: bugtraq:logregex
+ NH-\d+
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Domain.cs 2010-07-28 20:57:45 UTC (rev 5073)
@@ -0,0 +1,11 @@
+using System;
+
+namespace NHibernate.Test.NHSpecificTest.NH2257
+{
+ public class Foo
+ {
+ public virtual int Id { get; set; }
+ public virtual string Name { get; set; }
+ public virtual int Ord { get; set; }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Fixture.cs 2010-07-28 20:57:45 UTC (rev 5073)
@@ -0,0 +1,30 @@
+using System.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.NH2257
+{
+ public class Fixture : BugTestCase
+ {
+ protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect)
+ {
+ return (dialect is NHibernate.Dialect.InformixDialect1000);
+ }
+
+ [Test]
+ public void InformixUsingDuplicateParameters()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ session.Save(new Foo() { Name = "aa" });
+
+ var list =
+ session.CreateQuery("from Foo f where f.Name = :p1 and not f.Name <> :p1")
+ .SetParameter("p1", "aa")
+ .List<Foo>();
+
+ Assert.That(list.Count, Is.EqualTo(1));
+ }
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2257/Mappings.hbm.xml 2010-07-28 20:57:45 UTC (rev 5073)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.NHSpecificTest.NH2257">
+
+ <class name="Foo">
+ <id name="Id">
+ <generator class="hilo" />
+ </id>
+ <property name="Name"/>
+ <property name="Ord"/>
+ </class>
+</hibernate-mapping>
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-07-28 20:44:14 UTC (rev 5072)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-07-28 20:57:45 UTC (rev 5073)
@@ -774,6 +774,8 @@
<Compile Include="NHSpecificTest\NH2243\Person.cs" />
<Compile Include="NHSpecificTest\NH2251\Domain.cs" />
<Compile Include="NHSpecificTest\NH2251\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2257\Domain.cs" />
+ <Compile Include="NHSpecificTest\NH2257\Fixture.cs" />
<Compile Include="NHSpecificTest\NH473\Child.cs" />
<Compile Include="NHSpecificTest\NH473\Fixture.cs" />
<Compile Include="NHSpecificTest\NH473\Parent.cs" />
@@ -2215,6 +2217,7 @@
<EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" />
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="NHSpecificTest\NH2257\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2208\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2251\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2041\Mappings.hbm.xml" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|