From: <fab...@us...> - 2009-10-18 18:08:22
|
Revision: 4783 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4783&view=rev Author: fabiomaulo Date: 2009-10-18 18:08:11 +0000 (Sun, 18 Oct 2009) Log Message: ----------- Fix NH-1785 Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Domain.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Fixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Mappings.hbm.xml Modified: branches/2.1.x/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs 2009-10-18 16:13:35 UTC (rev 4782) +++ branches/2.1.x/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs 2009-10-18 18:08:11 UTC (rev 4783) @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using Iesi.Collections.Generic; using log4net; @@ -58,22 +57,21 @@ userAliases = ArrayHelper.ToStringArray(userAliasList); } - protected override void InitAll(SqlString whereString, SqlString orderByString, LockMode lockMode) + protected override void WalkEntityTree(IOuterJoinLoadable persister, string alias, string path, int currentDepth) { - // NH different behavior (NH-1760) - WalkCompositeComponentIdTree(); - base.InitAll(whereString, orderByString, lockMode); + // NH different behavior (NH-1476, NH-1760, NH-1785) + base.WalkEntityTree(persister, alias, path, currentDepth); + WalkCompositeComponentIdTree(persister, alias, path); } - private void WalkCompositeComponentIdTree() + private void WalkCompositeComponentIdTree(IOuterJoinLoadable persister, string alias, string path) { - IType type = Persister.IdentifierType; - string propertyName = Persister.IdentifierPropertyName; + IType type = persister.IdentifierType; + string propertyName = persister.IdentifierPropertyName; if (type != null && type.IsComponentType && !(type is EmbeddedComponentType)) { - ILhsAssociationTypeSqlInfo associationTypeSQLInfo = JoinHelper.GetIdLhsSqlInfo(Alias, Persister, Factory); - WalkComponentTree((IAbstractComponentType) type, 0, Alias, SubPath(string.Empty, propertyName), 0, - associationTypeSQLInfo); + ILhsAssociationTypeSqlInfo associationTypeSQLInfo = JoinHelper.GetIdLhsSqlInfo(alias, persister, Factory); + WalkComponentTree((IAbstractComponentType)type, 0, alias, SubPath(path, propertyName), 0, associationTypeSQLInfo); } } Modified: branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-10-18 16:13:35 UTC (rev 4782) +++ branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-10-18 18:08:11 UTC (rev 4783) @@ -237,7 +237,7 @@ /// For an entity class, add to a list of associations to be fetched /// by outerjoin /// </summary> - private void WalkEntityTree(IOuterJoinLoadable persister, string alias, string path, int currentDepth) + protected virtual void WalkEntityTree(IOuterJoinLoadable persister, string alias, string path, int currentDepth) { int n = persister.CountSubclassProperties(); for (int i = 0; i < n; i++) Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Domain.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Domain.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Domain.cs 2009-10-18 18:08:11 UTC (rev 4783) @@ -0,0 +1,59 @@ +using System; +using Iesi.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1785 +{ + public class Entity1 + { + public virtual Guid Id { get; set; } + public virtual ISet<Entity2> Entities2 { get; set; } + } + + public class Entity2Id + { + public virtual Entity1 Entity1 { get; set; } + public virtual Entity3 Entity3 { get; set; } + + public bool Equals(Entity2Id other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + if (ReferenceEquals(this, other)) + { + return true; + } + return Equals(other.Entity1, Entity1) && Equals(other.Entity3, Entity3); + } + + public override bool Equals(object obj) + { + return Equals(obj as Entity2Id); + } + + public override int GetHashCode() + { + unchecked + { + return ((Entity1 != null ? Entity1.GetHashCode() : 0) * 397) ^ (Entity3 != null ? Entity3.GetHashCode() : 0); + } + } + } + + public class Entity2 + { + public virtual Entity2Id Id { get; set; } + } + + public class Entity3 + { + public virtual Guid Id { get; set; } + public virtual Entity4 Entity4 { get; set; } + } + + public class Entity4 + { + public virtual Guid Id { get; set; } + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Fixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Fixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Fixture.cs 2009-10-18 18:08:11 UTC (rev 4783) @@ -0,0 +1,43 @@ +using System; +using NHibernate.Criterion; +using NHibernate.SqlCommand; +using NUnit.Framework; +using System.Text.RegularExpressions; + +namespace NHibernate.Test.NHSpecificTest.NH1785 +{ + [TestFixture] + public class Fixture : BugTestCase + { + [Test] + public void Bug() + { + using (var session = OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof (Entity1)); + criteria.CreateAlias("Entities2", "ent2", JoinType.InnerJoin); + criteria.CreateAlias("ent2.Id.Entity3", "ent3", JoinType.InnerJoin); + criteria.CreateAlias("ent3.Entity4", "ent4", JoinType.InnerJoin); + criteria.Add(Restrictions.Eq("ent4.Id", Guid.NewGuid())); + Assert.DoesNotThrow(() => criteria.List<Entity1>()); + } + } + + [Test] + public void ShouldNotContainJoinWhereNotRequired() + { + using (var session = OpenSession()) + { + using (var ls = new SqlLogSpy()) + { + ICriteria criteria = session.CreateCriteria(typeof(Entity1)); + criteria.CreateAlias("Entities2", "ent2", JoinType.InnerJoin); + criteria.List<Entity1>(); + var sql = ls.GetWholeLog(); + var rx = new Regex(@"\bjoin\b"); + Assert.That(rx.Matches(sql).Count, Is.EqualTo(1)); + } + } + } + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Mappings.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1785/Mappings.hbm.xml 2009-10-18 18:08:11 UTC (rev 4783) @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1785"> + + <class name="Entity1" table="Entity1"> + <id name="Id" type="Guid" column="id"> + <generator class="guid" /> + </id> + <set name="Entities2" lazy="true" inverse="true" table="Entity2"> + <key column="id"> + </key> + <one-to-many class="Entity2"/> + </set> + </class> + + <class name="Entity2" table="Entity2"> + <composite-id class="Entity2Id" name="Id"> + <key-many-to-one name="Entity1" class="Entity1" column="id1" /> + <key-many-to-one name="Entity3" class="Entity3" column="id3" /> + </composite-id> + </class> + + <class name="Entity3" table="Entity3"> + <id name="Id" type="Guid" column="id"> + <generator class="guid" /> + </id> + <many-to-one name="Entity4" class="Entity4" column="entity4_id" /> + </class> + + <class name="Entity4" table="Entity4"> + <id name="Id" type="Guid" column="id"> + <generator class="guid" /> + </id> + </class> +</hibernate-mapping> \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-18 16:13:35 UTC (rev 4782) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-18 18:08:11 UTC (rev 4783) @@ -370,6 +370,8 @@ <Compile Include="NHSpecificTest\NH1025\Model.cs" /> <Compile Include="NHSpecificTest\NH1255\Domain.cs" /> <Compile Include="NHSpecificTest\NH1255\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1785\Domain.cs" /> + <Compile Include="NHSpecificTest\NH1785\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1895\DomainClasses.cs" /> <Compile Include="NHSpecificTest\NH1895\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH1905\Fixture.cs" /> @@ -2009,6 +2011,7 @@ <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1785\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1255\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1895\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1025\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-10-18 19:16:31
|
Revision: 4787 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4787&view=rev Author: fabiomaulo Date: 2009-10-18 19:16:19 +0000 (Sun, 18 Oct 2009) Log Message: ----------- Fixed NH-1858 with 'Not supported exception.' Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs branches/2.1.x/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2009-10-18 18:34:12 UTC (rev 4786) +++ branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2009-10-18 19:16:19 UTC (rev 4787) @@ -352,7 +352,7 @@ { return 6; } - return 0; + throw new NotSupportedException("The query should start with 'SELECT' or 'SELECT DISTINCT'"); } private bool NeedsLockHint(LockMode lockMode) Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2009-10-18 18:34:12 UTC (rev 4786) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2009-10-18 19:16:19 UTC (rev 4787) @@ -1,3 +1,4 @@ +using System; using NHibernate.Dialect; using NHibernate.Mapping; using NHibernate.SqlCommand; @@ -184,5 +185,12 @@ System.Console.WriteLine(ifExistsDropConstraint); Assert.AreEqual(expected, ifExistsDropConstraint); } + + [Test] + public void GetLimitStringWithSqlComments() + { + var d = new MsSql2005Dialect(); + Assert.Throws<NotSupportedException>(()=> d.GetLimitString(new SqlString(" /* criteria query */ SELECT p from lcdtm"), 0, 2)); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2009-10-26 11:01:36
|
Revision: 4801 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4801&view=rev Author: ricbrown Date: 2009-10-26 11:01:27 +0000 (Mon, 26 Oct 2009) Log Message: ----------- Fix NH-847, Stored Procedures support with OracleDataClient Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -136,6 +136,11 @@ return cmd; } + public virtual int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue) + { + throw new NotImplementedException(GetType().Name + " does not support resultsets via stored procedures"); + } + private void SetCommandTimeout(IDbCommand cmd, object envTimeout) { if (commandTimeout >= 0) Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -80,6 +80,17 @@ IDbCommand GenerateCommand(CommandType type, SqlString sqlString, SqlType[] parameterTypes); /// <summary> + /// Registers an OUT parameter which will be returing a + /// <see cref="IDataReader"/>. How this is accomplished varies greatly + /// from DB to DB, hence its inclusion here. + /// </summary> + /// <param name="command">The <see cref="IDbCommand"/> with CommandType.StoredProcedure.</param> + /// <param name="position">The bind position at which to register the OUT param.</param> + /// <param name="hasReturnValue">Whether the out parameter is a return value, or an out parameter.</param> + /// <returns>The number of (contiguous) bind positions used.</returns> + int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue); + + /// <summary> /// Prepare the <paramref name="command" /> by calling <see cref="IDbCommand.Prepare()" />. /// May be a no-op if the driver does not support preparing commands, or for any other reason. /// </summary> Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -47,5 +47,12 @@ base.InitializeParameter(dbParam, name, sqlType); } } + + public override int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue) + { + throw new System.NotImplementedException(GetType().Name + + " does not support resultsets via stored procedures." + + " Consider using OracleDataClientDriver instead."); + } } } \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -1,6 +1,8 @@ using System.Data; +using System.Reflection; using NHibernate.AdoNet; using NHibernate.SqlTypes; +using NHibernate.Util; namespace NHibernate.Driver { @@ -14,7 +16,13 @@ /// </remarks> public class OracleDataClientDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider { + private const string driverAssemblyName = "Oracle.DataAccess"; + private const string connectionTypeName = "Oracle.DataAccess.Client.OracleConnection"; + private const string commandTypeName = "Oracle.DataAccess.Client.OracleCommand"; private static readonly SqlType GuidSqlType = new SqlType(DbType.Binary, 16); + private readonly PropertyInfo oracleDbType; + private readonly object oracleDbTypeRefCursor; + /// <summary> /// Initializes a new instance of <see cref="OracleDataClientDriver"/>. /// </summary> @@ -23,10 +31,15 @@ /// </exception> public OracleDataClientDriver() : base( - "Oracle.DataAccess", - "Oracle.DataAccess.Client.OracleConnection", - "Oracle.DataAccess.Client.OracleCommand") + driverAssemblyName, + connectionTypeName, + commandTypeName) { + System.Type parameterType = ReflectHelper.TypeFromAssembly("Oracle.DataAccess.Client.OracleParameter", driverAssemblyName, false); + oracleDbType = parameterType.GetProperty("OracleDbType"); + + System.Type oracleDbTypeEnum = ReflectHelper.TypeFromAssembly("Oracle.DataAccess.Client.OracleDbType", driverAssemblyName, false); + oracleDbTypeRefCursor = System.Enum.Parse(oracleDbTypeEnum, "RefCursor"); } /// <summary></summary> @@ -69,6 +82,19 @@ } } + public override int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue) + { + IDbDataParameter outCursor = command.CreateParameter(); + outCursor.ParameterName = ""; + oracleDbType.SetValue(outCursor, oracleDbTypeRefCursor, null); + + outCursor.Direction = hasReturnValue ? ParameterDirection.ReturnValue : ParameterDirection.Output; + + command.Parameters.Insert(position, outCursor); + + return 1; + } + #region IEmbeddedBatcherFactoryProvider Members System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass Added: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -0,0 +1,33 @@ +using System; +using System.Text.RegularExpressions; +using NHibernate.Hql.Classic; +using NHibernate.Util; +using NHibernate.SqlCommand; + +namespace NHibernate.Engine.Query +{ + public static class CallableParser + { + private static readonly Regex functionNameFinder = new Regex(@"\{[\S\s]*call[\s]+([\w]+)[^\w]"); + private static readonly int NewLineLength = Environment.NewLine.Length; + + public static SqlString Parse(string sqlString) + { + bool isCallableSyntax = sqlString.IndexOf("{") == 0 && + sqlString.IndexOf("}") == (sqlString.Length - 1) && + sqlString.IndexOf("call") > 0; + + if (!isCallableSyntax) + throw new ParserException("Expected callable syntax {? = call procedure_name[(?, ?, ...)]} but got: " + sqlString); + + + Match functionMatch = functionNameFinder.Match(sqlString); + + if ((!functionMatch.Success) || (functionMatch.Groups.Count < 2)) + throw new HibernateException("Could not determine function name for callable SQL: " + sqlString); + + string function = functionMatch.Groups[1].Value; + return new SqlString(function); + } + } +} \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -13,6 +13,8 @@ private readonly List<int> ordinalParameterLocationList = new List<int>(); + private bool hasReturnValue = false; + /// <summary> /// Convenience method for creating a param location recognizer and /// initiating the parse. @@ -47,11 +49,16 @@ get { return ordinalParameterLocationList; } } + public bool HasReturnValue + { + get { return hasReturnValue; } + } + #region IRecognizer Members public void OutParameter(int position) { - // don't care... + hasReturnValue = true; } public void OrdinalParameter(int position) Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -12,8 +12,17 @@ private static readonly OrdinalParameterDescriptor[] EmptyOrdinals = new OrdinalParameterDescriptor[0]; private readonly OrdinalParameterDescriptor[] ordinalDescriptors; private readonly Dictionary<string, NamedParameterDescriptor> namedDescriptorMap; + private readonly bool hasReturnValue = false; public ParameterMetadata(OrdinalParameterDescriptor[] ordinalDescriptors, + IDictionary<string, NamedParameterDescriptor> namedDescriptorMap, + bool hasReturnValue) + : this (ordinalDescriptors, namedDescriptorMap) + { + this.hasReturnValue = hasReturnValue; + } + + public ParameterMetadata(OrdinalParameterDescriptor[] ordinalDescriptors, IDictionary<string, NamedParameterDescriptor> namedDescriptorMap) { if (ordinalDescriptors == null) @@ -43,6 +52,11 @@ get { return namedDescriptorMap.Keys; } } + public bool HasReturnValue + { + get { return hasReturnValue; } + } + public OrdinalParameterDescriptor GetOrdinalParameterDescriptor(int position) { if (position < 1 || position > ordinalDescriptors.Length) Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -143,7 +143,7 @@ new NamedParameterDescriptor(name, null, description.BuildPositionsArray(), description.JpaStyle); } - return new ParameterMetadata(ordinalDescriptors, namedParamDescriptorMap); + return new ParameterMetadata(ordinalDescriptors, namedParamDescriptorMap, recognizer.HasReturnValue); } [Serializable] Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -279,6 +279,8 @@ public bool Callable { get; set; } + public bool HasReturnValue { get; set; } + public bool ReadOnly { get { return _readOnly; } Modified: branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -27,6 +27,7 @@ private readonly IList<INativeSQLQueryReturn> queryReturns; private readonly ICollection<string> querySpaces; private readonly bool callable; + private readonly bool hasReturnValue; private bool autoDiscoverTypes; /// <summary> Constructs a SQLQueryImpl given a sql query defined in the mappings. </summary> @@ -52,16 +53,9 @@ querySpaces = queryDef.QuerySpaces; callable = queryDef.IsCallable; + hasReturnValue = parameterMetadata.HasReturnValue; } - internal SqlQueryImpl(string sql, IList<INativeSQLQueryReturn> queryReturns, ICollection<string> querySpaces, FlushMode flushMode, bool callable, ISessionImplementor session, ParameterMetadata parameterMetadata) - : base(sql, flushMode, session, parameterMetadata) - { - this.queryReturns = queryReturns; - this.querySpaces = querySpaces; - this.callable = callable; - } - internal SqlQueryImpl(string sql, string[] returnAliases, System.Type[] returnClasses, LockMode[] lockModes, ISessionImplementor session, ICollection<string> querySpaces, FlushMode flushMode, ParameterMetadata parameterMetadata) : base(sql, flushMode, session, parameterMetadata) { @@ -180,6 +174,7 @@ { QueryParameters qp = base.GetQueryParameters(namedParams); qp.Callable = callable; + qp.HasReturnValue = hasReturnValue; qp.HasAutoDiscoverScalarTypes = autoDiscoverTypes; return qp; } Modified: branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -11,6 +11,7 @@ using NHibernate.Cache; using NHibernate.Collection; using NHibernate.Engine; +using NHibernate.Engine.Query; using NHibernate.Event; using NHibernate.Exceptions; using NHibernate.Hql.Util; @@ -1104,7 +1105,8 @@ bool useLimit = UseLimit(selection, dialect); bool hasFirstRow = GetFirstRow(selection) > 0; bool useOffset = hasFirstRow && useLimit && dialect.SupportsLimitOffset; - // TODO NH bool callable = queryParameters.Callable; + bool isCallable = queryParameters.Callable; + bool hasReturnValue = queryParameters.HasReturnValue; if (useLimit) { @@ -1114,10 +1116,19 @@ sqlString = PreprocessSQL(sqlString, queryParameters, dialect); - // TODO NH: Callable for SP -> PrepareCallableQueryCommand - IDbCommand command = - session.Batcher.PrepareQueryCommand(CommandType.Text, sqlString, - GetParameterTypes(queryParameters, useLimit, useOffset)); + IDbCommand command = null; + if (isCallable) + { + command = + session.Batcher.PrepareQueryCommand(CommandType.StoredProcedure, CallableParser.Parse(sqlString.ToString()), + GetParameterTypes(queryParameters, useLimit, useOffset)); + } + else + { + command = + session.Batcher.PrepareQueryCommand(CommandType.Text, sqlString, + GetParameterTypes(queryParameters, useLimit, useOffset)); + } try { @@ -1133,12 +1144,13 @@ { colIndex += BindLimitParameters(command, colIndex, selection, session); } - // TODO NH - //if (callable) - //{ - // colIndex = dialect.RegisterResultSetOutParameter(command, col); - //} + if (isCallable) + { + colIndex += + session.Factory.ConnectionProvider.Driver.RegisterResultSetOutParameter(command, colIndex, hasReturnValue); + } + colIndex += BindParameterValues(command, queryParameters, colIndex, session); if (useLimit && !dialect.BindLimitParametersFirst) @@ -1263,7 +1275,7 @@ // NH Different behavior: // The responsibility of parameter binding was entirely moved to QueryParameters // to deal with positionslParameter+NamedParameter+ParameterOfFilters - return queryParameters.BindParameters(statement, GetNamedParameterLocs, 0, session); + return queryParameters.BindParameters(statement, GetNamedParameterLocs, startIndex, session); } public virtual int[] GetNamedParameterLocs(string name) Modified: branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj 2009-10-26 11:01:27 UTC (rev 4801) @@ -479,6 +479,7 @@ <Compile Include="Dialect\SybaseASA9Dialect.cs" /> <Compile Include="Driver\IfxDriver.cs" /> <Compile Include="Driver\OracleLiteDataClientDriver.cs" /> + <Compile Include="Engine\Query\CallableParser.cs" /> <Compile Include="EntityModeEqualityComparer.cs" /> <Compile Include="Event\AbstractPostDatabaseOperationEvent.cs" /> <Compile Include="Event\AbstractPreDatabaseOperationEvent.cs" /> Modified: branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -3332,20 +3332,20 @@ SqlCommandInfo defaultDelete = GenerateDeleteString(j); sqlInsertStrings[j] = customSQLInsert[j] != null - ? new SqlCommandInfo(customSQLInsert[j], defaultInsert.ParameterTypes) + ? new SqlCommandInfo(customSQLInsert[j], insertCallable[j], defaultInsert.ParameterTypes) : defaultInsert; sqlUpdateStrings[j] = customSQLUpdate[j] != null - ? new SqlCommandInfo(customSQLUpdate[j], defaultUpdate.ParameterTypes) + ? new SqlCommandInfo(customSQLUpdate[j], updateCallable[j], defaultUpdate.ParameterTypes) : defaultUpdate; // NH: in practice for lazy update de update sql is the same any way. sqlLazyUpdateStrings[j] = customSQLUpdate[j] != null - ? new SqlCommandInfo(customSQLUpdate[j], defaultUpdate.ParameterTypes) + ? new SqlCommandInfo(customSQLUpdate[j], updateCallable[j], defaultUpdate.ParameterTypes) : GenerateUpdateString(NonLazyPropertyUpdateability, j, false); sqlDeleteStrings[j] = customSQLDelete[j] != null - ? new SqlCommandInfo(customSQLDelete[j], defaultDelete.ParameterTypes) + ? new SqlCommandInfo(customSQLDelete[j], deleteCallable[j], defaultDelete.ParameterTypes) : defaultDelete; } Modified: branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -1,10 +1,12 @@ using System.Data; +using NHibernate.Engine.Query; using NHibernate.SqlTypes; namespace NHibernate.SqlCommand { public class SqlCommandInfo { + private readonly CommandType commandType; private readonly SqlString text; private readonly SqlType[] parameterTypes; @@ -12,12 +14,22 @@ { this.text = text; this.parameterTypes = parameterTypes; + this.commandType = CommandType.Text; } + public SqlCommandInfo(SqlString text, bool isStoredProcedure, SqlType[] parameterTypes) + : this(text, parameterTypes) + { + if (isStoredProcedure) + { + this.commandType = CommandType.StoredProcedure; + this.text = CallableParser.Parse(text.ToString()); + } + } + public CommandType CommandType { - // Always Text for now - get { return CommandType.Text; } + get { return commandType; } } public SqlString Text Added: branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -0,0 +1,40 @@ +using NUnit.Framework; +using NHibernate.Engine.Query; +using NHibernate.SqlCommand; +using NHibernate.Util; + +namespace NHibernate.Test.EngineTest +{ + [TestFixture] + public class CallableParserFixture + { + [Test] + public void CanFindCallableFunctionName() + { + string query = @"{ call myFunction(:name) }"; + + SqlString sqlFunction = CallableParser.Parse(query); + Assert.That(sqlFunction.ToString(), Is.EqualTo("myFunction")); + } + + [Test] + public void CanDetermineIsNotCallable() + { + string query = @"SELECT id FROM mytable"; + + Assert.Throws<ParserException>(() => + { + SqlString sqlFunction = CallableParser.Parse(query); + }); + } + + [Test] + public void CanFindCallableFunctionNameWithoutParameters() + { + string query = @"{ call myFunction }"; + + SqlString sqlFunction = CallableParser.Parse(query); + Assert.That(sqlFunction.ToString(), Is.EqualTo("myFunction")); + } + } +} \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -59,5 +59,22 @@ Assert.DoesNotThrow(() => p = recognizer.NamedParameterDescriptionMap["pizza"]); } + [Test] + public void CanRecogniseNoReturnValueParameter() + { + string query = "{ call myFunction(?) }"; + ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); + ParameterParser.Parse(query, recognizer); + Assert.That(recognizer.HasReturnValue, Is.False); + } + + [Test] + public void CanRecogniseReturnValueParameter() + { + string query = "{ ? = call myFunction(?) }"; + ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); + ParameterParser.Parse(query, recognizer); + Assert.That(recognizer.HasReturnValue, Is.True); + } } } \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-26 11:01:27 UTC (rev 4801) @@ -106,6 +106,7 @@ <Compile Include="CfgTest\ConfigurationSerializationTests.cs" /> <Compile Include="CfgTest\DefaultNsAssmFixture.cs" /> <Compile Include="DriverTest\SqlServerCeDriverFixture.cs" /> + <Compile Include="EngineTest\CallableParserFixture.cs" /> <Compile Include="EngineTest\NativeSQLQueryNonScalarReturnTest.cs" /> <Compile Include="EngineTest\NativeSQLQueryScalarReturnTest.cs" /> <Compile Include="EngineTest\NativeSQLQuerySpecificationTest.cs" /> Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml 2009-10-26 11:01:27 UTC (rev 4801) @@ -39,7 +39,7 @@ </id> <property name="name" not-null="true"/> <loader query-ref="person"/> - <sql-insert callable="true" check="none">call createPerson(?,?)</sql-insert> + <sql-insert callable="true" check="none">{ call createPerson(?, ?) }</sql-insert> <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> </class> @@ -187,6 +187,23 @@ <database-object> <create> + CREATE OR REPLACE PROCEDURE employmentsForRegion(rows OUT SYS_REFCURSOR, p_regionCode EMPLOYMENT.REGIONCODE%TYPE) + AS + BEGIN + OPEN rows FOR + SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, + REGIONCODE, EMPID, VALUE, CURRENCY + FROM EMPLOYMENT + WHERE REGIONCODE = p_regionCode; + END; + </create> + <drop> + DROP PROCEDURE employmentsForRegion + </drop> + </database-object> + + <database-object> + <create> CREATE OR REPLACE PROCEDURE createPerson(p_name PERSON.NAME%TYPE, p_id PERSON.PERID%TYPE) AS rowcount INTEGER; @@ -201,7 +218,7 @@ END; </create> <drop> - DROP PROCEDURE createPerson; + DROP PROCEDURE createPerson </drop> </database-object> Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs 2009-10-26 11:01:27 UTC (rev 4801) @@ -4,7 +4,7 @@ namespace NHibernate.Test.SqlTest.Custom.Oracle { - [TestFixture, Ignore("Not supported yet.")] + [TestFixture] public class OracleCustomSQLFixture : CustomStoredProcSupportTest { protected override IList Mappings @@ -12,9 +12,49 @@ get { return new[] { "SqlTest.Custom.Oracle.Mappings.hbm.xml", "SqlTest.Custom.Oracle.StoredProcedures.hbm.xml" }; } } + protected override bool AppliesTo(NHibernate.Engine.ISessionFactoryImplementor factory) + { + return factory.ConnectionProvider.Driver is Driver.OracleDataClientDriver; + } + protected override bool AppliesTo(Dialect.Dialect dialect) { return dialect is Oracle8iDialect; } + + [Test] + public void RefCursorOutStoredProcedure() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + + Organization ifa = new Organization("IFA"); + Organization jboss = new Organization("JBoss"); + Person gavin = new Person("Gavin"); + Person kevin = new Person("Kevin"); + Employment emp = new Employment(gavin, jboss, "AU"); + Employment emp2 = new Employment(kevin, ifa, "EU"); + s.Save(ifa); + s.Save(jboss); + s.Save(gavin); + s.Save(kevin); + s.Save(emp); + s.Save(emp2); + + IQuery namedQuery = s.GetNamedQuery("selectEmploymentsForRegion"); + namedQuery.SetString("regionCode", "EU"); + IList list = namedQuery.List(); + Assert.That(list.Count, Is.EqualTo(1)); + s.Delete(emp2); + s.Delete(emp); + s.Delete(ifa); + s.Delete(jboss); + s.Delete(kevin); + s.Delete(gavin); + + t.Commit(); + s.Close(); + } + } } \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml 2009-10-25 20:48:02 UTC (rev 4800) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml 2009-10-26 11:01:27 UTC (rev 4801) @@ -1,10 +1,6 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- This version is for Oracle drivers handling of stored procedures/functions. - - - NOTE: so far this is the JAVA syntax, probably we will do something different in .NET - or we can use the same syntax and solve the problem in each Oracle drive --> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" @@ -15,19 +11,19 @@ <sql-query name="simpleScalar" callable="true"> <return-scalar column="name" type="string"/> <return-scalar column="value" type="long"/> - call simpleScalar(:number) + { ? = call simpleScalar(:number) } </sql-query> <sql-query name="paramhandling" callable="true"> <return-scalar column="value" type="long"/> <return-scalar column="value2" type="long"/> - call testParamHandling(?,?) + { ? = call testParamHandling(?, ?) } </sql-query> <sql-query name="paramhandling_mixed" callable="true"> <return-scalar column="value" type="long"/> <return-scalar column="value2" type="long"/> - call testParamHandling(?,:second) + { ? = call testParamHandling(?,:second) } </sql-query> <sql-query name="selectAllEmployments" callable="true"> @@ -43,7 +39,23 @@ <return-column name="CURRENCY"/> </return-property> </return> - call allEmployments() + { ? = call allEmployments } </sql-query> + <sql-query name="selectEmploymentsForRegion" callable="true"> + <return alias="emp" class="Employment"> + <return-property name="employee" column="EMPLOYEE"/> + <return-property name="employer" column="EMPLOYER"/> + <return-property name="startDate" column="STARTDATE"/> + <return-property name="endDate" column="ENDDATE"/> + <return-property name="regionCode" column="REGIONCODE"/> + <return-property name="employmentId" column="EMPID"/> + <return-property name="salary"> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + </return> + { call employmentsForRegion(:regionCode) } + </sql-query> + </hibernate-mapping> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-10-27 00:43:08
|
Revision: 4803 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4803&view=rev Author: fabiomaulo Date: 2009-10-26 23:58:32 +0000 (Mon, 26 Oct 2009) Log Message: ----------- Fix NH-1997 Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/ExceptionsTest/NullQueryTest.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2009-10-26 11:02:27 UTC (rev 4802) +++ branches/2.1.x/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2009-10-26 23:58:32 UTC (rev 4803) @@ -36,7 +36,9 @@ public static Exception Convert(ISQLExceptionConverter converter, Exception sqlException, string message, SqlString sql) { - return Convert(converter, new AdoExceptionContextInfo {SqlException = sqlException, Message = message, Sql = sql.ToString()}); + return Convert(converter, + new AdoExceptionContextInfo + {SqlException = sqlException, Message = message, Sql = sql != null ? sql.ToString() : null}); } /// <summary> @@ -57,9 +59,9 @@ object[] parameterValues, IDictionary<string, TypedValue> namedParameters) { sql = TryGetActualSqlQuery(sqle, sql); - string extendMessage = ExtendMessage(message, sql.ToString(), parameterValues, namedParameters); + string extendMessage = ExtendMessage(message, sql != null ? sql.ToString() : null, parameterValues, namedParameters); ADOExceptionReporter.LogExceptions(sqle, extendMessage); - return new ADOException(extendMessage, sqle, sql.ToString()); + return new ADOException(extendMessage, sqle, sql != null ? sql.ToString() : SQLNotAvailable); } /// <summary> For the given <see cref="Exception"/>, locates the <see cref="System.Data.Common.DbException"/>. </summary> @@ -81,7 +83,7 @@ IDictionary<string, TypedValue> namedParameters) { var sb = new StringBuilder(); - sb.Append(message).Append(Environment.NewLine).Append("[ ").Append(sql).Append(" ]"); + sb.Append(message).Append(Environment.NewLine).Append("[ ").Append(sql ?? SQLNotAvailable).Append(" ]"); if (parameterValues != null && parameterValues.Length > 0) { sb.Append(Environment.NewLine).Append("Positional parameters: "); Added: branches/2.1.x/nhibernate/src/NHibernate.Test/ExceptionsTest/NullQueryTest.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/ExceptionsTest/NullQueryTest.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/ExceptionsTest/NullQueryTest.cs 2009-10-26 23:58:32 UTC (rev 4803) @@ -0,0 +1,46 @@ +using System; +using System.Collections; +using System.Data; +using NHibernate.Exceptions; +using NUnit.Framework; + +namespace NHibernate.Test.ExceptionsTest +{ + /// <summary> + /// NH-1997 + /// </summary> + [TestFixture] + public class NullQueryTest : TestCase + { + #region Overrides of TestCase + + protected override IList Mappings + { + get { return new string[0]; } + } + + #endregion + [Test] + public void BadGrammar() + { + ISession session = OpenSession(); + IDbConnection connection = session.Connection; + try + { + IDbCommand ps = connection.CreateCommand(); + ps.CommandType = CommandType.Text; + ps.CommandText = "whatever"; + ps.ExecuteNonQuery(); + } + catch (Exception sqle) + { + Assert.DoesNotThrow( + () => ADOExceptionHelper.Convert(sessions.SQLExceptionConverter, sqle, "could not get or update next value", null)); + } + finally + { + session.Close(); + } + } + } +} \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-26 11:02:27 UTC (rev 4802) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-26 23:58:32 UTC (rev 4803) @@ -110,6 +110,7 @@ <Compile Include="EngineTest\NativeSQLQueryNonScalarReturnTest.cs" /> <Compile Include="EngineTest\NativeSQLQueryScalarReturnTest.cs" /> <Compile Include="EngineTest\NativeSQLQuerySpecificationTest.cs" /> + <Compile Include="ExceptionsTest\NullQueryTest.cs" /> <Compile Include="FilterTest\ConfigFixture.cs" /> <Compile Include="FilterTest\FilterSecondPassArgsFixture.cs" /> <Compile Include="CfgTest\HbmBinderFixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2009-10-29 14:30:52
|
Revision: 4805 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4805&view=rev Author: ricbrown Date: 2009-10-29 14:30:40 +0000 (Thu, 29 Oct 2009) Log Message: ----------- Updated fix for NH-847 moving responsibility to the driver Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterParser.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/DriverBase.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -136,11 +136,6 @@ return cmd; } - public virtual int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue) - { - throw new NotImplementedException(GetType().Name + " does not support resultsets via stored procedures"); - } - private void SetCommandTimeout(IDbCommand cmd, object envTimeout) { if (commandTimeout >= 0) @@ -215,12 +210,23 @@ public void PrepareCommand(IDbCommand command) { + OnBeforePrepare(command); + if (SupportsPreparingCommands && prepareSql) { command.Prepare(); } } + /// <summary> + /// Override to make any adjustments to the IDbCommand object. (e.g., Oracle custom OUT parameter) + /// Parameters have been bound by this point, so their order can be adjusted too. + /// This is analagous to the RegisterResultSetOutParameter() function in Hibernate. + /// </summary> + protected virtual void OnBeforePrepare(IDbCommand command) + { + } + public IDbDataParameter GenerateOutputParameter(IDbCommand command) { IDbDataParameter param = GenerateParameter(command, "ReturnValue", SqlTypeFactory.Int32); Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/IDriver.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -80,17 +80,6 @@ IDbCommand GenerateCommand(CommandType type, SqlString sqlString, SqlType[] parameterTypes); /// <summary> - /// Registers an OUT parameter which will be returing a - /// <see cref="IDataReader"/>. How this is accomplished varies greatly - /// from DB to DB, hence its inclusion here. - /// </summary> - /// <param name="command">The <see cref="IDbCommand"/> with CommandType.StoredProcedure.</param> - /// <param name="position">The bind position at which to register the OUT param.</param> - /// <param name="hasReturnValue">Whether the out parameter is a return value, or an out parameter.</param> - /// <returns>The number of (contiguous) bind positions used.</returns> - int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue); - - /// <summary> /// Prepare the <paramref name="command" /> by calling <see cref="IDbCommand.Prepare()" />. /// May be a no-op if the driver does not support preparing commands, or for any other reason. /// </summary> Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleClientDriver.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -1,5 +1,6 @@ using System.Data; using System.Data.OracleClient; +using NHibernate.Engine.Query; using NHibernate.SqlTypes; namespace NHibernate.Driver @@ -48,10 +49,17 @@ } } - public override int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue) + protected override void OnBeforePrepare(IDbCommand command) { + base.OnBeforePrepare(command); + + CallableParser.Detail detail = CallableParser.Parse(command.CommandText); + + if (!detail.IsCallable) + return; + throw new System.NotImplementedException(GetType().Name + - " does not support resultsets via stored procedures." + + " does not support CallableStatement syntax (stored procedures)." + " Consider using OracleDataClientDriver instead."); } } Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/OracleDataClientDriver.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -1,6 +1,7 @@ using System.Data; using System.Reflection; using NHibernate.AdoNet; +using NHibernate.Engine.Query; using NHibernate.SqlTypes; using NHibernate.Util; @@ -82,17 +83,24 @@ } } - public override int RegisterResultSetOutParameter(IDbCommand command, int position, bool hasReturnValue) + protected override void OnBeforePrepare(IDbCommand command) { + base.OnBeforePrepare(command); + + CallableParser.Detail detail = CallableParser.Parse(command.CommandText); + + if (!detail.IsCallable) + return; + + command.CommandType = CommandType.StoredProcedure; + command.CommandText = detail.FunctionName; + IDbDataParameter outCursor = command.CreateParameter(); - outCursor.ParameterName = ""; oracleDbType.SetValue(outCursor, oracleDbTypeRefCursor, null); - outCursor.Direction = hasReturnValue ? ParameterDirection.ReturnValue : ParameterDirection.Output; + outCursor.Direction = detail.HasReturn ? ParameterDirection.ReturnValue : ParameterDirection.Output; - command.Parameters.Insert(position, outCursor); - - return 1; + command.Parameters.Insert(0, outCursor); } #region IEmbeddedBatcherFactoryProvider Members Modified: branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using NHibernate.SqlCommand; +using NHibernate.Engine.Query; namespace NHibernate.Driver { @@ -15,6 +16,9 @@ private readonly Dictionary<int, int> queryIndexToNumberOfPreceedingParameters = new Dictionary<int, int>(); private readonly Dictionary<int, int> parameterIndexToQueryIndex = new Dictionary<int, int>(); + private bool hasReturnParameter = false; + private bool foundReturnParameter = false; + public SqlStringFormatter(ISqlParameterFormatter formatter, string multipleQueriesSeparator) { this.formatter = formatter; @@ -24,6 +28,7 @@ public void Format(SqlString text) { DetermineNumberOfPreceedingParametersForEachQuery(text); + foundReturnParameter = false; text.Visit(this); } @@ -44,6 +49,13 @@ void ISqlStringVisitor.Parameter(Parameter parameter) { + if (hasReturnParameter && !foundReturnParameter) + { + result.Append(parameter); + foundReturnParameter = true; + return; + } + string name; if (queryIndexToNumberOfPreceedingParameters.Count == 0) @@ -80,7 +92,14 @@ int currentParameterIndex = 0; int currentQueryParameterCount = 0; int currentQueryIndex = 0; + hasReturnParameter = false; + foundReturnParameter = false; + CallableParser.Detail callableDetail = CallableParser.Parse(text.ToString()); + + if (callableDetail.IsCallable && callableDetail.HasReturn) + hasReturnParameter = true; + foreach (object part in text.Parts) { if (part.ToString().Equals(multipleQueriesSeparator)) @@ -95,7 +114,14 @@ if (parameter != null) { - parameterIndexToQueryIndex[currentParameterIndex] = currentQueryIndex; + if (hasReturnParameter && !foundReturnParameter) + { + foundReturnParameter = true; + } + else + { + parameterIndexToQueryIndex[currentParameterIndex] = currentQueryIndex; + } currentQueryParameterCount++; currentParameterIndex++; } Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/CallableParser.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -8,26 +8,42 @@ { public static class CallableParser { + + public class Detail + { + public bool IsCallable; + public bool HasReturn; + public string FunctionName; + } + private static readonly Regex functionNameFinder = new Regex(@"\{[\S\s]*call[\s]+([\w]+)[^\w]"); private static readonly int NewLineLength = Environment.NewLine.Length; - public static SqlString Parse(string sqlString) + public static Detail Parse(string sqlString) { - bool isCallableSyntax = sqlString.IndexOf("{") == 0 && - sqlString.IndexOf("}") == (sqlString.Length - 1) && - sqlString.IndexOf("call") > 0; + Detail callableDetail = new Detail(); - if (!isCallableSyntax) - throw new ParserException("Expected callable syntax {? = call procedure_name[(?, ?, ...)]} but got: " + sqlString); + callableDetail.IsCallable = sqlString.IndexOf("{") == 0 && + sqlString.IndexOf("}") == (sqlString.Length - 1) && + sqlString.IndexOf("call") > 0; + if (!callableDetail.IsCallable) + return callableDetail; Match functionMatch = functionNameFinder.Match(sqlString); if ((!functionMatch.Success) || (functionMatch.Groups.Count < 2)) throw new HibernateException("Could not determine function name for callable SQL: " + sqlString); - string function = functionMatch.Groups[1].Value; - return new SqlString(function); + callableDetail.FunctionName = functionMatch.Groups[1].Value; + + callableDetail.HasReturn = sqlString.IndexOf("call") > 0 && + sqlString.IndexOf("?") > 0 && + sqlString.IndexOf("=") > 0 && + sqlString.IndexOf("?") < sqlString.IndexOf("call") && + sqlString.IndexOf("=") < sqlString.IndexOf("call"); + + return callableDetail; } } } \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParamLocationRecognizer.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -13,8 +13,6 @@ private readonly List<int> ordinalParameterLocationList = new List<int>(); - private bool hasReturnValue = false; - /// <summary> /// Convenience method for creating a param location recognizer and /// initiating the parse. @@ -49,16 +47,11 @@ get { return ordinalParameterLocationList; } } - public bool HasReturnValue - { - get { return hasReturnValue; } - } - #region IRecognizer Members public void OutParameter(int position) { - hasReturnValue = true; + // don't care... } public void OrdinalParameter(int position) Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterMetadata.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -12,17 +12,8 @@ private static readonly OrdinalParameterDescriptor[] EmptyOrdinals = new OrdinalParameterDescriptor[0]; private readonly OrdinalParameterDescriptor[] ordinalDescriptors; private readonly Dictionary<string, NamedParameterDescriptor> namedDescriptorMap; - private readonly bool hasReturnValue = false; public ParameterMetadata(OrdinalParameterDescriptor[] ordinalDescriptors, - IDictionary<string, NamedParameterDescriptor> namedDescriptorMap, - bool hasReturnValue) - : this (ordinalDescriptors, namedDescriptorMap) - { - this.hasReturnValue = hasReturnValue; - } - - public ParameterMetadata(OrdinalParameterDescriptor[] ordinalDescriptors, IDictionary<string, NamedParameterDescriptor> namedDescriptorMap) { if (ordinalDescriptors == null) @@ -52,11 +43,6 @@ get { return namedDescriptorMap.Keys; } } - public bool HasReturnValue - { - get { return hasReturnValue; } - } - public OrdinalParameterDescriptor GetOrdinalParameterDescriptor(int position) { if (position < 1 || position > ordinalDescriptors.Length) Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterParser.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterParser.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/ParameterParser.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -44,8 +44,10 @@ public static void Parse(string sqlString, IRecognizer recognizer) { bool hasMainOutputParameter = sqlString.IndexOf("call") > 0 && - sqlString.IndexOf("?") < sqlString.IndexOf("call") && - sqlString.IndexOf("=") < sqlString.IndexOf("call"); + sqlString.IndexOf("?") > 0 && + sqlString.IndexOf("=") > 0 && + sqlString.IndexOf("?") < sqlString.IndexOf("call") && + sqlString.IndexOf("=") < sqlString.IndexOf("call"); bool foundMainOutputParam = false; int stringLength = sqlString.Length; Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -143,7 +143,7 @@ new NamedParameterDescriptor(name, null, description.BuildPositionsArray(), description.JpaStyle); } - return new ParameterMetadata(ordinalDescriptors, namedParamDescriptorMap, recognizer.HasReturnValue); + return new ParameterMetadata(ordinalDescriptors, namedParamDescriptorMap); } [Serializable] Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -279,8 +279,6 @@ public bool Callable { get; set; } - public bool HasReturnValue { get; set; } - public bool ReadOnly { get { return _readOnly; } Modified: branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -27,7 +27,6 @@ private readonly IList<INativeSQLQueryReturn> queryReturns; private readonly ICollection<string> querySpaces; private readonly bool callable; - private readonly bool hasReturnValue; private bool autoDiscoverTypes; /// <summary> Constructs a SQLQueryImpl given a sql query defined in the mappings. </summary> @@ -53,9 +52,16 @@ querySpaces = queryDef.QuerySpaces; callable = queryDef.IsCallable; - hasReturnValue = parameterMetadata.HasReturnValue; } + internal SqlQueryImpl(string sql, IList<INativeSQLQueryReturn> queryReturns, ICollection<string> querySpaces, FlushMode flushMode, bool callable, ISessionImplementor session, ParameterMetadata parameterMetadata) + : base(sql, flushMode, session, parameterMetadata) + { + this.queryReturns = queryReturns; + this.querySpaces = querySpaces; + this.callable = callable; + } + internal SqlQueryImpl(string sql, string[] returnAliases, System.Type[] returnClasses, LockMode[] lockModes, ISessionImplementor session, ICollection<string> querySpaces, FlushMode flushMode, ParameterMetadata parameterMetadata) : base(sql, flushMode, session, parameterMetadata) { @@ -174,7 +180,6 @@ { QueryParameters qp = base.GetQueryParameters(namedParams); qp.Callable = callable; - qp.HasReturnValue = hasReturnValue; qp.HasAutoDiscoverScalarTypes = autoDiscoverTypes; return qp; } Modified: branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Loader/Loader.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -11,7 +11,6 @@ using NHibernate.Cache; using NHibernate.Collection; using NHibernate.Engine; -using NHibernate.Engine.Query; using NHibernate.Event; using NHibernate.Exceptions; using NHibernate.Hql.Util; @@ -1105,8 +1104,7 @@ bool useLimit = UseLimit(selection, dialect); bool hasFirstRow = GetFirstRow(selection) > 0; bool useOffset = hasFirstRow && useLimit && dialect.SupportsLimitOffset; - bool isCallable = queryParameters.Callable; - bool hasReturnValue = queryParameters.HasReturnValue; + // TODO NH bool callable = queryParameters.Callable; if (useLimit) { @@ -1116,19 +1114,10 @@ sqlString = PreprocessSQL(sqlString, queryParameters, dialect); - IDbCommand command = null; - if (isCallable) - { - command = - session.Batcher.PrepareQueryCommand(CommandType.StoredProcedure, CallableParser.Parse(sqlString.ToString()), - GetParameterTypes(queryParameters, useLimit, useOffset)); - } - else - { - command = - session.Batcher.PrepareQueryCommand(CommandType.Text, sqlString, - GetParameterTypes(queryParameters, useLimit, useOffset)); - } + // TODO NH: Callable for SP -> PrepareCallableQueryCommand + IDbCommand command = + session.Batcher.PrepareQueryCommand(CommandType.Text, sqlString, + GetParameterTypes(queryParameters, useLimit, useOffset)); try { @@ -1144,13 +1133,12 @@ { colIndex += BindLimitParameters(command, colIndex, selection, session); } + // TODO NH + //if (callable) + //{ + // colIndex = dialect.RegisterResultSetOutParameter(command, col); + //} - if (isCallable) - { - colIndex += - session.Factory.ConnectionProvider.Driver.RegisterResultSetOutParameter(command, colIndex, hasReturnValue); - } - colIndex += BindParameterValues(command, queryParameters, colIndex, session); if (useLimit && !dialect.BindLimitParametersFirst) @@ -1275,7 +1263,7 @@ // NH Different behavior: // The responsibility of parameter binding was entirely moved to QueryParameters // to deal with positionslParameter+NamedParameter+ParameterOfFilters - return queryParameters.BindParameters(statement, GetNamedParameterLocs, startIndex, session); + return queryParameters.BindParameters(statement, GetNamedParameterLocs, 0, session); } public virtual int[] GetNamedParameterLocs(string name) Modified: branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -3332,20 +3332,20 @@ SqlCommandInfo defaultDelete = GenerateDeleteString(j); sqlInsertStrings[j] = customSQLInsert[j] != null - ? new SqlCommandInfo(customSQLInsert[j], insertCallable[j], defaultInsert.ParameterTypes) + ? new SqlCommandInfo(customSQLInsert[j], defaultInsert.ParameterTypes) : defaultInsert; sqlUpdateStrings[j] = customSQLUpdate[j] != null - ? new SqlCommandInfo(customSQLUpdate[j], updateCallable[j], defaultUpdate.ParameterTypes) + ? new SqlCommandInfo(customSQLUpdate[j], defaultUpdate.ParameterTypes) : defaultUpdate; // NH: in practice for lazy update de update sql is the same any way. sqlLazyUpdateStrings[j] = customSQLUpdate[j] != null - ? new SqlCommandInfo(customSQLUpdate[j], updateCallable[j], defaultUpdate.ParameterTypes) + ? new SqlCommandInfo(customSQLUpdate[j], defaultUpdate.ParameterTypes) : GenerateUpdateString(NonLazyPropertyUpdateability, j, false); sqlDeleteStrings[j] = customSQLDelete[j] != null - ? new SqlCommandInfo(customSQLDelete[j], deleteCallable[j], defaultDelete.ParameterTypes) + ? new SqlCommandInfo(customSQLDelete[j], defaultDelete.ParameterTypes) : defaultDelete; } Modified: branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate/SqlCommand/SqlCommandInfo.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -1,12 +1,10 @@ using System.Data; -using NHibernate.Engine.Query; using NHibernate.SqlTypes; namespace NHibernate.SqlCommand { public class SqlCommandInfo { - private readonly CommandType commandType; private readonly SqlString text; private readonly SqlType[] parameterTypes; @@ -14,22 +12,12 @@ { this.text = text; this.parameterTypes = parameterTypes; - this.commandType = CommandType.Text; } - public SqlCommandInfo(SqlString text, bool isStoredProcedure, SqlType[] parameterTypes) - : this(text, parameterTypes) - { - if (isStoredProcedure) - { - this.commandType = CommandType.StoredProcedure; - this.text = CallableParser.Parse(text.ToString()); - } - } - public CommandType CommandType { - get { return commandType; } + // Always Text for now + get { return CommandType.Text; } } public SqlString Text Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/CallableParserFixture.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -9,12 +9,12 @@ public class CallableParserFixture { [Test] - public void CanFindCallableFunctionName() + public void CanDetermineIsCallable() { string query = @"{ call myFunction(:name) }"; - SqlString sqlFunction = CallableParser.Parse(query); - Assert.That(sqlFunction.ToString(), Is.EqualTo("myFunction")); + CallableParser.Detail detail = CallableParser.Parse(query); + Assert.That(detail.IsCallable, Is.True); } [Test] @@ -22,19 +22,44 @@ { string query = @"SELECT id FROM mytable"; - Assert.Throws<ParserException>(() => - { - SqlString sqlFunction = CallableParser.Parse(query); - }); + CallableParser.Detail detail = CallableParser.Parse(query); + Assert.That(detail.IsCallable, Is.False); } [Test] + public void CanFindCallableFunctionName() + { + string query = @"{ call myFunction(:name) }"; + + CallableParser.Detail detail = CallableParser.Parse(query); + Assert.That(detail.FunctionName, Is.EqualTo("myFunction")); + } + + [Test] public void CanFindCallableFunctionNameWithoutParameters() { string query = @"{ call myFunction }"; - SqlString sqlFunction = CallableParser.Parse(query); - Assert.That(sqlFunction.ToString(), Is.EqualTo("myFunction")); + CallableParser.Detail detail = CallableParser.Parse(query); + Assert.That(detail.FunctionName, Is.EqualTo("myFunction")); } + + [Test] + public void CanDetermineHasReturn() + { + string query = @"{ ? = call myFunction(:name) }"; + + CallableParser.Detail detail = CallableParser.Parse(query); + Assert.That(detail.HasReturn, Is.True); + } + + [Test] + public void CanDetermineHasNoReturn() + { + string query = @"{ call myFunction(:name) }"; + + CallableParser.Detail detail = CallableParser.Parse(query); + Assert.That(detail.HasReturn, Is.False); + } } } \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/EngineTest/ParameterParserFixture.cs 2009-10-29 14:30:40 UTC (rev 4805) @@ -59,22 +59,5 @@ Assert.DoesNotThrow(() => p = recognizer.NamedParameterDescriptionMap["pizza"]); } - [Test] - public void CanRecogniseNoReturnValueParameter() - { - string query = "{ call myFunction(?) }"; - ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); - ParameterParser.Parse(query, recognizer); - Assert.That(recognizer.HasReturnValue, Is.False); - } - - [Test] - public void CanRecogniseReturnValueParameter() - { - string query = "{ ? = call myFunction(?) }"; - ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); - ParameterParser.Parse(query, recognizer); - Assert.That(recognizer.HasReturnValue, Is.True); - } } } \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml 2009-10-29 14:30:40 UTC (rev 4805) @@ -39,7 +39,7 @@ </id> <property name="name" not-null="true"/> <loader query-ref="person"/> - <sql-insert callable="true" check="none">{ call createPerson(?, ?) }</sql-insert> + <sql-insert check="none">{ call createPerson(?, ?) }</sql-insert> <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> </class> @@ -204,7 +204,7 @@ <database-object> <create> - CREATE OR REPLACE PROCEDURE createPerson(p_name PERSON.NAME%TYPE, p_id PERSON.PERID%TYPE) + CREATE OR REPLACE PROCEDURE createPerson(unused OUT SYS_REFCURSOR, p_name PERSON.NAME%TYPE, p_id PERSON.PERID%TYPE) AS rowcount INTEGER; BEGIN Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml 2009-10-27 03:47:26 UTC (rev 4804) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml 2009-10-29 14:30:40 UTC (rev 4805) @@ -8,25 +8,25 @@ namespace="NHibernate.Test.SqlTest" default-access="field"> - <sql-query name="simpleScalar" callable="true"> + <sql-query name="simpleScalar"> <return-scalar column="name" type="string"/> <return-scalar column="value" type="long"/> { ? = call simpleScalar(:number) } </sql-query> - <sql-query name="paramhandling" callable="true"> + <sql-query name="paramhandling"> <return-scalar column="value" type="long"/> <return-scalar column="value2" type="long"/> { ? = call testParamHandling(?, ?) } </sql-query> - <sql-query name="paramhandling_mixed" callable="true"> + <sql-query name="paramhandling_mixed"> <return-scalar column="value" type="long"/> <return-scalar column="value2" type="long"/> { ? = call testParamHandling(?,:second) } </sql-query> - <sql-query name="selectAllEmployments" callable="true"> + <sql-query name="selectAllEmployments"> <return alias="emp" class="Employment"> <return-property name="employee" column="EMPLOYEE"/> <return-property name="employer" column="EMPLOYER"/> @@ -42,7 +42,7 @@ { ? = call allEmployments } </sql-query> - <sql-query name="selectEmploymentsForRegion" callable="true"> + <sql-query name="selectEmploymentsForRegion"> <return alias="emp" class="Employment"> <return-property name="employee" column="EMPLOYEE"/> <return-property name="employer" column="EMPLOYER"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2009-10-30 10:55:05
|
Revision: 4807 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4807&view=rev Author: ricbrown Date: 2009-10-30 10:54:56 +0000 (Fri, 30 Oct 2009) Log Message: ----------- Fix NH-2003, not null constraint on identifier column Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Fixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Mappings.hbm.xml branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Model.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs 2009-10-29 14:31:35 UTC (rev 4806) +++ branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs 2009-10-30 10:54:56 UTC (rev 4807) @@ -234,7 +234,7 @@ if (columnSchema.length != null) column.Length = int.Parse(columnSchema.length); - column.IsNullable = columnSchema.notnullSpecified ? columnSchema.notnull : false; + column.IsNullable = columnSchema.notnullSpecified ? !columnSchema.notnull : false; column.IsUnique = columnSchema.uniqueSpecified && columnSchema.unique; column.CheckConstraint = columnSchema.check ?? string.Empty; column.SqlType = columnSchema.sqltype; Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Fixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Fixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Fixture.cs 2009-10-30 10:54:56 UTC (rev 4807) @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2003 +{ + [TestFixture] + public class Fixture : BugTestCase + { + [Test] + public void ShouldCreateNotNullIdColumn() + { + StringBuilder script = new StringBuilder(); + + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(MappingsAssembly + "." + (string)Mappings[0])) + cfg.AddInputStream(stream); + new SchemaExport(cfg).Execute(s => script.AppendLine(s), false, false); + + string wholeScript = script.ToString(); + Assert.That(wholeScript.ToLower(), Text.Contains("not null")); + } + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Mappings.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Mappings.hbm.xml 2009-10-30 10:54:56 UTC (rev 4807) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2003" + assembly="NHibernate.Test"> + + <class name="MyClass"> + <id name="Id"> + <column name="IdColumn" not-null="true"/> + <generator class="hilo" /> + </id> + </class> +</hibernate-mapping> + + Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Model.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Model.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2003/Model.cs 2009-10-30 10:54:56 UTC (rev 4807) @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2003 +{ + public class MyClass + { + public virtual int Id { get; set; } + } +} Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-29 14:31:35 UTC (rev 4806) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-30 10:54:56 UTC (rev 4807) @@ -600,6 +600,8 @@ <Compile Include="NHSpecificTest\NH1985\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH1990\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1990\Model.cs" /> + <Compile Include="NHSpecificTest\NH2003\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2003\Model.cs" /> <Compile Include="NHSpecificTest\NH473\Child.cs" /> <Compile Include="NHSpecificTest\NH473\Fixture.cs" /> <Compile Include="NHSpecificTest\NH473\Parent.cs" /> @@ -2013,6 +2015,7 @@ <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2003\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1356\MappingsBag.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1356\MappingsSet.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1785\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-10-31 15:22:30
|
Revision: 4809 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4809&view=rev Author: fabiomaulo Date: 2009-10-31 15:22:21 +0000 (Sat, 31 Oct 2009) Log Message: ----------- Fix NH-2000 Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionImpl.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/DomainClass.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/Mappings.hbm.xml branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/SampleTest.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionImpl.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-10-30 10:55:36 UTC (rev 4808) +++ branches/2.1.x/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-10-31 15:22:21 UTC (rev 4809) @@ -2173,7 +2173,9 @@ using (new SessionIdLoggingContext(SessionId)) { CheckAndUpdateSessionStatus(); - return enabledFilters[filterName]; + IFilter result; + enabledFilters.TryGetValue(filterName, out result); + return result; } } Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/DomainClass.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/DomainClass.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/DomainClass.cs 2009-10-31 15:22:21 UTC (rev 4809) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.NHSpecificTest.NH2000 +{ + public class DomainClass + { + public int Id { get; set; } + + public byte[] ByteData { get; set; } + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/Mappings.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/Mappings.hbm.xml 2009-10-31 15:22:21 UTC (rev 4809) @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2000" + default-lazy="false"> + <class name="DomainClass"> + <id name="Id"> + <generator class="assigned" /> + </id> + <property name="ByteData" /> + <filter name="TestFilter" condition="True"></filter> + </class> + <filter-def name="TestFilter"> + </filter-def> +</hibernate-mapping> \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/SampleTest.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/SampleTest.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2000/SampleTest.cs 2009-10-31 15:22:21 UTC (rev 4809) @@ -0,0 +1,19 @@ +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2000 +{ + [TestFixture] + public class SampleTest : BugTestCase + { + // In this version of nHibernate, GetEnabledFilter throws an exception + // instead returning nothing like in previous versions. + [Test] + public void TestSessionGetEnableFilter() + { + using (ISession session = OpenSession()) + { + IFilter filter = session.GetEnabledFilter("TestFilter"); + } + } + } +} \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-30 10:55:36 UTC (rev 4808) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-31 15:22:21 UTC (rev 4809) @@ -600,6 +600,8 @@ <Compile Include="NHSpecificTest\NH1985\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH1990\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1990\Model.cs" /> + <Compile Include="NHSpecificTest\NH2000\DomainClass.cs" /> + <Compile Include="NHSpecificTest\NH2000\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH2003\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2003\Model.cs" /> <Compile Include="NHSpecificTest\NH473\Child.cs" /> @@ -2015,6 +2017,7 @@ <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2000\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2003\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1356\MappingsBag.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1356\MappingsSet.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-10-31 17:33:49
|
Revision: 4811 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4811&view=rev Author: fabiomaulo Date: 2009-10-31 17:33:40 +0000 (Sat, 31 Oct 2009) Log Message: ----------- Fix NH-1998 Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/FilterDefinition.cs branches/2.1.x/nhibernate/src/NHibernate/Engine/JoinSequence.cs branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs branches/2.1.x/nhibernate/src/NHibernate/Util/FilterHelper.cs branches/2.1.x/nhibernate/src/NHibernate/nhibernate-mapping.xsd branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -4918,6 +4918,15 @@ /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute()] public string condition; + + /// <remarks/> + [System.Xml.Serialization.XmlAttributeAttribute("use-many-to-one")] + [System.ComponentModel.DefaultValueAttribute(true)] + public bool usemanytoone; + + public HbmFilterDef() { + this.usemanytoone = true; + } } /// <remarks/> Modified: branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -19,7 +19,7 @@ log.DebugFormat("Parsed filter-def [{0}]", filterDefSchema.name); - return new FilterDefinition(filterDefSchema.name, defaultCondition, parameterTypes); + return new FilterDefinition(filterDefSchema.name, defaultCondition, parameterTypes, filterDefSchema.usemanytoone); } private static IDictionary<string, IType> GetFilterParameterTypes(HbmFilterDef filterDefSchema) Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/FilterDefinition.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/FilterDefinition.cs 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/FilterDefinition.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -14,22 +14,35 @@ private readonly string filterName; private readonly string defaultFilterCondition; private readonly IDictionary<string, IType> parameterTypes= new Dictionary<string, IType>(); + private readonly bool useInManyToOne; /// <summary> - /// Set the named parameter's value list for this filter. + /// Set the named parameter's value list for this filter. /// </summary> /// <param name="name">The name of the filter for which this configuration is in effect.</param> /// <param name="defaultCondition">The default filter condition.</param> - /// <param name="parameterTypes">A dictionary storing the NHibernate <see cref="IType" /> type + /// <param name="parameterTypes">A dictionary storing the NHibernate <see cref="IType"/> type /// of each parameter under its name.</param> - public FilterDefinition(string name, string defaultCondition, IDictionary<string, IType> parameterTypes) + /// <param name="useManyToOne">if set to <c>true</c> used in many to one rel</param> + public FilterDefinition(string name, string defaultCondition, IDictionary<string, IType> parameterTypes, + bool useManyToOne) { filterName = name; defaultFilterCondition = defaultCondition; this.parameterTypes = parameterTypes; + useInManyToOne = useManyToOne; } /// <summary> + /// Gets a value indicating whether to use this filter-def in manytoone refs. + /// </summary> + /// <value><c>true</c> if [use in many to one]; otherwise, <c>false</c>.</value> + public bool UseInManyToOne + { + get { return useInManyToOne; } + } + + /// <summary> /// Get the name of the filter this configuration defines. /// </summary> /// <returns>The filter name for this configuration.</returns> Modified: branches/2.1.x/nhibernate/src/NHibernate/Engine/JoinSequence.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Engine/JoinSequence.cs 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate/Engine/JoinSequence.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -184,14 +184,10 @@ { // NH Different behavior : NH1179 and NH1293 // Apply filters in Many-To-One association - if (string.IsNullOrEmpty(on) && enabledFilters.Count > 0) - { - condition = join.Joinable.FilterFragment(join.Alias, enabledFilters); - } - else - { - condition = on; - } + var enabledForManyToOne = FilterHelper.GetEnabledForManyToOne(enabledFilters); + condition = string.IsNullOrEmpty(on) && enabledForManyToOne.Count > 0 + ? join.Joinable.FilterFragment(join.Alias, enabledForManyToOne) + : on; } if (withClauseFragment != null) Modified: branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate/Loader/JoinWalker.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -17,6 +17,7 @@ protected readonly IList<OuterJoinableAssociation> associations = new List<OuterJoinableAssociation>(); private readonly ISet<AssociationKey> visitedAssociationKeys = new HashedSet<AssociationKey>(); private readonly IDictionary<string, IFilter> enabledFilters; + private readonly IDictionary<string, IFilter> enabledFiltersForManyToOne; private string[] suffixes; private string[] collectionSuffixes; @@ -113,6 +114,7 @@ { this.factory = factory; this.enabledFilters = enabledFilters; + enabledFiltersForManyToOne = FilterHelper.GetEnabledForManyToOne(enabledFilters); } /// <summary> @@ -566,12 +568,15 @@ oj.AddJoins(outerjoin); // NH Different behavior : NH1179 and NH1293 // Apply filters in Many-To-One association - if (enabledFilters.Count > 0) + if (enabledFiltersForManyToOne.Count > 0) { - var manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFilters); - var joinClauseDoesNotContainsFilterAlready = outerjoin.ToFromFragmentString.IndexOfCaseInsensitive(manyToOneFilterFragment) == -1; - if(joinClauseDoesNotContainsFilterAlready) + string manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFiltersForManyToOne); + bool joinClauseDoesNotContainsFilterAlready = + outerjoin.ToFromFragmentString.IndexOfCaseInsensitive(manyToOneFilterFragment) == -1; + if (joinClauseDoesNotContainsFilterAlready) + { outerjoin.AddCondition(manyToOneFilterFragment); + } } } last = oj; Modified: branches/2.1.x/nhibernate/src/NHibernate/Util/FilterHelper.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Util/FilterHelper.cs 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate/Util/FilterHelper.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -67,5 +67,21 @@ } } } + + /// <summary> + /// Get only filters enabled for many-to-one association. + /// </summary> + /// <param name="enabledFilters">All enabled filters</param> + /// <returns>A new <see cref="IDictionary{TKey,TValue}"/> for filters enabled for many to one.</returns> + public static IDictionary<string, IFilter> GetEnabledForManyToOne(IDictionary<string, IFilter> enabledFilters) + { + var enabledFiltersForManyToOne = new Dictionary<string, IFilter>(); + foreach (var enabledFilter in enabledFilters) + { + if (enabledFilter.Value.FilterDefinition.UseInManyToOne) + enabledFiltersForManyToOne.Add(enabledFilter.Key, enabledFilter.Value); + } + return enabledFiltersForManyToOne; + } } } \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate/nhibernate-mapping.xsd =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/nhibernate-mapping.xsd 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate/nhibernate-mapping.xsd 2009-10-31 17:33:40 UTC (rev 4811) @@ -468,6 +468,7 @@ </xs:choice> <xs:attribute name="name" use="required" type="xs:string" /> <xs:attribute name="condition" type="xs:string" /> + <xs:attribute name="use-many-to-one" default="true" type="xs:boolean"/> </xs:complexType> </xs:element> <xs:element name="filter-param"> Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Fixture.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.ManyToOneFilters20Behaviour +{ + [TestFixture] + public class Fixture : BugTestCase + { + private static IList<Parent> joinGraphUsingHql(ISession s) + { + const string hql = @"select p from Parent p + join p.Child c"; + return s.CreateQuery(hql).List<Parent>(); + } + + private static IList<Parent> joinGraphUsingCriteria(ISession s) + { + return s.CreateCriteria(typeof (Parent)).SetFetchMode("Child", FetchMode.Join).List<Parent>(); + } + + private static Parent createParent() + { + return new Parent {Child = new Child()}; + } + + private static void enableFilters(ISession s) + { + IFilter f = s.EnableFilter("activeChild"); + f.SetParameter("active", 1); + IFilter f2 = s.EnableFilter("alwaysValid"); + f2.SetParameter("always", 1); + } + + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from Parent"); + tx.Commit(); + } + } + } + + [Test] + public void VerifyAlwaysFilter() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + Parent p = createParent(); + p.Child.Always = false; + s.Save(p); + tx.Commit(); + } + } + + using (ISession s = OpenSession()) + { + enableFilters(s); + IList<Parent> resCriteria = joinGraphUsingCriteria(s); + IList<Parent> resHql = joinGraphUsingHql(s); + + Assert.AreEqual(0, resCriteria.Count); + Assert.AreEqual(0, resHql.Count); + } + } + + [Test] + public void VerifyFilterActiveButNotUsedInManyToOne() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(createParent()); + tx.Commit(); + } + } + + using (ISession s = OpenSession()) + { + enableFilters(s); + IList<Parent> resCriteria = joinGraphUsingCriteria(s); + IList<Parent> resHql = joinGraphUsingHql(s); + + Assert.AreEqual(1, resCriteria.Count); + Assert.IsNotNull(resCriteria[0].Child); + + Assert.AreEqual(1, resHql.Count); + Assert.IsNotNull(resHql[0].Child); + } + } + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Mappings.hbm.xml 2009-10-31 17:33:40 UTC (rev 4811) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.ManyToOneFilters20Behaviour" + assembly="NHibernate.Test"> + + <class name="Parent"> + <id name="Id"> + <generator class="guid.comb" /> + </id> + + <many-to-one name="Child" class="Child" cascade="all" not-null="true"/> + </class> + + <class name="Child"> + <id name="Id"> + <generator class="guid.comb" /> + </id> + <property name="IsActive"/> + <property name="Always"/> + <filter name="activeChild" condition=":active = IsActive" /> + <filter name="alwaysValid" condition=":always = Always" /> + </class> + + <filter-def name="activeChild" use-many-to-one="false"> + <filter-param name="active" type="int"/> + </filter-def> + + <filter-def name="alwaysValid"> + <filter-param name="always" type="int"/> + </filter-def> +</hibernate-mapping> + Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/ManyToOneFilters20Behaviour/Model.cs 2009-10-31 17:33:40 UTC (rev 4811) @@ -0,0 +1,22 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.ManyToOneFilters20Behaviour +{ + public class Parent + { + public virtual Guid Id { get; set; } + public virtual Child Child { get; set; } + } + + public class Child + { + public Child() + { + Always = true; + } + + public virtual Guid Id { get; set; } + public virtual bool IsActive { get; set; } + public virtual bool Always { get; set; } + } +} \ No newline at end of file Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-31 15:26:23 UTC (rev 4810) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-31 17:33:40 UTC (rev 4811) @@ -368,6 +368,8 @@ <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagPartialNameFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\Something.cs" /> + <Compile Include="NHSpecificTest\ManyToOneFilters20Behaviour\Fixture.cs" /> + <Compile Include="NHSpecificTest\ManyToOneFilters20Behaviour\Model.cs" /> <Compile Include="NHSpecificTest\NH1025\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1025\Model.cs" /> <Compile Include="NHSpecificTest\NH1255\Domain.cs" /> @@ -2017,6 +2019,7 @@ <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\ManyToOneFilters20Behaviour\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2000\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2003\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1356\MappingsBag.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-11-20 20:01:05
|
Revision: 4846 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4846&view=rev Author: fabiomaulo Date: 2009-11-20 20:00:56 +0000 (Fri, 20 Nov 2009) Log Message: ----------- Fix NH-2011 Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Type/TypeFactory.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Fixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Mappings.hbm.xml branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Model.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-11-20 16:07:42 UTC (rev 4845) +++ branches/2.1.x/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-11-20 20:00:56 UTC (rev 4846) @@ -1125,8 +1125,10 @@ ? new object[subtypes.Length] : componentType.GetPropertyValues(original[i], session); object[] targetComponentValues = componentType.GetPropertyValues(target[i], session); - ReplaceAssociations(origComponentValues, targetComponentValues, subtypes, session, null, copyCache, + object[] componentCopy = ReplaceAssociations(origComponentValues, targetComponentValues, subtypes, session, null, copyCache, foreignKeyDirection); + if (!componentType.IsAnyType) + componentType.SetPropertyValues(target[i], componentCopy, session.EntityMode); copied[i] = target[i]; } else if (!types[i].IsAssociationType) Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Fixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Fixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Fixture.cs 2009-11-20 20:00:56 UTC (rev 4846) @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2011 +{ + [TestFixture] + public class Fixture : BugTestCase + { + [Test] + public void Test() + { + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + session.Save(new Country {CountryCode = "SE"}); + tx.Commit(); + } + } + + var newOrder = new Order(); + newOrder.GroupComponent = new GroupComponent(); + newOrder.GroupComponent.Countries = new List<Country>(); + newOrder.GroupComponent.Countries.Add(new Country {CountryCode = "SE"}); + + Order mergedCopy; + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + mergedCopy = (Order) session.Merge(newOrder); + tx.Commit(); + } + } + + using (ISession session = OpenSession()) + { + var order = session.Get<Order>(mergedCopy.Id); + Assert.That(order.GroupComponent.Countries.Count, Is.EqualTo(1)); + } + + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + session.Delete("from Order"); + session.Delete("from Country"); + tx.Commit(); + } + } + } + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Mappings.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Mappings.hbm.xml 2009-11-20 20:00:56 UTC (rev 4846) @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2011"> + + <class name="Order" table="Orders"> + + <id name="Id"> + <generator class="guid.comb"/> + </id> + + <component name="GroupComponent"> + + <bag name="Countries" table="OrderCountries" cascade="none"> + <key column="OrderId" /> + <many-to-many column="CountryCode" class="Country" /> + </bag> + + </component> + + </class> + + <class name="Country" table="Countries"> + + <id name="CountryCode" unsaved-value="null"> + <generator class="assigned"/> + </id> + + </class> + +</hibernate-mapping> Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Model.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Model.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2011/Model.cs 2009-11-20 20:00:56 UTC (rev 4846) @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2011 +{ + public class Order + { + public virtual Guid Id { get; set; } + + public virtual GroupComponent GroupComponent { get; set; } + } + + public class GroupComponent + { + public virtual IList<Country> Countries { get; set; } + } + + public class Country + { + public virtual string CountryCode { get; set; } + } +} Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-11-20 16:07:42 UTC (rev 4845) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-11-20 20:00:56 UTC (rev 4846) @@ -606,6 +606,8 @@ <Compile Include="NHSpecificTest\NH2000\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH2003\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2003\Model.cs" /> + <Compile Include="NHSpecificTest\NH2011\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2011\Model.cs" /> <Compile Include="NHSpecificTest\NH473\Child.cs" /> <Compile Include="NHSpecificTest\NH473\Fixture.cs" /> <Compile Include="NHSpecificTest\NH473\Parent.cs" /> @@ -2019,6 +2021,7 @@ <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2011\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\ManyToOneFilters20Behaviour\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2000\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2003\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2010-01-06 20:52:34
|
Revision: 4907 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4907&view=rev Author: ayenderahien Date: 2010-01-06 20:52:28 +0000 (Wed, 06 Jan 2010) Log Message: ----------- Applying patch for NH-2055 from Jason Dentler Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Dialect/Dialect.cs branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate/Exceptions/SqlParseException.cs branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/ScriptSplitter.cs Modified: branches/2.1.x/nhibernate/src/NHibernate/Dialect/Dialect.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Dialect/Dialect.cs 2010-01-06 20:48:12 UTC (rev 4906) +++ branches/2.1.x/nhibernate/src/NHibernate/Dialect/Dialect.cs 2010-01-06 20:52:28 UTC (rev 4907) @@ -2105,5 +2105,17 @@ } } #endregion + + /// <summary> + /// Supports splitting batches using GO T-SQL command + /// </summary> + /// <remarks> + /// Batches http://msdn.microsoft.com/en-us/library/ms175502.aspx + /// </remarks> + public virtual bool SupportsSqlBatches + { + get { return false; } + } + } } Added: branches/2.1.x/nhibernate/src/NHibernate/Exceptions/SqlParseException.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Exceptions/SqlParseException.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate/Exceptions/SqlParseException.cs 2010-01-06 20:52:28 UTC (rev 4907) @@ -0,0 +1,13 @@ +using System; + +namespace NHibernate.Exceptions +{ + public class SqlParseException : Exception + { + + public SqlParseException(string Message) : base(Message) + { + } + + } +} Modified: branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj 2010-01-06 20:48:12 UTC (rev 4906) +++ branches/2.1.x/nhibernate/src/NHibernate/NHibernate.csproj 2010-01-06 20:52:28 UTC (rev 4907) @@ -489,6 +489,7 @@ <Compile Include="Event\IPreDatabaseOperationEventArgs.cs" /> <Compile Include="Exceptions\AdoExceptionContextInfo.cs" /> <Compile Include="Exceptions\ReflectionBasedSqlStateExtracter.cs" /> + <Compile Include="Exceptions\SqlParseException.cs" /> <Compile Include="Exceptions\SqlStateExtracter.cs" /> <Compile Include="Exceptions\TemplatedViolatedConstraintNameExtracter.cs" /> <Compile Include="Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs" /> @@ -614,6 +615,7 @@ <Compile Include="Proxy\AbstractProxyFactory.cs" /> <Compile Include="SqlCommand\InsertSelect.cs" /> <Compile Include="Tool\hbm2ddl\SchemaMetadataUpdater.cs" /> + <Compile Include="Tool\hbm2ddl\ScriptSplitter.cs" /> <Compile Include="Transaction\AdoNetWithDistrubtedTransactionFactory.cs" /> <Compile Include="Transform\ToListResultTransformer.cs" /> <Compile Include="Type\DbTimestampType.cs" /> Modified: branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2010-01-06 20:48:12 UTC (rev 4906) +++ branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2010-01-06 20:52:28 UTC (rev 4907) @@ -127,9 +127,7 @@ } if (export) { - statement.CommandText = sql; - statement.CommandType = CommandType.Text; - statement.ExecuteNonQuery(); + ExecuteSql(statement, sql); } } catch (Exception e) @@ -143,6 +141,29 @@ } } + private void ExecuteSql(IDbCommand cmd, string sql) + { + if (dialect.SupportsSqlBatches) + { + var objFactory = Environment.BytecodeProvider.ObjectsFactory; + ScriptSplitter splitter = (ScriptSplitter)objFactory.CreateInstance(typeof(ScriptSplitter), sql); + + foreach (string stmt in splitter) + { + log.DebugFormat("SQL Batch: {0}", stmt); + cmd.CommandText = stmt; + cmd.CommandType = CommandType.Text; + cmd.ExecuteNonQuery(); + } + } + else + { + cmd.CommandText = sql; + cmd.CommandType = CommandType.Text; + cmd.ExecuteNonQuery(); + } + } + /// <summary> /// Executes the Export of the Schema in the given connection /// </summary> Added: branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/ScriptSplitter.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/ScriptSplitter.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate/Tool/hbm2ddl/ScriptSplitter.cs 2010-01-06 20:52:28 UTC (rev 4907) @@ -0,0 +1,405 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace NHibernate.Tool.hbm2ddl +{ + public class ScriptSplitter : IEnumerable<string> + { + private readonly TextReader _reader; + private StringBuilder _builder = new StringBuilder(); + private char _current; + private char _lastChar; + private ScriptReader _scriptReader; + + public ScriptSplitter(string script) + { + _reader = new StringReader(script); + _scriptReader = new SeparatorLineReader(this); + } + + internal bool HasNext + { + get { return _reader.Peek() != -1; } + } + + internal char Current + { + get { return _current; } + } + + internal char LastChar + { + get { return _lastChar; } + } + + #region IEnumerable<string> Members + + public IEnumerator<string> GetEnumerator() + { + while (Next()) + { + if (Split()) + { + string script = _builder.ToString().Trim(); + if (script.Length > 0) + { + yield return (script); + } + Reset(); + } + } + if (_builder.Length > 0) + { + string scriptRemains = _builder.ToString().Trim(); + if (scriptRemains.Length > 0) + { + yield return (scriptRemains); + } + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion + + internal bool Next() + { + if (!HasNext) + { + return false; + } + + _lastChar = _current; + _current = (char)_reader.Read(); + return true; + } + + internal int Peek() + { + return _reader.Peek(); + } + + private bool Split() + { + return _scriptReader.ReadNextSection(); + } + + internal void SetParser(ScriptReader newReader) + { + _scriptReader = newReader; + } + + internal void Append(string text) + { + _builder.Append(text); + } + + internal void Append(char c) + { + _builder.Append(c); + } + + void Reset() + { + _current = _lastChar = char.MinValue; + _builder = new StringBuilder(); + } + } + + abstract class ScriptReader + { + protected readonly ScriptSplitter Splitter; + + protected ScriptReader(ScriptSplitter splitter) + { + Splitter = splitter; + } + + /// <summary> + /// This acts as a template method. Specific Reader instances + /// override the component methods. + /// </summary> + public bool ReadNextSection() + { + if (IsQuote) + { + ReadQuotedString(); + return false; + } + + if (BeginDashDashComment) + { + return ReadDashDashComment(); + } + + if (BeginSlashStarComment) + { + ReadSlashStarComment(); + return false; + } + + return ReadNext(); + } + + protected virtual bool ReadDashDashComment() + { + Splitter.Append(Current); + while (Splitter.Next()) + { + Splitter.Append(Current); + if (EndOfLine) + { + break; + } + } + //We should be EndOfLine or EndOfScript here. + Splitter.SetParser(new SeparatorLineReader(Splitter)); + return false; + } + + protected virtual void ReadSlashStarComment() + { + if (ReadSlashStarCommentWithResult()) + { + Splitter.SetParser(new SeparatorLineReader(Splitter)); + return; + } + } + + private bool ReadSlashStarCommentWithResult() + { + Splitter.Append(Current); + while (Splitter.Next()) + { + if (BeginSlashStarComment) + { + ReadSlashStarCommentWithResult(); + continue; + } + Splitter.Append(Current); + + if (EndSlashStarComment) + { + return true; + } + } + return false; + } + + protected virtual void ReadQuotedString() + { + Splitter.Append(Current); + while (Splitter.Next()) + { + Splitter.Append(Current); + if (IsQuote) + { + return; + } + } + } + + protected abstract bool ReadNext(); + + #region Helper methods and properties + + protected bool HasNext + { + get { return Splitter.HasNext; } + } + + protected bool WhiteSpace + { + get { return char.IsWhiteSpace(Splitter.Current); } + } + + protected bool EndOfLine + { + get { return '\n' == Splitter.Current; } + } + + protected bool IsQuote + { + get { return '\'' == Splitter.Current; } + } + + protected char Current + { + get { return Splitter.Current; } + } + + protected char LastChar + { + get { return Splitter.LastChar; } + } + + bool BeginDashDashComment + { + get { return Current == '-' && Peek() == '-'; } + } + + bool BeginSlashStarComment + { + get { return Current == '/' && Peek() == '*'; } + } + + bool EndSlashStarComment + { + get { return LastChar == '*' && Current == '/'; } + } + + protected static bool CharEquals(char expected, char actual) + { + return Char.ToLowerInvariant(expected) == Char.ToLowerInvariant(actual); + } + + protected bool CharEquals(char compare) + { + return CharEquals(Current, compare); + } + + protected char Peek() + { + if (!HasNext) + { + return char.MinValue; + } + return (char)Splitter.Peek(); + } + + #endregion + } + + class SeparatorLineReader : ScriptReader + { + private StringBuilder _builder = new StringBuilder(); + private bool _foundGo; + private bool _gFound; + + public SeparatorLineReader(ScriptSplitter splitter) + : base(splitter) + { + } + + void Reset() + { + _foundGo = false; + _gFound = false; + _builder = new StringBuilder(); + } + + protected override bool ReadDashDashComment() + { + if (!_foundGo) + { + base.ReadDashDashComment(); + return false; + } + base.ReadDashDashComment(); + return true; + } + + protected override void ReadSlashStarComment() + { + if (_foundGo) + { + throw new NHibernate.Exceptions.SqlParseException(@"Incorrect syntax was encountered while parsing GO. Cannot have a slash star /* comment */ after a GO statement."); + } + base.ReadSlashStarComment(); + } + + protected override bool ReadNext() + { + if (EndOfLine) //End of line or script + { + if (!_foundGo) + { + _builder.Append(Current); + Splitter.Append(_builder.ToString()); + Splitter.SetParser(new SeparatorLineReader(Splitter)); + return false; + } + Reset(); + return true; + } + + if (WhiteSpace) + { + _builder.Append(Current); + return false; + } + + if (!CharEquals('g') && !CharEquals('o')) + { + FoundNonEmptyCharacter(Current); + return false; + } + + if (CharEquals('o')) + { + if (CharEquals('g', LastChar) && !_foundGo) + { + _foundGo = true; + } + else + { + FoundNonEmptyCharacter(Current); + } + } + + if (CharEquals('g', Current)) + { + if (_gFound || (!Char.IsWhiteSpace(LastChar) && LastChar != char.MinValue)) + { + FoundNonEmptyCharacter(Current); + return false; + } + + _gFound = true; + } + + if (!HasNext && _foundGo) + { + Reset(); + return true; + } + + _builder.Append(Current); + return false; + } + + void FoundNonEmptyCharacter(char c) + { + _builder.Append(c); + Splitter.Append(_builder.ToString()); + Splitter.SetParser(new SqlScriptReader(Splitter)); + } + } + + class SqlScriptReader : ScriptReader + { + public SqlScriptReader(ScriptSplitter splitter) + : base(splitter) + { + } + + protected override bool ReadNext() + { + if (EndOfLine) //end of line + { + Splitter.Append(Current); + Splitter.SetParser(new SeparatorLineReader(Splitter)); + return false; + } + + Splitter.Append(Current); + return false; + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2010-01-06 21:05:58
|
Revision: 4908 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4908&view=rev Author: ayenderahien Date: 2010-01-06 21:05:51 +0000 (Wed, 06 Jan 2010) Log Message: ----------- Completing NH2055 previous commit Modified Paths: -------------- branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/AuxType.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Fixture.cs branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Mappings.hbm.xml Modified: branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2010-01-06 20:52:28 UTC (rev 4907) +++ branches/2.1.x/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2010-01-06 21:05:51 UTC (rev 4908) @@ -493,5 +493,13 @@ { get { return true; } } + + public override bool SupportsSqlBatches + { + get + { + return true; + } + } } } Property changes on: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/AuxType.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/AuxType.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/AuxType.cs 2010-01-06 21:05:51 UTC (rev 4908) @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using NHibernate; +using NHibernate.Engine; +using NHibernate.Mapping; + +namespace NHibernate.Test.NHSpecificTest.NH2055 +{ + public class AuxType : AbstractAuxiliaryDatabaseObject + { + + override public string SqlCreateString(Dialect.Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema) + { + return "select '" + Parameters["scriptParameter"] + "'"; + } + + override public string SqlDropString(Dialect.Dialect dialect, string defaultCatalog, string defaultSchema) + { + return "select 'drop script'"; + } + + } +} \ No newline at end of file Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Fixture.cs =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Fixture.cs (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Fixture.cs 2010-01-06 21:05:51 UTC (rev 4908) @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Data; +using NUnit.Framework; +using NHibernate.Tool.hbm2ddl; +using System.Text; +using NHibernate.Cfg; + +namespace NHibernate.Test.NHSpecificTest.NH2055 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return (dialect is Dialect.MsSql2000Dialect); + } + + protected override void Configure(Configuration configuration) + { + base.Configure(configuration); + cfg = configuration; + } + + [Test] + public void CanCreateAndDropSchema() + { + using(var s = sessions.OpenSession()) + { + using(var cmd = s.Connection.CreateCommand()) + { + cmd.CommandType = CommandType.StoredProcedure; + + cmd.CommandText = "test_proc1"; + + Assert.AreEqual(1, cmd.ExecuteScalar()); + + cmd.CommandText = "test_proc2"; + + Assert.AreEqual(2, cmd.ExecuteScalar()); + } + } + } + + } +} Added: branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Mappings.hbm.xml =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Mappings.hbm.xml (rev 0) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2055/Mappings.hbm.xml 2010-01-06 21:05:51 UTC (rev 4908) @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2055"> + + <database-object> + <create> + CREATE PROC test_proc1 + AS + SELECT 1 + GO + CREATE PROC test_proc2 + AS + SELECT 2 + GO + </create> + <drop> + if (object_id('test_proc1') is not null ) + DROP PROC test_proc1 + GO + if (object_id('test_proc2') is not null ) + DROP PROC test_proc2 + GO + </drop> + </database-object> + +</hibernate-mapping> Modified: branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-01-06 20:52:28 UTC (rev 4907) +++ branches/2.1.x/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-01-06 21:05:51 UTC (rev 4908) @@ -591,6 +591,8 @@ <Compile Include="NHSpecificTest\NH1938\Model.cs" /> <Compile Include="NHSpecificTest\NH1939\AuxType.cs" /> <Compile Include="NHSpecificTest\NH1939\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2055\AuxType.cs" /> + <Compile Include="NHSpecificTest\NH2055\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2057\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2057\Model.cs" /> <Compile Include="NHSpecificTest\NH1941\Fixture.cs" /> @@ -2023,6 +2025,7 @@ <EmbeddedResource Include="DriverTest\MultiTypeEntity.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2055\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2057\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2011\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\ManyToOneFilters20Behaviour\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |