From: <aye...@us...> - 2009-05-16 06:17:49
|
Revision: 4326 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4326&view=rev Author: ayenderahien Date: 2009-05-16 06:17:39 +0000 (Sat, 16 May 2009) Log Message: ----------- Fixing NH-1763 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/ConditionalProjection.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/DomainClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/SampleTest.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/ConditionalProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/ConditionalProjection.cs 2009-05-16 06:00:06 UTC (rev 4325) +++ trunk/nhibernate/src/NHibernate/Criterion/ConditionalProjection.cs 2009-05-16 06:17:39 UTC (rev 4326) @@ -74,7 +74,7 @@ { for (int i = 0; i < trueTypes.Length; i++) { - if(trueTypes[i] != falseTypes[i]) + if(trueTypes[i].Equals(falseTypes[i]) == false) { areEqual = false; break; Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/DomainClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/DomainClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/DomainClass.cs 2009-05-16 06:17:39 UTC (rev 4326) @@ -0,0 +1,11 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH1763 +{ + public class Customer + { + public Int32 Id { get; set; } + public String Name { get; set; } + public string Name2 { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs 2009-05-16 06:17:39 UTC (rev 4326) @@ -0,0 +1,110 @@ +using System; +using NHibernate.Engine; +using NHibernate.UserTypes; + +namespace NHibernate.Test.NHSpecificTest.NH1763 +{ + /// <summary> + /// Summary description for EmptyStringUserType + /// </summary> + [Serializable] + public class EmptyStringUserType : ICompositeUserType + { + public EmptyStringUserType() + { + } + + public System.Type ReturnedClass + { + get + { + return typeof(string); + } + } + public bool IsMutable + { + get { return true; } + } + public String[] PropertyNames + { + get + { + return new String[] { "string" }; + } + } + + public NHibernate.Type.IType[] PropertyTypes + { + get + { + return new NHibernate.Type.IType[] { NHibernateUtil.String }; + } + } + public object Assemble(object cached, NHibernate.Engine.ISessionImplementor session, object owner) + { + return DeepCopy(cached); + } + + public object Disassemble(Object value, NHibernate.Engine.ISessionImplementor session) + { + return DeepCopy(value); + } + public Object DeepCopy(Object a) + { + if (a == null) return null; + return a; + } + + public new bool Equals(object x, object y) + { + return (x == y) || (x != null && y != null && (x.Equals(y))); + } + + public object NullSafeGet(System.Data.IDataReader rs, String[] names, NHibernate.Engine.ISessionImplementor session, Object owner) + { + return NHibernateUtil.String.NullSafeGet(rs, names[0], session, owner); + } + + public void NullSafeSet(System.Data.IDbCommand st, Object value, int index, NHibernate.Engine.ISessionImplementor session) + { + string str = null; + if (value != null) str = value.ToString().Trim(); + if (str == String.Empty) + { + str = null; + NHibernateUtil.String.NullSafeSet(st, str, index, session); + } + else + NHibernateUtil.String.NullSafeSet(st, value, index, session); + + } + + public Object GetPropertyValue(Object component, int property) + { + return null; + } + + public void SetPropertyValue(Object object1, int i, Object object2) + { + + } + + + #region ICompositeUserType Members + + + public int GetHashCode(object x) + { + return x == null ? typeof(string).GetHashCode() : x.GetHashCode(); + + } + + public object Replace(object original, object target, ISessionImplementor session, object owner) + { + return DeepCopy(original); + } + + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/Mappings.hbm.xml 2009-05-16 06:17:39 UTC (rev 4326) @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1763" + default-lazy="false"> + + <class name="Customer"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="Name" type="NHibernate.Test.NHSpecificTest.NH1763.EmptyStringUserType, NHibernate.Test"> + <column name="Name"/> + </property> + <property name="Name2" type="NHibernate.Test.NHSpecificTest.NH1763.EmptyStringUserType, NHibernate.Test"> + <column name="Name2"/> + </property> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/SampleTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/SampleTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/SampleTest.cs 2009-05-16 06:17:39 UTC (rev 4326) @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using NHibernate.Criterion; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1763 +{ + [TestFixture] + public class SampleTest : BugTestCase + { + [Test] + public void CanUseConditionalOnCompositeType() + { + using (ISession session = OpenSession()) + { + session.CreateCriteria<Customer>() + .SetProjection(Projections.Conditional(Restrictions.IdEq(1), + Projections.Property("Name"), + Projections.Property("Name2"))) + .List(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-16 06:00:06 UTC (rev 4325) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-16 06:17:39 UTC (rev 4326) @@ -399,6 +399,9 @@ <Compile Include="NHSpecificTest\NH1742\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1760\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH1760\SampleTest.cs" /> + <Compile Include="NHSpecificTest\NH1763\DomainClass.cs" /> + <Compile Include="NHSpecificTest\NH1763\EmptyStringUserType.cs" /> + <Compile Include="NHSpecificTest\NH1763\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH1773\Domain.cs" /> <Compile Include="NHSpecificTest\NH1773\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1775\Domain.cs" /> @@ -1797,6 +1800,7 @@ <EmbeddedResource Include="BulkManipulation\SimpleClass.hbm.xml" /> <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1763\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\ElementsEnums\SimpleWithEnumsNoName.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\ElementsEnums\SimpleWithEnumsPartialName.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1343\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-16 08:09:36
|
Revision: 4328 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4328&view=rev Author: ayenderahien Date: 2009-05-16 08:09:29 +0000 (Sat, 16 May 2009) Log Message: ----------- NH-1714 - changing GetSession to create a new child session if asking for a session with the same entity mode Allows to continue using the same audit scenarios Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/DomainClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/LogClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/SimpleReproductionFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/UseCaseDemonstrationFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-05-16 07:30:51 UTC (rev 4327) +++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-05-16 08:09:29 UTC (rev 4328) @@ -2332,10 +2332,15 @@ { using (new SessionIdLoggingContext(sessionId)) { - if (this.entityMode.Equals(entityMode)) - { - return this; - } + // This is explicitly removed to allow support + // for child sessions that want to flush during + // the parent session lifecycle. See NH-1714, + // and the suggested audit examples. + // + //if (this.entityMode.Equals(entityMode)) + //{ + // return this; + //} if (rootSession != null) { Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/DomainClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/DomainClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/DomainClass.cs 2009-05-16 08:09:29 UTC (rev 4328) @@ -0,0 +1,22 @@ + + +namespace NHibernate.Test.NHSpecificTest.NH1714 +{ + public class DomainClass + { + private byte[] byteData; + private int id; + + public int Id + { + get { return id; } + set { id = value; } + } + + public byte[] ByteData + { + get { return byteData; } + set { byteData = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/LogClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/LogClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/LogClass.cs 2009-05-16 08:09:29 UTC (rev 4328) @@ -0,0 +1,20 @@ +namespace NHibernate.Test.NHSpecificTest.NH1714 +{ + public class LogClass + { + private byte[] byteData; + private int id; + + public int Id + { + get { return id; } + set { id = value; } + } + + public byte[] ByteData + { + get { return byteData; } + set { byteData = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/Mappings.hbm.xml 2009-05-16 08:09:29 UTC (rev 4328) @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1714" default-access="field.camelcase" + default-lazy="false"> + <class name="DomainClass"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="ByteData" /> + </class> + <class name="LogClass"> + <id name="Id"> + <generator class="native" /> + </id> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/SimpleReproductionFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/SimpleReproductionFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/SimpleReproductionFixture.cs 2009-05-16 08:09:29 UTC (rev 4328) @@ -0,0 +1,43 @@ +using System; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1714 +{ + [TestFixture] + public class SimpleReproductionFixture : BugTestCase + { + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return dialect as MsSql2005Dialect != null; + } + + [Test] + public void DbCommandsFromEventListenerShouldBeEnlistedInRunningTransaction() + { + using (ISession session = OpenSession()) + { + using (var tx = session.BeginTransaction()) + { + var entity = new DomainClass(); + session.Save(entity); + + using (var otherSession = session.GetSession(EntityMode.Poco)) + { + otherSession.Save(new DomainClass()); + otherSession.Flush(); + } + + tx.Commit(); + } + } + + using(var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + session.Delete("from DomainClass"); + tx.Commit(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/UseCaseDemonstrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/UseCaseDemonstrationFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1714/UseCaseDemonstrationFixture.cs 2009-05-16 08:09:29 UTC (rev 4328) @@ -0,0 +1,73 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using NHibernate.Dialect; +using NHibernate.Event; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1714 +{ + [TestFixture] + public class UseCaseDemonstrationFixture : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + var listener = new IPreInsertEventListener[this.cfg.EventListeners.PreInsertEventListeners.Length + 1]; + this.cfg.EventListeners.PreInsertEventListeners.CopyTo(listener, 0); + listener[listener.Length - 1] = new MyCustomEventListener(); + + this.cfg.EventListeners.PreInsertEventListeners = listener; + } + + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return dialect as MsSql2005Dialect != null; + } + + [Test] + public void DbCommandsFromEventListenerShouldBeEnlistedInRunningTransaction() + { + using (ISession session = this.OpenSession()) + { + using (var tx = session.BeginTransaction()) + { + var entity = new DomainClass(); + session.Save(entity); + + tx.Commit(); + } + } + + using (ISession session = this.OpenSession()) + { + using (var tx = session.BeginTransaction()) + { + session.Delete("from DomainClass"); + session.Delete("from LogClass"); + tx.Commit(); + } + } + } + } + + public class MyCustomEventListener : IPreInsertEventListener + { + public bool OnPreInsert(PreInsertEvent e) + { + if(e.Entity is DomainClass == false) + return false; + + // this will join into the parent's transaction + using (var session = e.Session.GetSession(EntityMode.Poco)) + { + //should insert log record here + session.Save(new LogClass()); + session.Flush(); + } + + return false; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-16 07:30:51 UTC (rev 4327) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-16 08:09:29 UTC (rev 4328) @@ -387,6 +387,10 @@ <Compile Include="NHSpecificTest\NH1713\Fixture.cs"> <SubType>Code</SubType> </Compile> + <Compile Include="NHSpecificTest\NH1714\DomainClass.cs" /> + <Compile Include="NHSpecificTest\NH1714\LogClass.cs" /> + <Compile Include="NHSpecificTest\NH1714\SimpleReproductionFixture.cs" /> + <Compile Include="NHSpecificTest\NH1714\UseCaseDemonstrationFixture.cs" /> <Compile Include="NHSpecificTest\NH1715\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1715\ClassA.cs" /> <Compile Include="NHSpecificTest\NH1716\ClassA.cs" /> @@ -1800,6 +1804,7 @@ <EmbeddedResource Include="BulkManipulation\SimpleClass.hbm.xml" /> <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1714\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1763\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\ElementsEnums\SimpleWithEnumsNoName.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\ElementsEnums\SimpleWithEnumsPartialName.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-17 16:36:02
|
Revision: 4333 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4333&view=rev Author: fabiomaulo Date: 2009-05-17 16:35:57 +0000 (Sun, 17 May 2009) Log Message: ----------- Fix NH-1093 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Util/PropertiesHelper.cs trunk/nhibernate/src/NHibernate.Test/LogSpy.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Cache/FakeCache.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/SimpleCached.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Cache/NoCachingEnabledException.cs Added: trunk/nhibernate/src/NHibernate/Cache/FakeCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/FakeCache.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cache/FakeCache.cs 2009-05-17 16:35:57 UTC (rev 4333) @@ -0,0 +1,50 @@ +namespace NHibernate.Cache +{ + /// <summary> + /// Used by <see cref="NoCacheProvider"/> + /// </summary> + public class FakeCache : ICache + { + public FakeCache(string regionName) + { + RegionName = regionName; + } + + public object Get(object key) + { + return null; + } + + public void Put(object key, object value) + { + } + + public void Remove(object key) + { + } + + public void Clear() + { + } + + public void Destroy() + { + } + + public void Lock(object key) + { + } + + public void Unlock(object key) + { + } + + public long NextTimestamp() + { + return Timestamper.Next(); + } + + public int Timeout { get; private set; } + public string RegionName { get; private set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs 2009-05-17 05:37:33 UTC (rev 4332) +++ trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs 2009-05-17 16:35:57 UTC (rev 4333) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using log4net; namespace NHibernate.Cache { @@ -8,6 +9,10 @@ /// </summary> public class NoCacheProvider : ICacheProvider { + private static readonly ILog log = LogManager.GetLogger(typeof(NoCacheProvider)); + + public const string WarnMessage = "Second-level cache is enabled in a class, but no cache provider was selected. Fake cache used."; + /// <summary> /// Configure the cache /// </summary> @@ -16,7 +21,9 @@ /// <exception cref="CacheException" /> public ICache BuildCache(string regionName, IDictionary<string, string> properties) { - throw new NoCachingEnabledException(); + // NH different behavior because NH-1093 + log.Warn(WarnMessage); + return new FakeCache(regionName); } /// <summary> Deleted: trunk/nhibernate/src/NHibernate/Cache/NoCachingEnabledException.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/NoCachingEnabledException.cs 2009-05-17 05:37:33 UTC (rev 4332) +++ trunk/nhibernate/src/NHibernate/Cache/NoCachingEnabledException.cs 2009-05-17 16:35:57 UTC (rev 4333) @@ -1,17 +0,0 @@ -using System; -using Environment = NHibernate.Cfg.Environment; - -namespace NHibernate.Cache -{ - [Serializable] - public class NoCachingEnabledException : CacheException - { - private const string ExceptionMessage = "Second-level cache is enabled, but no cache provider was selected. " + - "Please use " + Environment.CacheProvider + " to specify a cache provider such as SysCacheProvider"; - - public NoCachingEnabledException() - : base(ExceptionMessage) - { - } - } -} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-17 05:37:33 UTC (rev 4332) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-17 16:35:57 UTC (rev 4333) @@ -454,6 +454,7 @@ <Compile Include="Bytecode\HibernateByteCodeException.cs" /> <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> + <Compile Include="Cache\FakeCache.cs" /> <Compile Include="Cfg\MappingSchema\AbstractDecoratable.cs" /> <Compile Include="Cfg\MappingSchema\HbmTimestamp.cs" /> <Compile Include="Cfg\MappingSchema\HbmVersion.cs" /> @@ -641,7 +642,6 @@ <Compile Include="Cache\FilterKey.cs" /> <Compile Include="Cache\IOptimisticCacheSource.cs" /> <Compile Include="Cache\NoCacheProvider.cs" /> - <Compile Include="Cache\NoCachingEnabledException.cs" /> <Compile Include="Cfg\ClassExtractor.cs" /> <Compile Include="Cfg\ConfigurationSchema\CfgXmlHelper.cs" /> <Compile Include="Cfg\ConfigurationSchema\ClassCacheConfiguration.cs" /> Modified: trunk/nhibernate/src/NHibernate/Util/PropertiesHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/PropertiesHelper.cs 2009-05-17 05:37:33 UTC (rev 4332) +++ trunk/nhibernate/src/NHibernate/Util/PropertiesHelper.cs 2009-05-17 16:35:57 UTC (rev 4333) @@ -41,6 +41,10 @@ { string value; properties.TryGetValue(property, out value); + if(value == string.Empty) + { + value = null; + } return value ?? defaultValue; } Modified: trunk/nhibernate/src/NHibernate.Test/LogSpy.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/LogSpy.cs 2009-05-17 05:37:33 UTC (rev 4332) +++ trunk/nhibernate/src/NHibernate.Test/LogSpy.cs 2009-05-17 16:35:57 UTC (rev 4333) @@ -14,7 +14,7 @@ private readonly Logger logger; private readonly Level prevLogLevel; - public LogSpy(ILog log, bool disable) + public LogSpy(ILog log, Level level) { logger = log.Logger as Logger; if (logger == null) @@ -24,13 +24,18 @@ // Change the log level to DEBUG and temporarily save the previous log level prevLogLevel = logger.Level; - logger.Level = disable ? Level.Off : Level.Debug; + logger.Level = level; // Add a new MemoryAppender to the logger. appender = new MemoryAppender(); logger.AddAppender(appender); } + public LogSpy(ILog log, bool disable) + : this(log, disable ? Level.Off : Level.Debug) + { + } + public LogSpy(ILog log) : this(log, false) { } public LogSpy(System.Type loggerType) : this(LogManager.GetLogger(loggerType), false) { } public LogSpy(System.Type loggerType, bool disable) : this(LogManager.GetLogger(loggerType), disable) { } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Fixture.cs 2009-05-17 16:35:57 UTC (rev 4333) @@ -0,0 +1,93 @@ +using log4net; +using NHibernate.Cfg; +using NUnit.Framework; +using log4net.Core; + +namespace NHibernate.Test.NHSpecificTest.NH1093 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void Configure(Configuration configuration) + { + configuration.SetProperty(Environment.CacheProvider, string.Empty); + configuration.SetProperty(Environment.UseQueryCache, "true"); + configuration.SetProperty(Environment.UseSecondLevelCache, "true"); + } + + protected override string CacheConcurrencyStrategy + { + get { return null; } + } + + private void Cleanup() + { + using (ISession s = sessions.OpenSession()) + { + using (s.BeginTransaction()) + { + s.CreateQuery("delete from SimpleCached").ExecuteUpdate(); + s.Transaction.Commit(); + } + } + } + + private void FillDb() + { + using (ISession s = sessions.OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(new SimpleCached {Description = "Simple 1"}); + s.Save(new SimpleCached {Description = "Simple 2"}); + tx.Commit(); + } + } + } + + [Test] + [Description("Without configured cache, shouldn't throw exception")] + public void NoException() + { + FillDb(); + NormalList(); + CriteriaQueryCache(); + HqlQueryCache(); + Cleanup(); + } + + private void HqlQueryCache() + { + using (ISession s = OpenSession()) + { + s.CreateQuery("from SimpleCached").SetCacheable(true).List<SimpleCached>(); + } + } + + private void CriteriaQueryCache() + { + using (ISession s = OpenSession()) + { + s.CreateCriteria<SimpleCached>().SetCacheable(true).List<SimpleCached>(); + } + } + + private void NormalList() + { + using (ISession s = OpenSession()) + { + s.CreateCriteria<SimpleCached>().List<SimpleCached>(); + } + } + + protected override void BuildSessionFactory() + { + // Without configured cache, should log warn. + using (var ls = new LogSpy(LogManager.GetLogger("NHibernate"), Level.Warn)) + { + base.BuildSessionFactory(); + Assert.That(ls.GetWholeLog(), Text.Contains("Fake cache used")); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/Mappings.hbm.xml 2009-05-17 16:35:57 UTC (rev 4333) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1093"> + + <class name="SimpleCached"> + <cache region="something" usage="nonstrict-read-write"/> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Description"/> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/SimpleCached.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/SimpleCached.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1093/SimpleCached.cs 2009-05-17 16:35:57 UTC (rev 4333) @@ -0,0 +1,8 @@ +namespace NHibernate.Test.NHSpecificTest.NH1093 +{ + public class SimpleCached + { + public virtual int Id { get; set; } + public virtual string Description { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-17 05:37:33 UTC (rev 4332) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-17 16:35:57 UTC (rev 4333) @@ -334,6 +334,8 @@ <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagPartialNameFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\IntEnumsBagFixture.cs" /> <Compile Include="NHSpecificTest\ElementsEnums\Something.cs" /> + <Compile Include="NHSpecificTest\NH1093\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1093\SimpleCached.cs" /> <Compile Include="NHSpecificTest\NH1264\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1264\Name.cs" /> <Compile Include="NHSpecificTest\NH1264\Passenger.cs" /> @@ -1804,6 +1806,7 @@ <EmbeddedResource Include="BulkManipulation\SimpleClass.hbm.xml" /> <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1093\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1714\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1763\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\ElementsEnums\SimpleWithEnumsNoName.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-18 19:38:02
|
Revision: 4337 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4337&view=rev Author: fabiomaulo Date: 2009-05-18 19:37:55 +0000 (Mon, 18 May 2009) Log Message: ----------- Fix NH-1783 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/DateType.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/DomainClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/SampleTest.cs Modified: trunk/nhibernate/src/NHibernate/Type/DateType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/DateType.cs 2009-05-18 05:31:15 UTC (rev 4336) +++ trunk/nhibernate/src/NHibernate/Type/DateType.cs 2009-05-18 19:37:55 UTC (rev 4337) @@ -49,15 +49,16 @@ public override void Set(IDbCommand st, object value, int index) { - IDataParameter parm = st.Parameters[index] as IDataParameter; - if ((DateTime)value < BaseDateValue) + var parm = st.Parameters[index] as IDataParameter; + var dateTime = (DateTime)value; + if (dateTime < BaseDateValue) { parm.Value = DBNull.Value; } else { parm.DbType = DbType.Date; - parm.Value = value; + parm.Value = dateTime.Date; } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/DomainClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/DomainClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/DomainClass.cs 2009-05-18 19:37:55 UTC (rev 4337) @@ -0,0 +1,11 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH1783 +{ + public class DomainClass + { + public int Id { get; set; } + + public DateTime BirthDate { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/Mappings.hbm.xml 2009-05-18 19:37:55 UTC (rev 4337) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1783" + default-lazy="false"> + <class name="DomainClass"> + <id name="Id"> + <generator class="assigned" /> + </id> + <property name="BirthDate" type="Date" /> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/SampleTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/SampleTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1783/SampleTest.cs 2009-05-18 19:37:55 UTC (rev 4337) @@ -0,0 +1,38 @@ +using System; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1783 +{ + [TestFixture] + public class SampleTest : BugTestCase + { + [Test] + public void DatePropertyShouldBeStoredWithoutTimePart() + { + using (ISession session = OpenSession()) + using (ITransaction tx = session.BeginTransaction()) + { + var entity = new DomainClass {Id = 1, BirthDate = new DateTime(1950, 2, 13, 3, 12, 10)}; + session.Save(entity); + tx.Commit(); + } + + using (ISession session = OpenSession()) + { + // upload the result using DateTime type to verify it does not have the time-part. + var l = session.CreateSQLQuery("SELECT BirthDate AS bd FROM DomainClass") + .AddScalar("bd",NHibernateUtil.DateTime).List(); + var actual = (DateTime) l[0]; + var expected = new DateTime(1950, 2, 13); + Assert.That(actual, Is.EqualTo(expected)); + } + + using (ISession session = OpenSession()) + using (ITransaction tx = session.BeginTransaction()) + { + session.CreateQuery("delete from DomainClass").ExecuteUpdate(); + tx.Commit(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-18 05:31:15 UTC (rev 4336) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-18 19:37:55 UTC (rev 4337) @@ -424,6 +424,8 @@ <Compile Include="NHSpecificTest\NH1775\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1776\Category.cs" /> <Compile Include="NHSpecificTest\NH1776\FilterQueryTwiceFixture.cs" /> + <Compile Include="NHSpecificTest\NH1783\DomainClass.cs" /> + <Compile Include="NHSpecificTest\NH1783\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -1816,6 +1818,7 @@ <EmbeddedResource Include="BulkManipulation\SimpleClass.hbm.xml" /> <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1783\Mappings.hbm.xml" /> <EmbeddedResource Include="LazyOneToOne\Person.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1747\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1159\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-05-18 21:23:58
|
Revision: 4338 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4338&view=rev Author: fabiomaulo Date: 2009-05-18 21:23:51 +0000 (Mon, 18 May 2009) Log Message: ----------- Starting fix of NH-1786 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs trunk/nhibernate/src/NHibernate/Bytecode/IObjectsFactory.cs trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs Added: trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs 2009-05-18 21:23:51 UTC (rev 4338) @@ -0,0 +1,22 @@ +using System; + +namespace NHibernate.Bytecode +{ + public class ActivatorObjectsFactory: IObjectsFactory + { + public object CreateInstance(System.Type type) + { + throw new NotImplementedException(); + } + + public object CreateInstance(System.Type type, bool nonPublic) + { + throw new NotImplementedException(); + } + + public object CreateInstance(System.Type type, params object[] ctorArgs) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Bytecode/IObjectsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/IObjectsFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Bytecode/IObjectsFactory.cs 2009-05-18 21:23:51 UTC (rev 4338) @@ -0,0 +1,29 @@ +namespace NHibernate.Bytecode +{ + public interface IObjectsFactory + { + /// <summary> + /// Creates an instance of the specified type. + /// </summary> + /// <param name="type">The type of object to create.</param> + /// <returns>A reference to the created object.</returns> + object CreateInstance(System.Type type); + + /// <summary> + /// Creates an instance of the specified type. + /// </summary> + /// <param name="type">The type of object to create.</param> + /// <param name="nonPublic">true if a public or nonpublic default constructor can match; false if only a public default constructor can match.</param> + /// <returns>A reference to the created object.</returns> + object CreateInstance(System.Type type, bool nonPublic); + + /// <summary> + /// Creates an instance of the specified type using the constructor + /// that best matches the specified parameters. + /// </summary> + /// <param name="type">The type of object to create.</param> + /// <param name="ctorArgs">An array of constructor arguments.</param> + /// <returns>A reference to the created object.</returns> + object CreateInstance(System.Type type, params object[] ctorArgs); + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-18 19:37:55 UTC (rev 4337) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-18 21:23:51 UTC (rev 4338) @@ -451,7 +451,9 @@ <Compile Include="AdoNet\Util\FormatStyle.cs" /> <Compile Include="AdoNet\Util\IFormatter.cs" /> <Compile Include="AdoNet\Util\SqlStatementLogger.cs" /> + <Compile Include="Bytecode\ActivatorObjectsFactory.cs" /> <Compile Include="Bytecode\HibernateByteCodeException.cs" /> + <Compile Include="Bytecode\IObjectsFactory.cs" /> <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> <Compile Include="Cache\FakeCache.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs 2009-05-18 21:23:51 UTC (rev 4338) @@ -0,0 +1,72 @@ +using System; +using NHibernate.Bytecode; +using NUnit.Framework; + +namespace NHibernate.Test.Bytecode +{ + [TestFixture, Ignore("Not implemented yet.")] + public class ActivatorObjectFactoryFixture + { + public class WithOutPublicParameterLessCtor + { + public string Something { get; set; } + protected WithOutPublicParameterLessCtor() { } + + public WithOutPublicParameterLessCtor(string something) + { + Something = something; + } + } + + public class PublicParameterLessCtor + { + } + + public struct ValueType + { + public string Something { get; set; } + } + + [Test] + public void CreateInstanceDefCtor() + { + var of = new ActivatorObjectsFactory(); + Assert.Throws<ArgumentNullException>(() => of.CreateInstance(null)); + Assert.Throws<ArgumentNullException>(() => of.CreateInstance(typeof(WithOutPublicParameterLessCtor))); + var instance = of.CreateInstance(typeof(PublicParameterLessCtor)); + Assert.That(instance, Is.Not.Null); + Assert.That(instance, Is.InstanceOf<PublicParameterLessCtor>()); + } + + [Test] + public void CreateInstanceWithNoPublicCtor() + { + var of = new ActivatorObjectsFactory(); + Assert.Throws<ArgumentNullException>(() => of.CreateInstance(null, false)); + var instance = of.CreateInstance(typeof(WithOutPublicParameterLessCtor), true); + Assert.That(instance, Is.Not.Null); + Assert.That(instance, Is.InstanceOf<WithOutPublicParameterLessCtor>()); + } + + [Test] + public void CreateInstanceOfValueType() + { + var of = new ActivatorObjectsFactory(); + var instance = of.CreateInstance(typeof(ValueType), true); + Assert.That(instance, Is.Not.Null); + Assert.That(instance, Is.InstanceOf<ValueType>()); + } + + [Test] + public void CreateInstanceWithArguments() + { + var of = new ActivatorObjectsFactory(); + Assert.Throws<ArgumentNullException>(() => of.CreateInstance(null, new[] {1})); + var value = "a value"; + var instance = of.CreateInstance(typeof(WithOutPublicParameterLessCtor), new[]{value}); + Assert.That(instance, Is.Not.Null); + Assert.That(instance, Is.InstanceOf<WithOutPublicParameterLessCtor>()); + Assert.That(((WithOutPublicParameterLessCtor)instance).Something, Is.EqualTo(value)); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-18 19:37:55 UTC (rev 4337) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-18 21:23:51 UTC (rev 4338) @@ -88,6 +88,7 @@ <Compile Include="BulkManipulation\BaseFixture.cs" /> <Compile Include="BulkManipulation\HQLBulkOperations.cs" /> <Compile Include="BulkManipulation\SimpleClass.cs" /> + <Compile Include="Bytecode\ActivatorObjectFactoryFixture.cs" /> <Compile Include="Bytecode\Lightweight\BytecodeProviderFixture.cs" /> <Compile Include="Bytecode\WrongProxyFactoryFactory.cs" /> <Compile Include="CacheTest\CacheFixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-18 21:33:05
|
Revision: 4341 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4341&view=rev Author: fabiomaulo Date: 2009-05-18 21:32:58 +0000 (Mon, 18 May 2009) Log Message: ----------- Minor (removed warn on XML comment) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Event/AbstractPreDatabaseOperationEvent.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlSqlWalkerTreeNodeStream.cs Modified: trunk/nhibernate/src/NHibernate/Event/AbstractPreDatabaseOperationEvent.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/AbstractPreDatabaseOperationEvent.cs 2009-05-18 21:29:16 UTC (rev 4340) +++ trunk/nhibernate/src/NHibernate/Event/AbstractPreDatabaseOperationEvent.cs 2009-05-18 21:32:58 UTC (rev 4341) @@ -30,7 +30,7 @@ public object Id { get; private set; } /// <summary> - /// The persister for the <see cref="Entity">. + /// The persister for the <see cref="Entity"/>. /// </summary> public IEntityPersister Persister { get; private set; } Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlSqlWalkerTreeNodeStream.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlSqlWalkerTreeNodeStream.cs 2009-05-18 21:29:16 UTC (rev 4340) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlSqlWalkerTreeNodeStream.cs 2009-05-18 21:32:58 UTC (rev 4341) @@ -50,7 +50,7 @@ } /// <summary> - /// Count the number of child nodes (including DOWNs & UPs) of a parent node + /// Count the number of child nodes (including DOWNs and UPs) of a parent node /// </summary> /// <param name="parentIndex">The index of the parent in the node array</param> /// <returns>The number of child nodes</returns> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-18 22:28:42
|
Revision: 4344 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4344&view=rev Author: fabiomaulo Date: 2009-05-18 22:28:37 +0000 (Mon, 18 May 2009) Log Message: ----------- ActivatorObjectsFactory implemented Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs Modified: trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs 2009-05-18 22:20:04 UTC (rev 4343) +++ trunk/nhibernate/src/NHibernate/Bytecode/ActivatorObjectsFactory.cs 2009-05-18 22:28:37 UTC (rev 4344) @@ -6,17 +6,17 @@ { public object CreateInstance(System.Type type) { - throw new NotImplementedException(); + return Activator.CreateInstance(type); } public object CreateInstance(System.Type type, bool nonPublic) { - throw new NotImplementedException(); + return Activator.CreateInstance(type, nonPublic); } public object CreateInstance(System.Type type, params object[] ctorArgs) { - throw new NotImplementedException(); + return Activator.CreateInstance(type, ctorArgs); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs 2009-05-18 22:20:04 UTC (rev 4343) +++ trunk/nhibernate/src/NHibernate.Test/Bytecode/ActivatorObjectFactoryFixture.cs 2009-05-18 22:28:37 UTC (rev 4344) @@ -4,7 +4,7 @@ namespace NHibernate.Test.Bytecode { - [TestFixture, Ignore("Not implemented yet.")] + [TestFixture] public class ActivatorObjectFactoryFixture { public class WithOutPublicParameterLessCtor @@ -27,21 +27,28 @@ public string Something { get; set; } } + protected virtual IObjectsFactory GetObjectsFactory() + { + return new ActivatorObjectsFactory(); + } + [Test] public void CreateInstanceDefCtor() { - var of = new ActivatorObjectsFactory(); + IObjectsFactory of = GetObjectsFactory(); Assert.Throws<ArgumentNullException>(() => of.CreateInstance(null)); - Assert.Throws<ArgumentNullException>(() => of.CreateInstance(typeof(WithOutPublicParameterLessCtor))); + Assert.Throws<MissingMethodException>(() => of.CreateInstance(typeof(WithOutPublicParameterLessCtor))); var instance = of.CreateInstance(typeof(PublicParameterLessCtor)); Assert.That(instance, Is.Not.Null); Assert.That(instance, Is.InstanceOf<PublicParameterLessCtor>()); } + + [Test] public void CreateInstanceWithNoPublicCtor() { - var of = new ActivatorObjectsFactory(); + IObjectsFactory of = GetObjectsFactory(); Assert.Throws<ArgumentNullException>(() => of.CreateInstance(null, false)); var instance = of.CreateInstance(typeof(WithOutPublicParameterLessCtor), true); Assert.That(instance, Is.Not.Null); @@ -51,7 +58,7 @@ [Test] public void CreateInstanceOfValueType() { - var of = new ActivatorObjectsFactory(); + IObjectsFactory of = GetObjectsFactory(); var instance = of.CreateInstance(typeof(ValueType), true); Assert.That(instance, Is.Not.Null); Assert.That(instance, Is.InstanceOf<ValueType>()); @@ -60,7 +67,7 @@ [Test] public void CreateInstanceWithArguments() { - var of = new ActivatorObjectsFactory(); + IObjectsFactory of = GetObjectsFactory(); Assert.Throws<ArgumentNullException>(() => of.CreateInstance(null, new[] {1})); var value = "a value"; var instance = of.CreateInstance(typeof(WithOutPublicParameterLessCtor), new[]{value}); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-18 23:00:57
|
Revision: 4345 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4345&view=rev Author: fabiomaulo Date: 2009-05-18 23:00:41 +0000 (Mon, 18 May 2009) Log Message: ----------- - Base abstract class for internal bytecode providers (with ActivatorObjectsFactory) - Refactoring all internals bytecode providers. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs trunk/nhibernate/src/NHibernate/Bytecode/IBytecodeProvider.cs trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs Added: trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs 2009-05-18 23:00:41 UTC (rev 4345) @@ -0,0 +1,67 @@ +using System; +using NHibernate.Properties; +using NHibernate.Util; + +namespace NHibernate.Bytecode +{ + public abstract class AbstractBytecodeProvider : IBytecodeProvider, IInjectableProxyFactoryFactory + { + private readonly IObjectsFactory objectsFactory = new ActivatorObjectsFactory(); + protected System.Type proxyFactoryFactory; + + #region IBytecodeProvider Members + + public virtual IProxyFactoryFactory ProxyFactoryFactory + { + get + { + if (proxyFactoryFactory != null) + { + try + { + return (IProxyFactoryFactory)Activator.CreateInstance(proxyFactoryFactory); + } + catch (Exception e) + { + throw new HibernateByteCodeException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); + } + } + + throw new ProxyFactoryFactoryNotConfiguredException(); + } + } + + public abstract IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters); + + public virtual IObjectsFactory ObjectsFactory + { + get { return objectsFactory; } + } + + #endregion + + #region IInjectableProxyFactoryFactory Members + + public virtual void SetProxyFactoryFactory(string typeName) + { + System.Type pffc; + try + { + pffc = ReflectHelper.ClassForName(typeName); + } + catch (Exception he) + { + throw new UnableToLoadProxyFactoryFactoryException(typeName, he); + } + + if (typeof(IProxyFactoryFactory).IsAssignableFrom(pffc) == false) + { + var he = new HibernateByteCodeException(pffc.FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName); + throw he; + } + proxyFactoryFactory = pffc; + } + + #endregion + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2009-05-18 22:28:37 UTC (rev 4344) +++ trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2009-05-18 23:00:41 UTC (rev 4345) @@ -5,42 +5,20 @@ using log4net; using Microsoft.CSharp; using NHibernate.Properties; -using NHibernate.Util; namespace NHibernate.Bytecode.CodeDom { /// <summary> /// CodeDOM-based bytecode provider. /// </summary> - public class BytecodeProviderImpl : IBytecodeProvider, IInjectableProxyFactoryFactory + public class BytecodeProviderImpl : AbstractBytecodeProvider { private static readonly ILog log = LogManager.GetLogger(typeof (BytecodeProviderImpl)); - private System.Type proxyFactoryFactory; #region IBytecodeProvider Members - public IProxyFactoryFactory ProxyFactoryFactory + public override IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) { - get - { - if (proxyFactoryFactory != null) - { - try - { - return (IProxyFactoryFactory) Activator.CreateInstance(proxyFactoryFactory); - } - catch (Exception e) - { - throw new HibernateByteCodeException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); - } - } - - throw new ProxyFactoryFactoryNotConfiguredException(); - } - } - - public IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) - { if (clazz.IsValueType) { // Cannot create optimizer for value types - the setter method will not work. @@ -52,30 +30,6 @@ #endregion - #region Implementation of IInjectableProxyFactoryFactory - - public void SetProxyFactoryFactory(string typeName) - { - System.Type pffc; - try - { - pffc = ReflectHelper.ClassForName(typeName); - } - catch (Exception he) - { - throw new UnableToLoadProxyFactoryFactoryException(typeName, he); - } - - if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) - { - var he = new HibernateByteCodeException(pffc.FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName); - throw he; - } - proxyFactoryFactory = pffc; - } - - #endregion - #region Nested type: Generator public class Generator Modified: trunk/nhibernate/src/NHibernate/Bytecode/IBytecodeProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/IBytecodeProvider.cs 2009-05-18 22:28:37 UTC (rev 4344) +++ trunk/nhibernate/src/NHibernate/Bytecode/IBytecodeProvider.cs 2009-05-18 23:00:41 UTC (rev 4345) @@ -20,6 +20,8 @@ /// <returns>The reflection optimization delegate.</returns> IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters); + IObjectsFactory ObjectsFactory { get; } + // <summary> Generate a ClassTransformer capable of performing bytecode manipulation. </summary> // <param name="classFilter"> // filter used to limit which classes are to be instrumented via this ClassTransformer. @@ -31,6 +33,5 @@ // <returns> The appropriate ClassTransformer. </returns> // Not ported //ClassTransformer getTransformer(ClassFilter classFilter, FieldFilter fieldFilter); - } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs 2009-05-18 22:28:37 UTC (rev 4344) +++ trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs 2009-05-18 23:00:41 UTC (rev 4345) @@ -1,6 +1,4 @@ -using System; using NHibernate.Properties; -using NHibernate.Util; namespace NHibernate.Bytecode.Lightweight { @@ -12,31 +10,11 @@ /// Used in <see cref="NHibernate.Persister.Entity.AbstractEntityPersister"/> and /// <see cref="NHibernate.Type.ComponentType"/> /// </remarks> - public class BytecodeProviderImpl : IBytecodeProvider, IInjectableProxyFactoryFactory + public class BytecodeProviderImpl : AbstractBytecodeProvider { - private System.Type proxyFactoryFactory; #region IBytecodeProvider Members - public virtual IProxyFactoryFactory ProxyFactoryFactory - { - get - { - if (proxyFactoryFactory != null) - { - try - { - return (IProxyFactoryFactory) Activator.CreateInstance(proxyFactoryFactory); - } - catch (Exception e) - { - throw new HibernateByteCodeException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); - } - } - throw new ProxyFactoryFactoryNotConfiguredException(); - } - } - /// <summary> /// Generate the IReflectionOptimizer object /// </summary> @@ -44,35 +22,11 @@ /// <param name="setters">Array of setters</param> /// <param name="getters">Array of getters</param> /// <returns><see langword="null" /> if the generation fails</returns> - public IReflectionOptimizer GetReflectionOptimizer(System.Type mappedClass, IGetter[] getters, ISetter[] setters) + public override IReflectionOptimizer GetReflectionOptimizer(System.Type mappedClass, IGetter[] getters, ISetter[] setters) { return new ReflectionOptimizer(mappedClass, getters, setters); } #endregion - - #region IInjectableProxyFactoryFactory Members - - public void SetProxyFactoryFactory(string typeName) - { - System.Type pffc; - try - { - pffc = ReflectHelper.ClassForName(typeName); - } - catch (Exception he) - { - throw new UnableToLoadProxyFactoryFactoryException(typeName, he); - } - - if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) - { - var he = new HibernateByteCodeException(pffc.FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName); - throw he; - } - proxyFactoryFactory = pffc; - } - - #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs 2009-05-18 22:28:37 UTC (rev 4344) +++ trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs 2009-05-18 23:00:41 UTC (rev 4345) @@ -1,6 +1,4 @@ -using System; using NHibernate.Properties; -using NHibernate.Util; namespace NHibernate.Bytecode { @@ -8,60 +6,15 @@ /// A <see cref="IBytecodeProvider" /> implementation that returns /// <see langword="null" />, disabling reflection optimization. /// </summary> - public class NullBytecodeProvider : IBytecodeProvider, IInjectableProxyFactoryFactory + public class NullBytecodeProvider : AbstractBytecodeProvider { - private System.Type proxyFactoryFactory; - #region IBytecodeProvider Members - public IProxyFactoryFactory ProxyFactoryFactory + public override IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) { - get - { - if (proxyFactoryFactory != null) - { - try - { - return (IProxyFactoryFactory) Activator.CreateInstance(proxyFactoryFactory); - } - catch (Exception e) - { - throw new HibernateByteCodeException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); - } - } - throw new ProxyFactoryFactoryNotConfiguredException(); - } - } - - public IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) - { return null; } #endregion - - #region Implementation of IInjectableProxyFactoryFactory - - public void SetProxyFactoryFactory(string typeName) - { - System.Type pffc; - try - { - pffc = ReflectHelper.ClassForName(typeName); - } - catch (Exception he) - { - throw new UnableToLoadProxyFactoryFactoryException(typeName, he); - } - - if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) - { - var he = new HibernateByteCodeException(pffc.FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName); - throw he; - } - proxyFactoryFactory = pffc; - } - - #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-18 22:28:37 UTC (rev 4344) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-18 23:00:41 UTC (rev 4345) @@ -449,6 +449,7 @@ <Compile Include="AdoNet\Util\FormatStyle.cs" /> <Compile Include="AdoNet\Util\IFormatter.cs" /> <Compile Include="AdoNet\Util\SqlStatementLogger.cs" /> + <Compile Include="Bytecode\AbstractBytecodeProvider.cs" /> <Compile Include="Bytecode\ActivatorObjectsFactory.cs" /> <Compile Include="Bytecode\HibernateByteCodeException.cs" /> <Compile Include="Bytecode\IObjectsFactory.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-19 00:07:03
|
Revision: 4346 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4346&view=rev Author: fabiomaulo Date: 2009-05-19 00:06:44 +0000 (Tue, 19 May 2009) Log Message: ----------- IObjectsFactory working Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/AuxiliaryDatabaseObjectFactory.cs trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs trunk/nhibernate/src/NHibernate/Driver/ReflectionBasedDriver.cs trunk/nhibernate/src/NHibernate/Exceptions/SQLExceptionConverterFactory.cs trunk/nhibernate/src/NHibernate/Id/IdentifierGeneratorFactory.cs trunk/nhibernate/src/NHibernate/Impl/OracleClientCommandSet.cs trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate/Impl/SqlClientCommandSet.cs trunk/nhibernate/src/NHibernate/Mapping/Collection.cs trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs trunk/nhibernate/src/NHibernate/Tuple/PocoInstantiator.cs trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs trunk/nhibernate/src/NHibernate/Type/CustomCollectionType.cs trunk/nhibernate/src/NHibernate/Type/CustomType.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs Modified: trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Bytecode/AbstractBytecodeProvider.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -19,7 +19,7 @@ { try { - return (IProxyFactoryFactory)Activator.CreateInstance(proxyFactoryFactory); + return (IProxyFactoryFactory) ObjectsFactory.CreateInstance(proxyFactoryFactory); } catch (Exception e) { Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -1717,7 +1717,7 @@ { try { - listeners[i] = Activator.CreateInstance(ReflectHelper.ClassForName(listenerClasses[i])); + listeners[i] = Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(listenerClasses[i])); } catch (Exception e) { Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -185,7 +185,8 @@ try { settings.QueryCacheFactory = - (IQueryCacheFactory) Activator.CreateInstance(ReflectHelper.ClassForName(queryCacheFactoryClassName)); + (IQueryCacheFactory) + Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(queryCacheFactoryClassName)); } catch (Exception cnfe) { @@ -275,7 +276,7 @@ log.Info("Batcher factory: " + tBatcher.AssemblyQualifiedName); try { - return (IBatcherFactory) Activator.CreateInstance(tBatcher); + return (IBatcherFactory) Environment.BytecodeProvider.ObjectsFactory.CreateInstance(tBatcher); } catch (Exception cnfe) { @@ -294,7 +295,9 @@ log.Info("cache provider: " + cacheClassName); try { - return (ICacheProvider) Activator.CreateInstance(ReflectHelper.ClassForName(cacheClassName)); + return + (ICacheProvider) + Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(cacheClassName)); } catch (Exception e) { @@ -330,7 +333,9 @@ log.Info("Query translator: " + className); try { - return (IQueryTranslatorFactory) Activator.CreateInstance(ReflectHelper.ClassForName(className)); + return + (IQueryTranslatorFactory) + Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(className)); } catch (Exception cnfe) { @@ -346,7 +351,9 @@ try { - return (ITransactionFactory)Activator.CreateInstance(ReflectHelper.ClassForName(className)); + return + (ITransactionFactory) + Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(className)); } catch (Exception cnfe) { Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/AuxiliaryDatabaseObjectFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/AuxiliaryDatabaseObjectFactory.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/AuxiliaryDatabaseObjectFactory.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -41,7 +41,8 @@ TypeNameParser.Parse(customTypeName, mappings.DefaultNamespace, mappings.DefaultAssembly).ToString(); System.Type customType = ReflectHelper.ClassForName(className); - IAuxiliaryDatabaseObject customObject = (IAuxiliaryDatabaseObject)Activator.CreateInstance(customType); + IAuxiliaryDatabaseObject customObject = + (IAuxiliaryDatabaseObject) Environment.BytecodeProvider.ObjectsFactory.CreateInstance(customType); foreach (string dialectName in databaseObjectSchema.FindDialectScopeNames()) { Modified: trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -104,7 +104,8 @@ { try { - driver = (IDriver) Activator.CreateInstance(ReflectHelper.ClassForName(driverClass)); + driver = + (IDriver) Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(driverClass)); driver.Configure(settings); } catch (Exception e) Modified: trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -28,7 +28,9 @@ try { log.Info("Initializing connection provider: " + providerClass); - connections = (IConnectionProvider) Activator.CreateInstance(ReflectHelper.ClassForName(providerClass)); + connections = + (IConnectionProvider) + Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(providerClass)); } catch (Exception e) { Modified: trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -184,7 +184,7 @@ { try { - return (Dialect) Activator.CreateInstance(ReflectHelper.ClassForName(dialectName)); + return (Dialect) Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(dialectName)); } catch (Exception e) { Modified: trunk/nhibernate/src/NHibernate/Driver/ReflectionBasedDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/ReflectionBasedDriver.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Driver/ReflectionBasedDriver.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -1,4 +1,3 @@ -using System; using System.Data; using NHibernate.Util; @@ -6,8 +5,8 @@ { public abstract class ReflectionBasedDriver : DriverBase { - private System.Type connectionType; - private System.Type commandType; + private readonly System.Type connectionType; + private readonly System.Type commandType; /// <summary> /// Initializes a new instance of <see cref="ReflectionBasedDriver" /> with @@ -16,7 +15,7 @@ /// <param name="driverAssemblyName">Assembly to load the types from.</param> /// <param name="connectionTypeName">Connection type name.</param> /// <param name="commandTypeName">Command type name.</param> - public ReflectionBasedDriver(string driverAssemblyName, string connectionTypeName, string commandTypeName) + protected ReflectionBasedDriver(string driverAssemblyName, string connectionTypeName, string commandTypeName) { // Try to get the types from an already loaded assembly connectionType = ReflectHelper.TypeFromAssembly(connectionTypeName, driverAssemblyName, false); @@ -36,12 +35,12 @@ public override IDbConnection CreateConnection() { - return (IDbConnection) Activator.CreateInstance(connectionType); + return (IDbConnection) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(connectionType); } public override IDbCommand CreateCommand() { - return (IDbCommand) Activator.CreateInstance(commandType); + return (IDbCommand) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(commandType); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Exceptions/SQLExceptionConverterFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Exceptions/SQLExceptionConverterFactory.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Exceptions/SQLExceptionConverterFactory.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -106,7 +106,7 @@ } // Otherwise, try to use the no-arg constructor - return (ISQLExceptionConverter)Activator.CreateInstance(converterClass); + return (ISQLExceptionConverter) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(converterClass); } catch (Exception t) { Modified: trunk/nhibernate/src/NHibernate/Id/IdentifierGeneratorFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/IdentifierGeneratorFactory.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Id/IdentifierGeneratorFactory.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -201,7 +201,7 @@ try { System.Type clazz = GetIdentifierGeneratorClass(strategy, dialect); - var idgen = (IIdentifierGenerator) Activator.CreateInstance(clazz); + var idgen = (IIdentifierGenerator) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(clazz); var conf = idgen as IConfigurable; if (conf != null) { Modified: trunk/nhibernate/src/NHibernate/Impl/OracleClientCommandSet.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/OracleClientCommandSet.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Impl/OracleClientCommandSet.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -1,4 +1,3 @@ - using System; using System.Data.OracleClient; using System.Diagnostics; @@ -6,22 +5,21 @@ namespace NHibernate.Impl { - internal class OracleClientCommandSet : DbCommandSet<OracleConnection, OracleCommand> - { - private static System.Type oracleCmdSetType; + internal class OracleClientCommandSet : DbCommandSet<OracleConnection, OracleCommand> + { + private static readonly System.Type oracleCmdSetType; - static OracleClientCommandSet() - { - Assembly sysDataOracleClient = Assembly.Load("System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); - oracleCmdSetType = sysDataOracleClient.GetType("System.Data.OracleClient.OracleCommandSet"); - Debug.Assert(oracleCmdSetType != null, "Could not find OracleCommandSet!"); - } + static OracleClientCommandSet() + { + Assembly sysDataOracleClient = + Assembly.Load("System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); + oracleCmdSetType = sysDataOracleClient.GetType("System.Data.OracleClient.OracleCommandSet"); + Debug.Assert(oracleCmdSetType != null, "Could not find OracleCommandSet!"); + } - protected override object CreateInternalCommandSet() - { - return Activator.CreateInstance(oracleCmdSetType, true); - } - - } -} - + protected override object CreateInternalCommandSet() + { + return Activator.CreateInstance(oracleCmdSetType, true); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -1143,7 +1143,8 @@ try { System.Type implClass = ReflectHelper.ClassForName(impl); - return (ICurrentSessionContext) Activator.CreateInstance(implClass, new object[] {this}); + return + (ICurrentSessionContext) Environment.BytecodeProvider.ObjectsFactory.CreateInstance(implClass, new object[] {this}); } catch (Exception e) { Modified: trunk/nhibernate/src/NHibernate/Impl/SqlClientCommandSet.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SqlClientCommandSet.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Impl/SqlClientCommandSet.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -1,34 +1,33 @@ - using System; using System.Data; using System.Data.SqlClient; -using System.Diagnostics; using System.Reflection; namespace NHibernate.Impl { - internal class SqlClientCommandSet : DbCommandSet<SqlConnection, System.Data.SqlClient.SqlCommand> - { - private static System.Type sqlCmdSetType; + internal class SqlClientCommandSet : DbCommandSet<SqlConnection, System.Data.SqlClient.SqlCommand> + { + private static readonly System.Type sqlCmdSetType; - static SqlClientCommandSet() - { - Assembly sysData = typeof(IDbConnection).Assembly; - sqlCmdSetType = sysData.GetType("System.Data.SqlClient.SqlCommandSet"); - } + static SqlClientCommandSet() + { + Assembly sysData = typeof (IDbConnection).Assembly; + sqlCmdSetType = sysData.GetType("System.Data.SqlClient.SqlCommandSet"); + } - protected override object CreateInternalCommandSet() - { - if (sqlCmdSetType == null) - { - throw new HibernateException("Could not find SqlCommandSet"+Environment.NewLine + - "If you are running on Mono, batching support isn't implemented on Mono" + Environment.NewLine + - "If you are running on Microsoft .NET, this probably means that internal details"+Environment.NewLine+ - "of the BCL that we rely on to allow this have changed, this is a bug. Please inform the developers"); - } - return Activator.CreateInstance(sqlCmdSetType, true); - } - - } -} - + protected override object CreateInternalCommandSet() + { + if (sqlCmdSetType == null) + { + throw new HibernateException("Could not find SqlCommandSet" + Environment.NewLine + + "If you are running on Mono, batching support isn't implemented on Mono" + + Environment.NewLine + + "If you are running on Microsoft .NET, this probably means that internal details" + + Environment.NewLine + + + "of the BCL that we rely on to allow this have changed, this is a bug. Please inform the developers"); + } + return Activator.CreateInstance(sqlCmdSetType, true); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/Collection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/Collection.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Mapping/Collection.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -156,7 +156,7 @@ { try { - comparer = Activator.CreateInstance(ReflectHelper.ClassForName(ComparerClassName)); + comparer = Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(ComparerClassName)); } catch { Modified: trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -264,7 +264,7 @@ try { - IPropertyAccessor result = (IPropertyAccessor)Activator.CreateInstance(accessorClass); + var result = (IPropertyAccessor) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(accessorClass); accessors[accessorName] = result; return result; } Modified: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -88,7 +88,8 @@ else if (args[i].StartsWith("--naming=")) { cfg.SetNamingStrategy( - (INamingStrategy) Activator.CreateInstance(ReflectHelper.ClassForName(args[i].Substring(9)))); + (INamingStrategy) + Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(args[i].Substring(9)))); } } else Modified: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -59,7 +59,8 @@ else if (args[i].StartsWith("--naming=")) { cfg.SetNamingStrategy( - (INamingStrategy) Activator.CreateInstance(ReflectHelper.ClassForName(args[i].Substring(9)))); + (INamingStrategy) + Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(ReflectHelper.ClassForName(args[i].Substring(9)))); } } else Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -79,7 +79,9 @@ } // if resultClass is not a class but a value type, we need to use Activator.CreateInstance - result = resultClass.IsClass ? constructor.Invoke(null) : Activator.CreateInstance(resultClass, true); + result = resultClass.IsClass + ? constructor.Invoke(null) + : Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(resultClass, true); for (int i = 0; i < aliases.Length; i++) { Modified: trunk/nhibernate/src/NHibernate/Tuple/PocoInstantiator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tuple/PocoInstantiator.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Tuple/PocoInstantiator.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -87,7 +87,7 @@ } else if (mappedClass.IsValueType) { - return Activator.CreateInstance(mappedClass, true); + return Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(mappedClass, true); } else if (constructor == null) { Modified: trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -25,7 +25,7 @@ try { - userType = (ICompositeUserType) Activator.CreateInstance(userTypeClass); + userType = (ICompositeUserType) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(userTypeClass); } catch (MethodAccessException mae) { Modified: trunk/nhibernate/src/NHibernate/Type/CustomCollectionType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/CustomCollectionType.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Type/CustomCollectionType.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -28,7 +28,7 @@ try { - userType = (IUserCollectionType) Activator.CreateInstance(userTypeClass); + userType = (IUserCollectionType) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(userTypeClass); } catch (InstantiationException ie) { Modified: trunk/nhibernate/src/NHibernate/Type/CustomType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/CustomType.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Type/CustomType.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -34,7 +34,7 @@ try { - userType = (IUserType) Activator.CreateInstance(userTypeClass); + userType = (IUserType) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(userTypeClass); } catch (ArgumentNullException ane) { Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-05-18 23:00:41 UTC (rev 4345) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-05-19 00:06:44 UTC (rev 4346) @@ -399,7 +399,7 @@ { try { - type = (IType)Activator.CreateInstance(typeClass); + type = (IType) Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(typeClass); } catch (Exception e) { @@ -811,9 +811,10 @@ string propertyRef, params System.Type[] typeArguments) { - return (CollectionType)Activator.CreateInstance( - genericCollectionType.MakeGenericType(typeArguments), - role, propertyRef); + return + (CollectionType) + Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance( + genericCollectionType.MakeGenericType(typeArguments), role, propertyRef); } private static CollectionType CreateSortedCollectionType( @@ -823,9 +824,10 @@ object comparer, params System.Type[] typeArguments) { - return (CollectionType)Activator.CreateInstance( - genericCollectionType.MakeGenericType(typeArguments), - role, propertyRef, comparer); + return + (CollectionType) + Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance( + genericCollectionType.MakeGenericType(typeArguments), role, propertyRef, comparer); } private static CollectionType CreateOrderedCollectionType(System.Type genericCollectionType, @@ -834,7 +836,9 @@ params System.Type[] typeArguments) { return - (CollectionType)Activator.CreateInstance(genericCollectionType.MakeGenericType(typeArguments), role, propertyRef); + (CollectionType) + Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance( + genericCollectionType.MakeGenericType(typeArguments), role, propertyRef); } /// <summary> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2009-05-19 12:04:32
|
Revision: 4348 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4348&view=rev Author: steverstrong Date: 2009-05-19 12:04:26 +0000 (Tue, 19 May 2009) Log Message: ----------- Removed unused file from AST Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlTreeAdapter.cs Deleted: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlTreeAdapter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlTreeAdapter.cs 2009-05-19 11:57:25 UTC (rev 4347) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/HqlTreeAdapter.cs 2009-05-19 12:04:26 UTC (rev 4348) @@ -1,206 +0,0 @@ -using System; -using Antlr.Runtime; -using Antlr.Runtime.Tree; - -namespace NHibernate.Hql.Ast.ANTLR.Tree -{ - [CLSCompliant(false)] - public class HqlTreeAdaptor : CommonTreeAdaptor - { - private readonly HqlSqlWalker _walker; - - public HqlTreeAdaptor(HqlSqlWalker walker) - { - _walker = walker; - } - - public override object Create(IToken payload) - { - if (payload == null) - { - return base.Create(payload); - } - - object ret; - - switch (payload.Type) - { - case HqlSqlWalker.SELECT: - case HqlSqlWalker.QUERY: - ret = new QueryNode(payload); - break; - case HqlSqlWalker.UPDATE: - //return UpdateStatement.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.DELETE: - //return DeleteStatement.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.INSERT: - //return InsertStatement.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.INTO: - //return IntoClause.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.FROM: - ret = new FromClause(payload); - break; - case HqlSqlWalker.FROM_FRAGMENT: - ret = new FromElement(payload); - break; - case HqlSqlWalker.IMPLIED_FROM: - ret = new ImpliedFromElement(payload); - break; - case HqlSqlWalker.DOT: - ret = new DotNode(payload); - break; - case HqlSqlWalker.INDEX_OP: - ret = new IndexNode(payload); - break; - // Alias references and identifiers use the same node class. - case HqlSqlWalker.ALIAS_REF: - case HqlSqlWalker.IDENT: - ret = new IdentNode(payload); - break; - case HqlSqlWalker.SQL_TOKEN: - ret = new SqlFragment(payload); - break; - case HqlSqlWalker.METHOD_CALL: - ret = new MethodNode(payload); - break; - case HqlSqlWalker.ELEMENTS: - case HqlSqlWalker.INDICES: - ret = new CollectionFunction(payload); - break; - case HqlSqlWalker.SELECT_CLAUSE: - ret = new SelectClause(payload); - break; - case HqlSqlWalker.SELECT_EXPR: - ret = new SelectExpressionImpl(payload); - break; - case HqlSqlWalker.AGGREGATE: - //return AggregateNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.COUNT: - //return CountNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.CONSTRUCTOR: - ret = new ConstructorNode(payload); - break; - case HqlSqlWalker.NUM_INT: - case HqlSqlWalker.NUM_FLOAT: - case HqlSqlWalker.NUM_LONG: - case HqlSqlWalker.NUM_DOUBLE: - case HqlSqlWalker.QUOTED_String: - //return LiteralNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.TRUE: - case HqlSqlWalker.FALSE: - //return BooleanLiteralNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.JAVA_CONSTANT: - //return JavaConstantNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.ORDER: - ret = new OrderByClause(payload); - break; - case HqlSqlWalker.PLUS: - case HqlSqlWalker.MINUS: - case HqlSqlWalker.STAR: - case HqlSqlWalker.DIV: - //return BinaryArithmeticOperatorNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.UNARY_MINUS: - case HqlSqlWalker.UNARY_PLUS: - //return UnaryArithmeticNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.CASE2: - //return Case2Node.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.CASE: - //return CaseNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.PARAM: - case HqlSqlWalker.NAMED_PARAM: - ret = new ParameterNode(payload); - break; - case HqlSqlWalker.EQ: - case HqlSqlWalker.NE: - case HqlSqlWalker.LT: - case HqlSqlWalker.GT: - case HqlSqlWalker.LE: - case HqlSqlWalker.GE: - case HqlSqlWalker.LIKE: - case HqlSqlWalker.NOT_LIKE: - return new BinaryLogicOperatorNode(payload); - case HqlSqlWalker.IN: - case HqlSqlWalker.NOT_IN: - //return InLogicOperatorNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.BETWEEN: - case HqlSqlWalker.NOT_BETWEEN: - //return BetweenOperatorNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.IS_NULL: - //return IsNullLogicOperatorNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.IS_NOT_NULL: - //return IsNotNullLogicOperatorNode.class; - ret = new SqlNode(payload); - break; - case HqlSqlWalker.EXISTS: - //return UnaryLogicOperatorNode.class; - ret = new SqlNode(payload); - break; - default: - ret = new SqlNode(payload); - break; - - } - - Initialise(ret); - return ret; - } - - public override object DupNode(object t) - { - CommonTree node = t as CommonTree; - - if (node != null) - { - CommonTree dupped = (CommonTree)Create(node.Token); - - dupped.Parent = node.Parent; - - return dupped; - } - - return base.DupNode(t); - } - - void Initialise(object node) - { - IInitializableNode initableNode = node as IInitializableNode; - - if (initableNode != null) - { - initableNode.Initialize(_walker); - } - } - } -} Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-19 11:57:25 UTC (rev 4347) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-19 12:04:26 UTC (rev 4348) @@ -551,7 +551,6 @@ <Compile Include="Hql\Ast\ANTLR\Tree\HqlSqlWalkerNode.cs" /> <Compile Include="Hql\Ast\ANTLR\Tree\HqlSqlWalkerTreeAdapter.cs" /> <Compile Include="Hql\Ast\ANTLR\Tree\HqlSqlWalkerTreeNodeStream.cs" /> - <Compile Include="Hql\Ast\ANTLR\Tree\HqlTreeAdapter.cs" /> <Compile Include="Hql\Ast\ANTLR\Tree\IASTFactory.cs" /> <Compile Include="Hql\Ast\ANTLR\Tree\IASTNode.cs" /> <Compile Include="Hql\Ast\ANTLR\Tree\IBinaryOperatorNode.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-20 15:50:21
|
Revision: 4350 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4350&view=rev Author: fabiomaulo Date: 2009-05-20 15:50:11 +0000 (Wed, 20 May 2009) Log Message: ----------- Fix NH-1756 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2009-05-19 12:59:37 UTC (rev 4349) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2009-05-20 15:50:11 UTC (rev 4350) @@ -345,8 +345,12 @@ private bool IsVersionIncrementRequired(FlushEntityEvent @event, EntityEntry entry, IEntityPersister persister, int[] dirtyProperties) { - bool isVersionIncrementRequired = - entry.Status != Status.Deleted && + // NH different behavior: because NH-1756 when PostInsertId is used with a generated version + // the version is read inmediately after save and does not need to be incremented. + // BTW, in general, a generated version does not need to be incremented by NH. + + bool isVersionIncrementRequired = + entry.Status != Status.Deleted && !persister.IsVersionPropertyGenerated && (dirtyProperties == null || Versioning.IsVersionIncrementRequired(dirtyProperties, @event.HasDirtyCollection, persister.PropertyVersionability)); return isVersionIncrementRequired; Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Domain.cs 2009-05-20 15:50:11 UTC (rev 4350) @@ -0,0 +1,43 @@ + +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1756 +{ + + public class Book + { + private DateTime _version; + + public virtual DateTime Version + { + get { return _version; } + set { _version = value; } + } + + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual IList<Page> Pages { get; set; } + } + + public class Page + { + public virtual int Id { get; set; } + } + + public class BookNotGenerated + { + private DateTime _version; + + public virtual DateTime Version + { + get { return _version; } + set { _version = value; } + } + + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual IList<Page> Pages { get; set; } + } + +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs 2009-05-20 15:50:11 UTC (rev 4350) @@ -0,0 +1,86 @@ +using System.Collections.Generic; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1756 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + [Test] + public void SaveTransient_Then_Update_Ok() + { + using (ISession session = OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + var book = new BookNotGenerated {Name = "test book", Pages = new List<Page>(),}; + session.Save(book); + book.Name = "modified test book"; + transaction.Commit(); + } + } + using (ISession session = OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + session.CreateQuery("delete from BookNotGenerated").ExecuteUpdate(); + transaction.Commit(); + } + } + } + + [Test] + [Description("Work with AutoFlush on commit")] + public void SaveTransient_Then_Update() + { + using (ISession session = OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + var book = new Book { Name = "test book", Pages = new List<Page>(), }; + session.Save(book); + book.Name = "modified test book"; + transaction.Commit(); + } + } + using (ISession session = OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + session.CreateQuery("delete from Book").ExecuteUpdate(); + transaction.Commit(); + } + } + } + + [Test] + public void SaveTransient_Then_Update_Bug() + { + using (ISession session = OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + var book = new Book {Name = "test book", Pages = new List<Page>(),}; + session.Save(book); + book.Name = "modified test book"; + session.Flush(); + transaction.Commit(); + } + } + using (ISession session = OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + session.CreateQuery("delete from Book").ExecuteUpdate(); + transaction.Commit(); + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1756/Mappings.hbm.xml 2009-05-20 15:50:11 UTC (rev 4350) @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1756" + assembly="NHibernate.Test"> + + <class name="Book" table="book"> + + <id name="Id" column="id"> + <generator class="identity"/> + </id> + + <discriminator column="subclass" /> + + <version name="Version" column="version_column" type="Timestamp" generated="always" /> + <property name="Name" column="name_column" /> + + <bag name="Pages"> + <key column="book_id" /> + <one-to-many class="Page"/> + </bag> + + </class> + + <class name="Page"> + + <id name="Id"> + <generator class="identity"/> + </id> + + </class> + + <class name="BookNotGenerated"> + + <id name="Id" column="id"> + <generator class="identity"/> + </id> + + <discriminator column="subclass" /> + + <version name="Version" column="version_column" type="Timestamp" generated="never" /> + <property name="Name" column="name_column" /> + + <bag name="Pages"> + <key column="book_id" /> + <one-to-many class="Page"/> + </bag> + + </class> + + <database-object> + <create> + <![CDATA[ +CREATE TRIGGER t_book ON book +INSTEAD OF INSERT +AS +BEGIN + SET NOCOUNT ON + + INSERT INTO book ( + [subclass], + [version_column], + [name_column]) + SELECT + [subclass], + GetDate(), + [name_column] + FROM inserted + + SELECT scope_identity(); +END +]]> + </create> + <drop> + <![CDATA[ +IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[t_sack]')) +DROP TRIGGER [dbo].[t_sack] +]]> + </drop> + <dialect-scope name="NHibernate.Dialect.MsSql2005Dialect"/> + <dialect-scope name="NHibernate.Dialect.MsSql2008Dialect"/> + </database-object> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-19 12:59:37 UTC (rev 4349) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-20 15:50:11 UTC (rev 4350) @@ -416,6 +416,8 @@ <Compile Include="NHSpecificTest\NH1742\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1747\Classes.cs" /> <Compile Include="NHSpecificTest\NH1747\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1756\Domain.cs" /> + <Compile Include="NHSpecificTest\NH1756\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1760\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH1760\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH1763\DomainClass.cs" /> @@ -1821,6 +1823,7 @@ <EmbeddedResource Include="BulkManipulation\SimpleClass.hbm.xml" /> <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1756\Mappings.hbm.xml" /> <EmbeddedResource Include="LazyProperty\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1783\Mappings.hbm.xml" /> <EmbeddedResource Include="LazyOneToOne\Person.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 00:52:10
|
Revision: 4352 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4352&view=rev Author: ayenderahien Date: 2009-05-22 00:52:05 +0000 (Fri, 22 May 2009) Log Message: ----------- Committing the logging changes for sql batcher discussed on mailing list Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-22 00:51:01 UTC (rev 4351) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-22 00:52:05 UTC (rev 4352) @@ -36,24 +36,19 @@ { totalExpectedRowsAffected += expectation.ExpectedRowCount; IDbCommand batchUpdate = CurrentCommand; - if (log.IsDebugEnabled) + + string lineWithParameters = null; + if (Factory.Settings.SqlStatementLogger.IsDebugEnabled) { - string lineWithParameters = Factory.Settings.SqlStatementLogger.GetCommandLineWithParameters(batchUpdate); - if (Factory.Settings.SqlStatementLogger.IsDebugEnabled) - { - Factory.Settings.SqlStatementLogger.LogCommand("Adding to batch:", batchUpdate, FormatStyle.Basic); - } - else - { - log.Debug("Adding to batch:" + lineWithParameters); - } + lineWithParameters = Factory.Settings.SqlStatementLogger.GetCommandLineWithParameters(batchUpdate); currentBatchCommandsLog.Append("Batch command: ").AppendLine(lineWithParameters); } - else + if (log.IsDebugEnabled) { - Factory.Settings.SqlStatementLogger.LogCommand("Adding to batch:", batchUpdate, FormatStyle.Basic); + log.Debug("Adding to batch:" + lineWithParameters); } - currentBatch.Append((System.Data.SqlClient.SqlCommand)batchUpdate); + currentBatch.Append((System.Data.SqlClient.SqlCommand) batchUpdate); + if (currentBatch.CountOfCommands >= batchSize) { DoExecuteBatch(batchUpdate); @@ -70,11 +65,7 @@ Factory.Settings.SqlStatementLogger.LogBatchCommand(currentBatchCommandsLog.ToString()); currentBatchCommandsLog = new StringBuilder(); } - else if (log.IsDebugEnabled) - { - log.Debug(currentBatchCommandsLog.ToString()); - currentBatchCommandsLog = new StringBuilder(); - } + int rowsAffected = currentBatch.ExecuteNonQuery(); Expectations.VerifyOutcomeBatched(totalExpectedRowsAffected, rowsAffected); Modified: trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-22 00:51:01 UTC (rev 4351) +++ trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-22 00:52:05 UTC (rev 4352) @@ -108,8 +108,8 @@ [Test] [Description(@"Activating the SQL and turning off the batcher's log the log stream: --should not contains any batch info --should contain SQL's log info +-should not contains adding to batch +-should contain batch command -the batcher should work.")] public void SqlLog() { @@ -120,7 +120,8 @@ sessions.Statistics.Clear(); FillDb(); string logs = sl.GetWholeLog(); - Assert.That(logs, Text.DoesNotContain("Batch command").IgnoreCase); + Assert.That(logs, Text.DoesNotContain("Addin to batch").IgnoreCase); + Assert.That(logs, Text.Contains("Batch command").IgnoreCase); Assert.That(logs, Text.Contains("INSERT").IgnoreCase); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 05:38:22
|
Revision: 4353 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4353&view=rev Author: ayenderahien Date: 2009-05-22 05:38:20 +0000 (Fri, 22 May 2009) Log Message: ----------- NH-1790 - allowing SqlClientBatchingBatcher to batch non identical statements. This means a nice perf improvement because we can put more stuff into a batch, but it should be noted that we aren't batching across different statement types. That is, we will batch all inserts, but we will not batch inserts & updates. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcherFactory.cs trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.cs trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.hbm.xml Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-05-22 00:52:05 UTC (rev 4352) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-05-22 05:38:20 UTC (rev 4353) @@ -148,9 +148,7 @@ public IDbCommand PrepareCommand(CommandType type, SqlString sql, SqlType[] parameterTypes) { - // a new IDbCommand is being prepared and a new (potential) batch - // started - so execute the current batch of commands. - ExecuteBatch(); + OnPreparedCommand(); // do not actually prepare the Command here - instead just generate it because // if the command is associated with an ADO.NET Transaction/Connection while @@ -159,6 +157,13 @@ return Generate(type, sql, parameterTypes); } + protected virtual void OnPreparedCommand() + { + // a new IDbCommand is being prepared and a new (potential) batch + // started - so execute the current batch of commands. + ExecuteBatch(); + } + public IDbCommand PrepareQueryCommand(CommandType type, SqlString sql, SqlType[] parameterTypes) { // do not actually prepare the Command here - instead just generate it because Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-22 00:52:05 UTC (rev 4352) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-22 05:38:20 UTC (rev 4353) @@ -74,5 +74,12 @@ totalExpectedRowsAffected = 0; currentBatch = new SqlClientSqlCommandSet(); } + + protected override void OnPreparedCommand() + { + // SQL Server batching can handle several different commands, and + // that gives us a nice perf boost when mixing different queries for + // batching + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcherFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcherFactory.cs 2009-05-22 00:52:05 UTC (rev 4352) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcherFactory.cs 2009-05-22 05:38:20 UTC (rev 4353) @@ -2,7 +2,7 @@ namespace NHibernate.AdoNet { - internal class SqlClientBatchingBatcherFactory : IBatcherFactory + public class SqlClientBatchingBatcherFactory : IBatcherFactory { public virtual IBatcher CreateBatcher(ConnectionManager connectionManager, IInterceptor interceptor) { Added: trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.cs 2009-05-22 05:38:20 UTC (rev 4353) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.Ado +{ + public class AlmostSimple + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual double Weight { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Ado/AlmostSimple.hbm.xml 2009-05-22 05:38:20 UTC (rev 4353) @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Ado"> + + <class name="AlmostSimple"> + <id name="Id"/> + <property name="Name"/> + <property name="Weight"/> + </class> + +</hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-22 00:52:05 UTC (rev 4352) +++ trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-22 05:38:20 UTC (rev 4353) @@ -1,6 +1,7 @@ using System.Collections; using NHibernate.AdoNet; using NHibernate.Cfg; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Ado @@ -15,7 +16,7 @@ protected override IList Mappings { - get { return new[] { "Ado.VerySimple.hbm.xml" }; } + get { return new[] { "Ado.VerySimple.hbm.xml", "Ado.AlmostSimple.hbm.xml" }; } } protected override void Configure(Configuration configuration) @@ -47,6 +48,7 @@ using (s.BeginTransaction()) { s.CreateQuery("delete from VerySimple").ExecuteUpdate(); + s.CreateQuery("delete from AlmostSimple").ExecuteUpdate(); s.Transaction.Commit(); } } @@ -74,7 +76,7 @@ var vs1 = s.Get<VerySimple>(1); var vs2 = s.Get<VerySimple>(2); vs1.Weight -= 10; - vs1.Weight -= 1; + vs2.Weight -= 1; sessions.Statistics.Clear(); s.Update(vs1); s.Update(vs2); @@ -86,6 +88,45 @@ } [Test] + [Description("SqlClient: The batcher should run all different INSERT queries in only one roundtrip.")] + public void SqlClientOneRoundTripForUpdateAndInsert() + { + if (sessions.Settings.BatcherFactory is SqlClientBatchingBatcherFactory == false) + Assert.Ignore("This test is for SqlClientBatchingBatcher only"); + + FillDb(); + + using(var sqlLog = new SqlLogSpy()) + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(new VerySimple + { + Name = "test441", + Weight = 894 + }); + + s.Save(new AlmostSimple + { + Name = "test441", + Weight = 894 + }); + + tx.Commit(); + + var log = sqlLog.GetWholeLog(); + //log should only contain NHibernate.SQL once, because that means + //that we ony generated a single batch (NHibernate.SQL log will output + //once per batch) + Assert.AreEqual(0, log.IndexOf("NHibernate.SQL"), "log should start with NHibernate.SQL"); + Assert.AreEqual(-1, log.IndexOf("NHibernate.SQL", "NHibernate.SQL".Length), "NHibernate.SQL should only appear once in the log"); + } + + Cleanup(); + } + + + [Test] [Description("The batcher should run all DELETE queries in only one roundtrip.")] public void OneRoundTripDelete() { Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 00:52:05 UTC (rev 4352) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 05:38:20 UTC (rev 4353) @@ -74,6 +74,7 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> + <Compile Include="Ado\AlmostSimple.cs" /> <Compile Include="Ado\BatcherFixture.cs" /> <Compile Include="Ado\VerySimple.cs" /> <Compile Include="Any\Address.cs" /> @@ -1822,6 +1823,7 @@ <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <EmbeddedResource Include="BulkManipulation\SimpleClass.hbm.xml" /> <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> + <EmbeddedResource Include="Ado\AlmostSimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> <EmbeddedResource Include="NHSpecificTest\NH1756\Mappings.hbm.xml" /> <EmbeddedResource Include="LazyProperty\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-05-22 05:53:01
|
Revision: 4354 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4354&view=rev Author: fabiomaulo Date: 2009-05-22 05:52:57 +0000 (Fri, 22 May 2009) Log Message: ----------- Fix NH-1792 (by Jesse) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Product.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2009-05-22 05:38:20 UTC (rev 4353) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2009-05-22 05:52:57 UTC (rev 4354) @@ -67,7 +67,10 @@ int orderIndex = querySqlString.LastIndexOfCaseInsensitive(" order by "); SqlString from; SqlString[] sortExpressions; - if (orderIndex > 0) + + //don't use the order index if it is contained within a larger statement(assuming + //a statement with non matching parenthesis is part of a larger block) + if (orderIndex > 0 && HasMatchingParens(querySqlString.Substring(orderIndex).ToString())) { from = querySqlString.Substring(fromIndex, orderIndex - fromIndex).Trim(); SqlString orderBy = querySqlString.Substring(orderIndex).Trim(); @@ -214,6 +217,34 @@ } /// <summary> + /// Indicates whether the string fragment contains matching parenthesis + /// </summary> + /// <param name="statement"> the statement to evaluate</param> + /// <returns>true if the statment contains no parenthesis or an equal number of + /// opening and closing parenthesis;otherwise false </returns> + private static bool HasMatchingParens(IEnumerable<char> statement) + { + //unmatched paren count + int unmatchedParen = 0; + + //increment the counts based in the opening and closing parens in the statement + foreach (char item in statement) + { + switch (item) + { + case '(': + unmatchedParen++; + break; + case ')': + unmatchedParen--; + break; + } + } + + return unmatchedParen == 0; + } + + /// <summary> /// Sql Server 2005 supports a query statement that provides <c>LIMIT</c> /// functionality. /// </summary> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Fixture.cs 2009-05-22 05:52:57 UTC (rev 4354) @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using NHibernate.Criterion; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1792 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + DeleteAll(); + } + + /// <summary> + /// Deletes all the product entities from the persistence medium + /// </summary> + private void DeleteAll() + { + using (ISession session = OpenSession()) + { + using (ITransaction trans = session.BeginTransaction()) + { + session.Delete("from Product"); + trans.Commit(); + } + } + } + + /// <summary> + /// Creates some product enties to work with + /// </summary> + protected override void OnSetUp() + { + base.OnSetUp(); + + using (ISession session = OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + for (int i = 0; i < 10; i++) + { + var prod = new Product {Name = "Product" + i}; + + session.Save(prod); + } + tx.Commit(); + } + } + } + + /// <summary> + /// Verifies that a subquery created as a detachedcriteria with an order by + /// will produce valid sql when the main query does not contain an order by clause + /// </summary> + [Test] + public void PageWithDetachedCriteriaSubqueryWithOrderBy() + { + //create the subquery + DetachedCriteria subQuery = + DetachedCriteria.For<Product>().SetProjection(Projections.Id()).AddOrder(Order.Desc("Name")).SetMaxResults(5); + + using (ISession session = OpenSession()) + { + IList<Product> results = + session.CreateCriteria<Product>().Add(Subqueries.PropertyIn("Id", subQuery)).Add(Restrictions.Gt("Id", 0)). + SetMaxResults(3).List<Product>(); + + Assert.AreEqual(3, results.Count); + } + } + + /// <summary> + /// Verifies that a subquery created as a raw sql statement with an order by + /// will produce valid sql when the main query does not contain an order by clause + /// </summary> + [Test] + public void PageWithRawSqlSubqueryWithOrderBy() + { + using (ISession session = OpenSession()) + { + IList<Product> results = + session.CreateCriteria<Product>().Add( + Expression.Sql("{alias}.Id in (Select top 5 p.Id from Product p order by Name)")).Add(Restrictions.Gt("Id", 0)). + SetMaxResults(3).List<Product>(); + + Assert.AreEqual(3, results.Count); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Mappings.hbm.xml 2009-05-22 05:52:57 UTC (rev 4354) @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1792" + assembly="NHibernate.Test"> + + <class name="Product"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Name"/> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Product.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Product.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1792/Product.cs 2009-05-22 05:52:57 UTC (rev 4354) @@ -0,0 +1,8 @@ +namespace NHibernate.Test.NHSpecificTest.NH1792 +{ + public class Product + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 05:38:20 UTC (rev 4353) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 05:52:57 UTC (rev 4354) @@ -432,6 +432,8 @@ <Compile Include="NHSpecificTest\NH1776\FilterQueryTwiceFixture.cs" /> <Compile Include="NHSpecificTest\NH1783\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH1783\SampleTest.cs" /> + <Compile Include="NHSpecificTest\NH1792\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1792\Product.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -1825,6 +1827,7 @@ <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <EmbeddedResource Include="Ado\AlmostSimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1792\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1756\Mappings.hbm.xml" /> <EmbeddedResource Include="LazyProperty\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1783\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 18:29:02
|
Revision: 4358 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4358&view=rev Author: ayenderahien Date: 2009-05-22 18:28:52 +0000 (Fri, 22 May 2009) Log Message: ----------- NH-1791 - Allow more natural syntax for passing multiple projections on a criteria query BREAKNING CHANGE - If you are inheriting from ICriteria, you would need to change the method signature. This is very rare, so I don't expect this to be a real problem This change is source code compatible for users of ICriteria.SetProjection, however. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/ICriteria.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs Modified: trunk/nhibernate/src/NHibernate/ICriteria.cs =================================================================== --- trunk/nhibernate/src/NHibernate/ICriteria.cs 2009-05-22 16:29:11 UTC (rev 4357) +++ trunk/nhibernate/src/NHibernate/ICriteria.cs 2009-05-22 18:28:52 UTC (rev 4358) @@ -72,7 +72,7 @@ /// determines the overall "shape" of the query result. /// </para> /// </remarks> - ICriteria SetProjection(IProjection projection); + ICriteria SetProjection(params IProjection[] projection); /// <summary> /// Add an Expression to constrain the results to be retrieved. Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-05-22 16:29:11 UTC (rev 4357) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-05-22 18:28:52 UTC (rev 4358) @@ -439,9 +439,27 @@ return this; } - public ICriteria SetProjection(IProjection projection) + public ICriteria SetProjection(params IProjection[] projections) { - this.projection = projection; + if(projections==null) + throw new ArgumentNullException("projections"); + if(projections.Length ==0) + throw new ArgumentException("projections must contain a least one projection"); + + if(projections.Length==1) + { + projection = projections[0]; + } + else + { + var projectionList = new ProjectionList(); + foreach (var childProjection in projections) + { + projectionList.Add(childProjection); + } + projection = projectionList; + } + projectionCriteria = this; SetResultTransformer(CriteriaSpecification.Projection); return this; @@ -810,9 +828,9 @@ return this; } - public ICriteria SetProjection(IProjection projection) + public ICriteria SetProjection(params IProjection[] projections) { - root.SetProjection(projection); + root.SetProjection(projections); return this; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 18:35:40
|
Revision: 4359 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4359&view=rev Author: ayenderahien Date: 2009-05-22 18:35:26 +0000 (Fri, 22 May 2009) Log Message: ----------- Making sure that the batcher output from batcher is formatted for human reading Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-22 18:28:52 UTC (rev 4358) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-22 18:35:26 UTC (rev 4359) @@ -23,7 +23,7 @@ //the user change the logging configuration at runtime. Trying to put this //behind an if(log.IsDebugEnabled) will cause a null reference exception //at that point. - currentBatchCommandsLog = new StringBuilder(); + currentBatchCommandsLog = new StringBuilder().AppendLine("Batch commands:"); } public override int BatchSize @@ -38,10 +38,16 @@ IDbCommand batchUpdate = CurrentCommand; string lineWithParameters = null; - if (Factory.Settings.SqlStatementLogger.IsDebugEnabled) + var sqlStatementLogger = Factory.Settings.SqlStatementLogger; + if (sqlStatementLogger.IsDebugEnabled) { - lineWithParameters = Factory.Settings.SqlStatementLogger.GetCommandLineWithParameters(batchUpdate); - currentBatchCommandsLog.Append("Batch command: ").AppendLine(lineWithParameters); + lineWithParameters = sqlStatementLogger.GetCommandLineWithParameters(batchUpdate); + var formatStyle = sqlStatementLogger.DetermineActualStyle(FormatStyle.Basic); + lineWithParameters = formatStyle.Formatter.Format(lineWithParameters); + currentBatchCommandsLog.Append("command ") + .Append(currentBatch.CountOfCommands) + .Append(":") + .AppendLine(lineWithParameters); } if (log.IsDebugEnabled) { @@ -63,7 +69,7 @@ if (Factory.Settings.SqlStatementLogger.IsDebugEnabled) { Factory.Settings.SqlStatementLogger.LogBatchCommand(currentBatchCommandsLog.ToString()); - currentBatchCommandsLog = new StringBuilder(); + currentBatchCommandsLog = new StringBuilder().AppendLine("Batch commands:"); } int rowsAffected = currentBatch.ExecuteNonQuery(); Modified: trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-05-22 18:28:52 UTC (rev 4358) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-05-22 18:35:26 UTC (rev 4359) @@ -135,7 +135,7 @@ || DbType.AnsiStringFixedLength.Equals(dbType) || DbType.StringFixedLength.Equals(dbType); } - private FormatStyle DetermineActualStyle(FormatStyle style) + public FormatStyle DetermineActualStyle(FormatStyle style) { return FormatSql ? style : FormatStyle.None; } Modified: trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-22 18:28:52 UTC (rev 4358) +++ trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-22 18:35:26 UTC (rev 4359) @@ -1,7 +1,6 @@ using System.Collections; using NHibernate.AdoNet; using NHibernate.Cfg; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Ado @@ -125,7 +124,41 @@ Cleanup(); } + [Test] + [Description("SqlClient: The batcher log output should be formatted")] + public void BatchedoutputShouldBeFormatted() + { + if (sessions.Settings.BatcherFactory is SqlClientBatchingBatcherFactory == false) + Assert.Ignore("This test is for SqlClientBatchingBatcher only"); + FillDb(); + + using (var sqlLog = new SqlLogSpy()) + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(new VerySimple + { + Name = "test441", + Weight = 894 + }); + + s.Save(new AlmostSimple + { + Name = "test441", + Weight = 894 + }); + + tx.Commit(); + + var log = sqlLog.GetWholeLog(); + Assert.IsTrue(log.Contains("INSERT \n INTO")); + } + + Cleanup(); + } + + [Test] [Description("The batcher should run all DELETE queries in only one roundtrip.")] public void OneRoundTripDelete() @@ -211,7 +244,7 @@ sessions.Statistics.Clear(); FillDb(); string logs = sl.GetWholeLog(); - Assert.That(logs, Text.Contains("Batch command:").IgnoreCase); + Assert.That(logs, Text.Contains("Batch commands:").IgnoreCase); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 20:42:36
|
Revision: 4360 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4360&view=rev Author: ayenderahien Date: 2009-05-22 20:42:29 +0000 (Fri, 22 May 2009) Log Message: ----------- First part of the Transaction Factory work, created an AdoNetWithDistrubtedTransactionFactory factory that now encapsulate all the interaction with the DTC AdoNetWithDistrubtedTransactionFactory is now the default transaction factory If a user wants to avoid paying the price of DTC checks, it can be done by specifying AdoNetTransactionFactory in the configuration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs trunk/nhibernate/src/NHibernate/Transaction/ITransactionContext.cs trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/AdoNet/AdoNetContext.cs Deleted: trunk/nhibernate/src/NHibernate/AdoNet/AdoNetContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AdoNetContext.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/AdoNet/AdoNetContext.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -1,59 +0,0 @@ -using System; -using log4net; -using NHibernate.Transaction; - -namespace NHibernate.AdoNet -{ - [Serializable] - public class AdoNetContext : ConnectionManager.Callback - { - // TODO : make this the factory for "entity mode related" sessions; - // also means making this the target of transaction-synch and the - // thing that knows how to cascade things between related sessions - // - // At that point, perhaps this thing is a "SessionContext", and - // ConnectionManager is a "JDBCContext"? A "SessionContext" should - // live in the impl package... - - //private IContext owner; - //private ConnectionManager connectionManager; - //[NonSerialized] - //private bool isTransactionCallbackRegistered; - //[NonSerialized] - //private ITransaction hibernateTransaction; - - private static readonly ILog log = LogManager.GetLogger(typeof (AdoNetContext)); - - public interface IContext : ITransactionContext - { - /** - * We cannot rely upon this method being called! It is only - * called if we are using Hibernate Transaction API. - */ - ConnectionReleaseMode ConnectionReleaseMode { get; } - bool IsAutoCloseSessionEnabled { get; } - void AfterTransactionBegin(ITransaction tx); - void BeforeTransactionCompletion(ITransaction tx); - void AfterTransactionCompletion(bool success, ITransaction tx); - } - - #region Callback Members - - public void ConnectionOpened() - { - throw new NotImplementedException(); - } - - public void ConnectionCleanedUp() - { - throw new NotImplementedException(); - } - - public bool IsTransactionInProgress - { - get { throw new NotImplementedException(); } - } - - #endregion - } -} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -66,9 +66,9 @@ { get { - if (System.Transactions.Transaction.Current != null) + if (transaction != null && transaction.IsActive) return true; - return transaction != null && transaction.IsActive; + return session.Factory.TransactionFactory.IsInDistributedActiveTransaction(session); } } Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -346,7 +346,7 @@ private static ITransactionFactory CreateTransactionFactory(IDictionary<string, string> properties) { string className = PropertiesHelper.GetString( - Environment.TransactionStrategy, properties, typeof(AdoNetTransactionFactory).FullName); + Environment.TransactionStrategy, properties, typeof(AdoNetWithDistrubtedTransactionFactory).FullName); log.Info("Transaction factory: " + className); try Modified: trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Engine/ISessionImplementor.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -10,6 +10,7 @@ using NHibernate.Impl; using NHibernate.Loader.Custom; using NHibernate.Persister.Entity; +using NHibernate.Transaction; using NHibernate.Type; namespace NHibernate.Engine @@ -290,5 +291,9 @@ FutureQueryBatch FutureQueryBatch { get; } Guid SessionId { get; } + + ITransactionContext TransactionContext { get; set; } + + void CloseSessionFromDistributedTransaction(); } } Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -13,6 +13,7 @@ using NHibernate.Hql; using NHibernate.Loader.Custom; using NHibernate.Persister.Entity; +using NHibernate.Transaction; using NHibernate.Type; namespace NHibernate.Impl @@ -21,16 +22,20 @@ /// <summary> Functionality common to stateless and stateful sessions </summary> [Serializable] - public abstract class AbstractSessionImpl : ISessionImplementor, IEnlistmentNotification + public abstract class AbstractSessionImpl : ISessionImplementor { [NonSerialized] private ISessionFactoryImplementor factory; private readonly Guid sessionId = Guid.NewGuid(); private bool closed; - private System.Transactions.Transaction ambientTransation; + + public ITransactionContext TransactionContext + { + get; set; + } + private bool isAlreadyDisposed; - protected bool shouldCloseSessionOnDtcTransactionCompleted; private static readonly ILog logger = LogManager.GetLogger(typeof(AbstractSessionImpl)); @@ -39,14 +44,6 @@ get { return sessionId; } } - protected bool TakingPartInDtcTransaction - { - get - { - return ambientTransation != null; - } - } - internal AbstractSessionImpl() { } protected internal AbstractSessionImpl(ISessionFactoryImplementor factory) @@ -77,7 +74,7 @@ public abstract EntityMode EntityMode { get; } public abstract IBatcher Batcher { get; } - + public abstract void CloseSessionFromDistributedTransaction(); public abstract IList List(string query, QueryParameters parameters); public abstract void List(string query, QueryParameters parameters, IList results); public abstract IList<T> List<T>(string query, QueryParameters queryParameters); @@ -214,8 +211,8 @@ { try { - if (ambientTransation != null) - ambientTransation.Dispose(); + if (TransactionContext != null) + TransactionContext.Dispose(); } catch (Exception) { @@ -307,106 +304,12 @@ } } - #region IEnlistmentNotification Members - - void IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment) - { - using (new SessionIdLoggingContext(SessionId)) - { - try - { - using (var tx = new TransactionScope(ambientTransation)) - { - BeforeTransactionCompletion(null); - if (FlushMode != FlushMode.Never && ConnectionManager.IsConnected) - { - using (ConnectionManager.FlushingFromDtcTransaction) - { - logger.Debug(string.Format("[session-id={0}] Flushing from Dtc Transaction", sessionId)); - Flush(); - } - } - logger.Debug("prepared for DTC transaction"); - - tx.Complete(); - } - preparingEnlistment.Prepared(); - } - catch (Exception exception) - { - logger.Error("DTC transaction prepre phase failed", exception); - preparingEnlistment.ForceRollback(exception); - } - } - } - - void IEnlistmentNotification.Commit(Enlistment enlistment) - { - using (new SessionIdLoggingContext(SessionId)) - { - logger.Debug("committing DTC transaction"); - // we have nothing to do here, since it is the actual - // DB connection that will commit the transaction - enlistment.Done(); - } - } - - void IEnlistmentNotification.Rollback(Enlistment enlistment) - { - using (new SessionIdLoggingContext(SessionId)) - { - AfterTransactionCompletion(false, null); - logger.Debug("rolled back DTC transaction"); - enlistment.Done(); - } - } - - void IEnlistmentNotification.InDoubt(Enlistment enlistment) - { - using (new SessionIdLoggingContext(SessionId)) - { - AfterTransactionCompletion(false, null); - logger.Debug("DTC transaction is in doubt"); - enlistment.Done(); - } - } - protected void EnlistInAmbientTransactionIfNeeded() { using (new SessionIdLoggingContext(SessionId)) { - if (ambientTransation != null) - return; - if (System.Transactions.Transaction.Current == null) - return; - ambientTransation = System.Transactions.Transaction.Current.Clone(); - logger.DebugFormat("enlisted into DTC transaction: {0}", ambientTransation.IsolationLevel); - AfterTransactionBegin(null); - ambientTransation.TransactionCompleted += delegate(object sender, TransactionEventArgs e) - { - bool wasSuccessful = false; - try - { - wasSuccessful = e.Transaction.TransactionInformation.Status - == TransactionStatus.Committed; - } - catch (ObjectDisposedException ode) - { - logger.Warn("Completed transaction was disposed.", ode); - } - AfterTransactionCompletion(wasSuccessful, null); - if (shouldCloseSessionOnDtcTransactionCompleted) - { - Dispose(true); - } - ambientTransation = null; - }; - ambientTransation.EnlistVolatile(this, EnlistmentOptions.EnlistDuringPrepareRequired); + factory.TransactionFactory.EnlistInDistributedTransactionIfNeeded(this); } } - - protected abstract void Dispose(bool disposing); - - #endregion } } Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -579,6 +579,11 @@ } } + public override void CloseSessionFromDistributedTransaction() + { + Dispose(true); + } + public override IList List(string query, QueryParameters parameters) { using (new SessionIdLoggingContext(SessionId)) @@ -1655,9 +1660,9 @@ using (new SessionIdLoggingContext(SessionId)) { log.Debug(string.Format("[session-id={0}] running ISession.Dispose()", SessionId)); - if (TakingPartInDtcTransaction) + if (TransactionContext!=null) { - shouldCloseSessionOnDtcTransactionCompleted = true; + TransactionContext.ShouldCloseSessionOnDistributedTransactionCompleted = true; return; } Dispose(true); @@ -1673,7 +1678,7 @@ /// If this Session is being Finalized (<c>isDisposing==false</c>) then make sure not /// to call any methods that could potentially bring this Session back to life. /// </remarks> - protected override void Dispose(bool isDisposing) + protected void Dispose(bool isDisposing) { using (new SessionIdLoggingContext(SessionId)) { @@ -1689,7 +1694,7 @@ // know this call came through Dispose() if (isDisposing && !IsClosed) { - Close(); + Close(); } // free unmanaged resources here Modified: trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -87,6 +87,11 @@ } } + public override void CloseSessionFromDistributedTransaction() + { + Dispose(true); + } + public override IList List(string query, QueryParameters parameters) { using (new SessionIdLoggingContext(SessionId)) @@ -883,16 +888,16 @@ using (new SessionIdLoggingContext(SessionId)) { log.Debug("running IStatelessSession.Dispose()"); - if (TakingPartInDtcTransaction) + if (TransactionContext != null) { - shouldCloseSessionOnDtcTransactionCompleted = true; + TransactionContext .ShouldCloseSessionOnDistributedTransactionCompleted = true; return; } Dispose(true); } } - protected override void Dispose(bool isDisposing) + protected void Dispose(bool isDisposing) { using (new SessionIdLoggingContext(SessionId)) { Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-22 20:42:29 UTC (rev 4360) @@ -435,7 +435,6 @@ <Compile Include="Action\EntityInsertAction.cs" /> <Compile Include="Action\EntityUpdateAction.cs" /> <Compile Include="Action\IExecutable.cs" /> - <Compile Include="AdoNet\AdoNetContext.cs" /> <Compile Include="AdoNet\ColumnNameCache.cs" /> <Compile Include="AdoNet\Expectations.cs" /> <Compile Include="AdoNet\IBatcherFactory.cs" /> @@ -599,6 +598,7 @@ <Compile Include="Hql\Ast\ANTLR\Util\NodeTraverser.cs" /> <Compile Include="Param\VersionTypeSeedParameterSpecification.cs" /> <Compile Include="SqlCommand\InsertSelect.cs" /> + <Compile Include="Transaction\AdoNetWithDistrubtedTransactionFactory.cs" /> <Compile Include="Transform\ToListResultTransformer.cs" /> <Compile Include="Util\NullableDictionary.cs" /> <Compile Include="Hql\Ast\ANTLR\Util\PathHelper.cs" /> Modified: trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -1,5 +1,4 @@ using System.Collections; -using NHibernate.AdoNet; using NHibernate.Engine; namespace NHibernate.Transaction @@ -11,19 +10,18 @@ return new AdoTransaction(session); } - public void Configure(IDictionary props) + public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { + // nothing need to do here, we only support local transactions with this factory } - public ConnectionReleaseMode DefaultReleaseMode + public bool IsInDistributedActiveTransaction(ISessionImplementor session) { - get { throw new System.NotImplementedException(); } + return false; } - public bool IsTransactionInProgress(AdoNetContext adoNetContext, ITransactionContext transactionContext, - ITransaction transaction) + public void Configure(IDictionary props) { - throw new System.NotImplementedException(); } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -0,0 +1,153 @@ +using System; +using System.Collections; +using System.Transactions; +using log4net; +using NHibernate.Engine; +using NHibernate.Impl; + +namespace NHibernate.Transaction +{ + public class AdoNetWithDistrubtedTransactionFactory : ITransactionFactory + { + private static readonly ILog logger = LogManager.GetLogger(typeof (AbstractSessionImpl)); + + public void Configure(IDictionary props) + { + + } + + public ITransaction CreateTransaction(ISessionImplementor session) + { + return new AdoTransaction(session); + } + + public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) + { + if (session.TransactionContext != null) + return; + if (System.Transactions.Transaction.Current == null) + return; + var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); + session.TransactionContext = transactionContext; + logger.DebugFormat("enlisted into DTC transaction: {0}", transactionContext.AmbientTransation.IsolationLevel); + session.AfterTransactionBegin(null); + transactionContext.AmbientTransation.TransactionCompleted += delegate(object sender, TransactionEventArgs e) + { + bool wasSuccessful = false; + try + { + wasSuccessful = e.Transaction.TransactionInformation.Status + == TransactionStatus.Committed; + } + catch (ObjectDisposedException ode) + { + logger.Warn("Completed transaction was disposed, assuming transaction rollback", ode); + } + session.AfterTransactionCompletion(wasSuccessful, null); + if (transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted) + { + session.CloseSessionFromDistributedTransaction(); + } + session.TransactionContext = null; + }; + transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); + } + + public bool IsInDistributedActiveTransaction(ISessionImplementor session) + { + var distributedTransactionContext = ((DistributedTransactionContext) session.TransactionContext); + return distributedTransactionContext != null && + distributedTransactionContext.IsInActiveTransaction; + } + + public class DistributedTransactionContext : ITransactionContext, IEnlistmentNotification + { + public System.Transactions.Transaction AmbientTransation { get; set; } + public bool ShouldCloseSessionOnDistributedTransactionCompleted { get; set; } + private readonly ISessionImplementor sessionImplementor; + public bool IsInActiveTransaction; + + public DistributedTransactionContext(ISessionImplementor sessionImplementor, System.Transactions.Transaction transaction) + { + this.sessionImplementor = sessionImplementor; + AmbientTransation = transaction.Clone(); + IsInActiveTransaction = true; + } + + #region IEnlistmentNotification Members + + void IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + try + { + using (var tx = new TransactionScope(AmbientTransation)) + { + sessionImplementor.BeforeTransactionCompletion(null); + if (sessionImplementor.FlushMode != FlushMode.Never && sessionImplementor.ConnectionManager.IsConnected) + { + using (sessionImplementor.ConnectionManager.FlushingFromDtcTransaction) + { + logger.Debug(string.Format("[session-id={0}] Flushing from Dtc Transaction", sessionImplementor.SessionId)); + sessionImplementor.Flush(); + } + } + logger.Debug("prepared for DTC transaction"); + + tx.Complete(); + } + preparingEnlistment.Prepared(); + } + catch (Exception exception) + { + logger.Error("DTC transaction prepre phase failed", exception); + preparingEnlistment.ForceRollback(exception); + } + } + } + + void IEnlistmentNotification.Commit(Enlistment enlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + logger.Debug("committing DTC transaction"); + // we have nothing to do here, since it is the actual + // DB connection that will commit the transaction + enlistment.Done(); + IsInActiveTransaction = false; + } + } + + void IEnlistmentNotification.Rollback(Enlistment enlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + sessionImplementor.AfterTransactionCompletion(false, null); + logger.Debug("rolled back DTC transaction"); + enlistment.Done(); + IsInActiveTransaction = false; + } + } + + void IEnlistmentNotification.InDoubt(Enlistment enlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + sessionImplementor.AfterTransactionCompletion(false, null); + logger.Debug("DTC transaction is in doubt"); + enlistment.Done(); + IsInActiveTransaction = false; + } + } + + #endregion + + public void Dispose() + { + if (AmbientTransation != null) + AmbientTransation.Dispose(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transaction/ITransactionContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/ITransactionContext.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Transaction/ITransactionContext.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -1,3 +1,4 @@ +using System; using NHibernate.Engine; namespace NHibernate.Transaction @@ -2,18 +3,9 @@ { - public interface ITransactionContext + /// <summary> + /// This is used as a marker interface for the different + /// transaction context required for each session + /// </summary> + public interface ITransactionContext : IDisposable { - /// Since C# doesn't support interfaces into interfaces ITransactionContext - /// represent the inner interface at - /// org.hibernate.transaction.TransactionFactory.Context - - ISessionFactoryImplementor Factory { get; } - //bool IsOpen { get; } - bool IsClosed { get; } - - bool IsFlushModeNever { get; } - bool IsFlushBeforeCompletionEnabled { get; } - void ManagedFlush(); - - bool ShouldAutoClose { get; } - void ManagedClose(); + bool ShouldCloseSessionOnDistributedTransactionCompleted { get; set; } } Modified: trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -1,4 +1,5 @@ using System.Collections; +using System.Transactions; using NHibernate; using NHibernate.AdoNet; using NHibernate.Engine; @@ -26,25 +27,8 @@ /// </summary> ITransaction CreateTransaction(ISessionImplementor session); - /// <summary> - /// Get the default connection release mode - /// </summary> - ConnectionReleaseMode DefaultReleaseMode { get; } + void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session); - //TODO: do we need this? - //bool IsTransactionManagerRequired { get; } - - //TODO: do we need this? - //bool AreCallbacksLocalToHibernateTransactions { get; } - - /// <summary> - /// Determine whether an underlying transaction is in progress. - /// - /// Mainly this is used in determining whether to register a - /// synchronization as well as whether or not to circumvent - /// auto flushing outside transactions. - /// </summary> - /// <returns>true if an underlying transaction is know to be in effect.</returns> - bool IsTransactionInProgress(AdoNetContext adoNetContext, ITransactionContext transactionContext, ITransaction transaction); + bool IsInDistributedActiveTransaction(ISessionImplementor session); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -1,30 +1,30 @@ using System; +using System.Collections; using NHibernate.AdoNet; +using NHibernate.Engine; using NHibernate.Transaction; namespace NHibernate.Test.NHSpecificTest.NH1054 { - public class DummyTransactionFactory : NHibernate.Transaction.ITransactionFactory + public class DummyTransactionFactory : ITransactionFactory { - void NHibernate.Transaction.ITransactionFactory.Configure(System.Collections.IDictionary props) + public void Configure(IDictionary props) { - } - ITransaction NHibernate.Transaction.ITransactionFactory.CreateTransaction(NHibernate.Engine.ISessionImplementor session) + public ITransaction CreateTransaction(ISessionImplementor session) { - return null; + throw new NotImplementedException(); } - public ConnectionReleaseMode DefaultReleaseMode + public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { - get { throw new NotImplementedException(); } + throw new NotImplementedException(); } - public bool IsTransactionInProgress(AdoNetContext adoNetContext, ITransactionContext transactionContext, - ITransaction transaction) + public bool IsInDistributedActiveTransaction(ISessionImplementor session) { - throw new NotImplementedException(); + return false; } } } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs 2009-05-22 18:35:26 UTC (rev 4359) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs 2009-05-22 20:42:29 UTC (rev 4360) @@ -22,12 +22,12 @@ } [Test] - public void AdoNetTransactionFactoryIsDefaultTransactionFactory() + public void AdoNetWithDistributedTransactionFactoryIsDefaultTransactionFactory() { Configuration configuration = new Configuration(); ISessionFactoryImplementor sessionFactory = (ISessionFactoryImplementor)configuration.BuildSessionFactory(); - Assert.IsInstanceOfType(typeof(NHibernate.Transaction.AdoNetTransactionFactory), + Assert.IsInstanceOfType(typeof(NHibernate.Transaction.AdoNetWithDistrubtedTransactionFactory), sessionFactory.Settings.TransactionFactory); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 22:17:25
|
Revision: 4361 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4361&view=rev Author: ayenderahien Date: 2009-05-22 22:17:15 +0000 (Fri, 22 May 2009) Log Message: ----------- Second part of transaction factory work, all DTC work is now isolated to the transaction factories. Isolation is now properly handled using the Isolater which delegates to the TransactionFactory to ensure running in a different transaction. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/Transaction/IIsolatedWork.cs trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs trunk/nhibernate/src/NHibernate/Engine/TransactionHelper.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/AbstractStatementExecutor.cs trunk/nhibernate/src/NHibernate/Id/Enhanced/TableStructure.cs trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs Modified: trunk/nhibernate/src/NHibernate/Engine/Transaction/IIsolatedWork.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Transaction/IIsolatedWork.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Engine/Transaction/IIsolatedWork.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -13,7 +13,7 @@ /// Perform the actual work to be done. /// </summary> /// <param name="connection">The ADP connection to use.</param> - void DoWork(IDbConnection connection); + void DoWork(IDbConnection connection, IDbTransaction transaction); // 2009-05-04 Another time we need a TransactionManager to manage isolated // work for a given connection. Modified: trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -2,6 +2,7 @@ using System.Data; using System.Data.Common; using log4net; +using NHibernate.Dialect; using NHibernate.Exceptions; namespace NHibernate.Engine.Transaction @@ -29,18 +30,6 @@ { private static readonly ILog log = LogManager.GetLogger(typeof(Isolater)); - private static DoWork GetApropieateDelegate() - { - bool isAmbientTransation = System.Transactions.Transaction.Current != null; - if (isAmbientTransation) - { - return AmbientDelegateWork; - } - else - { - return AdoDelegateWork; - } - } /// <summary> /// Ensures that all processing actually performed by the given work will /// occur on a seperate transaction. @@ -49,8 +38,7 @@ /// <param name="session">The session from which this request is originating. </param> public static void DoIsolatedWork(IIsolatedWork work, ISessionImplementor session) { - DoWork worker = GetApropieateDelegate(); - worker(session, work, true); + session.Factory.TransactionFactory.ExecuteWorkInIsolation(session, work, true); } /// <summary> @@ -61,90 +49,7 @@ /// <param name="session">The session from which this request is originating. </param> public static void DoNonTransactedWork(IIsolatedWork work, ISessionImplementor session) { - DoWork worker = GetApropieateDelegate(); - worker(session, work, false); + session.Factory.TransactionFactory.ExecuteWorkInIsolation(session, work, false); } - - private delegate void DoWork(ISessionImplementor session, IIsolatedWork work, bool transacted); - - private static void AdoDelegateWork(ISessionImplementor session, IIsolatedWork work, bool transacted) - { - IDbConnection connection = null; - IDbTransaction trans = null; - // bool wasAutoCommit = false; - try - { - connection = session.Factory.ConnectionProvider.GetConnection(); - - if (transacted) - { - trans = connection.BeginTransaction(); - // TODO NH: a way to read the autocommit state is needed - //if (TransactionManager.GetAutoCommit(connection)) - //{ - // wasAutoCommit = true; - // TransactionManager.SetAutoCommit(connection, false); - //} - } - - work.DoWork(connection); - - if (transacted) - { - trans.Commit(); - //TransactionManager.Commit(connection); - } - } - catch (Exception t) - { - try - { - if (transacted && connection != null && !(connection.State == ConnectionState.Closed)) - { - trans.Rollback(); - // TransactionManager.RollBack(connection); - } - } - catch (Exception ignore) - { - log.Debug("unable to release connection on exception [" + ignore + "]"); - } - - if (t is HibernateException) - { - throw; - } - else if (t is DbException) - { - throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t, "error performing isolated work"); - } - else - { - throw new HibernateException("error performing isolated work", t); - } - } - finally - { - //if (transacted && wasAutoCommit) - //{ - // try - // { - // // TODO NH: reset autocommit - // // TransactionManager.SetAutoCommit(connection, true); - // } - // catch (Exception) - // { - // log.Debug("was unable to reset connection back to auto-commit"); - // } - //} - session.Factory.ConnectionProvider.CloseConnection(connection); - } - } - - private static void AmbientDelegateWork(ISessionImplementor session, IIsolatedWork work, bool transacted) - { - throw new NotSupportedException("Not supported yet."); - } - } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Engine/TransactionHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/TransactionHelper.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Engine/TransactionHelper.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -25,11 +25,11 @@ #region Implementation of IIsolatedWork - public void DoWork(IDbConnection connection) + public void DoWork(IDbConnection connection, IDbTransaction transaction) { try { - generatedValue = owner.DoWorkInCurrentTransaction(connection, null); + generatedValue = owner.DoWorkInCurrentTransaction(session, connection, transaction); } catch (DbException sqle) { @@ -41,7 +41,7 @@ } /// <summary> The work to be done</summary> - public abstract object DoWorkInCurrentTransaction(IDbConnection conn, string sql); + public abstract object DoWorkInCurrentTransaction(ISessionImplementor session, IDbConnection conn, IDbTransaction transaction); /// <summary> Suspend the current transaction and perform work in a new transaction</summary> public virtual object DoWorkInNewTransaction(ISessionImplementor session) Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/AbstractStatementExecutor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/AbstractStatementExecutor.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/AbstractStatementExecutor.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -137,7 +137,7 @@ } else { - work.DoWork(session.ConnectionManager.GetConnection()); + work.DoWork(session.ConnectionManager.GetConnection(), null); session.ConnectionManager.AfterStatement(); } } @@ -149,10 +149,7 @@ { return dialectVote.Value; } - else - { - return Factory.Settings.IsDataDefinitionImplicitCommit; - } + return Factory.Settings.IsDataDefinitionImplicitCommit; } protected virtual void DropTemporaryTableIfNecessary(IQueryable persister, ISessionImplementor session) @@ -174,7 +171,7 @@ } else { - work.DoWork(session.ConnectionManager.GetConnection()); + work.DoWork(session.ConnectionManager.GetConnection(), null); session.ConnectionManager.AfterStatement(); } } @@ -222,7 +219,7 @@ this.session = session; } - public void DoWork(IDbConnection connection) + public void DoWork(IDbConnection connection, IDbTransaction transaction) { IDbCommand stmnt = null; try @@ -266,7 +263,7 @@ private readonly ILog log; private readonly ISessionImplementor session; - public void DoWork(IDbConnection connection) + public void DoWork(IDbConnection connection, IDbTransaction transaction) { IDbCommand stmnt = null; try Modified: trunk/nhibernate/src/NHibernate/Id/Enhanced/TableStructure.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/Enhanced/TableStructure.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Id/Enhanced/TableStructure.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -99,7 +99,7 @@ #region Overrides of TransactionHelper - public override object DoWorkInCurrentTransaction(IDbConnection conn, string sql) + public override object DoWorkInCurrentTransaction(ISessionImplementor session, IDbConnection conn, IDbTransaction transaction) { long result; int rows; @@ -136,7 +136,7 @@ } query = update.ToString(); - SqlLog.Debug(sql); + IDbCommand ups = conn.CreateCommand(); ups.CommandType = CommandType.Text; ups.CommandText = query; Modified: trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -6,6 +6,7 @@ using log4net; using NHibernate.Dialect; using NHibernate.Engine; +using NHibernate.Engine.Transaction; using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Type; @@ -35,7 +36,7 @@ /// The mapping parameters <c>table</c> and <c>column</c> are required. /// </p> /// </remarks> - public class TableGenerator : IPersistentIdentifierGenerator, IConfigurable + public class TableGenerator : TransactionHelper, IPersistentIdentifierGenerator, IConfigurable { private static readonly ILog log = LogManager.GetLogger(typeof(TableGenerator)); /// <summary> @@ -155,117 +156,7 @@ // This has to be done using a different connection to the containing // transaction becase the new hi value must remain valid even if the // containing transaction rolls back. - // - // We make an exception for SQLite and use the session's connection, - // since SQLite only allows one connection to the database. - - bool isSQLite = session.Factory.Dialect is SQLiteDialect; - IDbConnection conn; - TransactionScope dtcTrans = null; - if (isSQLite) - { - conn = session.Connection; - } - else - { - // existing dtc transaction, creating a new one - // to override the ambient one - if (Transaction.Current != null) - dtcTrans = new TransactionScope(TransactionScopeOption.RequiresNew); - conn = session.Factory.ConnectionProvider.GetConnection(); - } - - IDbTransaction trans = null; - try - { - if (!isSQLite) - { - if(dtcTrans==null) - trans = conn.BeginTransaction(); - } - - long result; - int rows; - do - { - //the loop ensure atomicitiy of the - //select + uspdate even for no transaction - //or read committed isolation level (needed for .net?) - - IDbCommand qps = conn.CreateCommand(); - IDataReader rs = null; - qps.CommandText = query; - qps.CommandType = CommandType.Text; - qps.Transaction = trans; - PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Reading high value:", qps, FormatStyle.Basic); - try - { - rs = qps.ExecuteReader(); - if (!rs.Read()) - { - string err = "could not read a hi value - you need to populate the table: " + tableName; - log.Error(err); - throw new IdentifierGenerationException(err); - } - result = Convert.ToInt64(columnType.Get(rs, 0)); - } - // TODO: change to SqlException - catch (Exception e) - { - log.Error("could not read a hi value", e); - throw; - } - finally - { - if (rs != null) rs.Close(); - qps.Dispose(); - } - - IDbCommand ups = - session.Factory.ConnectionProvider.Driver.GenerateCommand(CommandType.Text, updateSql, parameterTypes); - ups.Connection = conn; - ups.Transaction = trans; - PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Updating high value:", ups, FormatStyle.Basic); - - try - { - columnType.Set(ups, result + 1, 0); - columnType.Set(ups, result, 1); - - rows = ups.ExecuteNonQuery(); - } - // TODO: change to SqlException - catch (Exception e) - { - log.Error("could not update hi value in: " + tableName, e); - throw; - } - finally - { - ups.Dispose(); - } - } while (rows == 0); - - if (!isSQLite) - { - if (dtcTrans != null) - dtcTrans.Complete(); - else - trans.Commit(); - } - - return result; - } - // TODO: Shouldn't we have a Catch with a rollback here? - finally - { - if (!isSQLite) - { - if(dtcTrans!=null) - dtcTrans.Dispose(); - session.Factory.ConnectionProvider.CloseConnection(conn); - } - } + return DoWorkInNewTransaction(session); } #endregion @@ -317,5 +208,70 @@ } #endregion + + public override object DoWorkInCurrentTransaction(ISessionImplementor session, IDbConnection conn, IDbTransaction transaction) + { + long result; + int rows; + do + { + //the loop ensure atomicitiy of the + //select + uspdate even for no transaction + //or read committed isolation level (needed for .net?) + + IDbCommand qps = conn.CreateCommand(); + IDataReader rs = null; + qps.CommandText = query; + qps.CommandType = CommandType.Text; + qps.Transaction = transaction; + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Reading high value:", qps, FormatStyle.Basic); + try + { + rs = qps.ExecuteReader(); + if (!rs.Read()) + { + string err = "could not read a hi value - you need to populate the table: " + tableName; + log.Error(err); + throw new IdentifierGenerationException(err); + } + result = Convert.ToInt64(columnType.Get(rs, 0)); + } + catch (Exception e) + { + log.Error("could not read a hi value", e); + throw; + } + finally + { + if (rs != null) rs.Close(); + qps.Dispose(); + } + + IDbCommand ups = + session.Factory.ConnectionProvider.Driver.GenerateCommand(CommandType.Text, updateSql, parameterTypes); + ups.Connection = conn; + ups.Transaction = transaction; + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Updating high value:", ups, FormatStyle.Basic); + + try + { + columnType.Set(ups, result + 1, 0); + columnType.Set(ups, result, 1); + + rows = ups.ExecuteNonQuery(); + } + catch (Exception e) + { + log.Error("could not update hi value in: " + tableName, e); + throw; + } + finally + { + ups.Dispose(); + } + } while (rows == 0); + + return result; + } } } Modified: trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -1,10 +1,19 @@ +using System; using System.Collections; +using System.Data; +using System.Data.Common; +using log4net; +using NHibernate.Dialect; using NHibernate.Engine; +using NHibernate.Engine.Transaction; +using NHibernate.Exceptions; namespace NHibernate.Transaction { public class AdoNetTransactionFactory : ITransactionFactory { + private readonly ILog isolaterLog = LogManager.GetLogger(typeof(Isolater)); + public ITransaction CreateTransaction(ISessionImplementor session) { return new AdoTransaction(session); @@ -20,6 +29,85 @@ return false; } + public void ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, bool transacted) + { + IDbConnection connection = null; + IDbTransaction trans = null; + // bool wasAutoCommit = false; + try + { + // We make an exception for SQLite and use the session's connection, + // since SQLite only allows one connection to the database. + if (session.Factory.Dialect is SQLiteDialect) + connection = session.Connection; + else + connection = session.Factory.ConnectionProvider.GetConnection(); + + if (transacted) + { + trans = connection.BeginTransaction(); + // TODO NH: a way to read the autocommit state is needed + //if (TransactionManager.GetAutoCommit(connection)) + //{ + // wasAutoCommit = true; + // TransactionManager.SetAutoCommit(connection, false); + //} + } + + work.DoWork(connection, trans); + + if (transacted) + { + trans.Commit(); + //TransactionManager.Commit(connection); + } + } + catch (Exception t) + { + try + { + if (trans != null && connection.State != ConnectionState.Closed) + { + trans.Rollback(); + } + } + catch (Exception ignore) + { + isolaterLog.Debug("unable to release connection on exception [" + ignore + "]"); + } + + if (t is HibernateException) + { + throw; + } + else if (t is DbException) + { + throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t, "error performing isolated work"); + } + else + { + throw new HibernateException("error performing isolated work", t); + } + } + finally + { + //if (transacted && wasAutoCommit) + //{ + // try + // { + // // TODO NH: reset autocommit + // // TransactionManager.SetAutoCommit(connection, true); + // } + // catch (Exception) + // { + // log.Debug("was unable to reset connection back to auto-commit"); + // } + //} + if (session.Factory.Dialect is SQLiteDialect == false) + session.Factory.ConnectionProvider.CloseConnection(connection); + } + } + public void Configure(IDictionary props) { } Modified: trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -3,6 +3,7 @@ using System.Transactions; using log4net; using NHibernate.Engine; +using NHibernate.Engine.Transaction; using NHibernate.Impl; namespace NHibernate.Transaction @@ -10,6 +11,8 @@ public class AdoNetWithDistrubtedTransactionFactory : ITransactionFactory { private static readonly ILog logger = LogManager.GetLogger(typeof (AbstractSessionImpl)); + private readonly AdoNetTransactionFactory adoNetTransactionFactory = new AdoNetTransactionFactory(); + public void Configure(IDictionary props) { @@ -60,6 +63,17 @@ distributedTransactionContext.IsInActiveTransaction; } + public void ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, bool transacted) + { + using(var tx = new TransactionScope(TransactionScopeOption.Suppress)) + { + // instead of duplicating the logic, we suppress the DTC transaction and create + // our own transaction instead + adoNetTransactionFactory.ExecuteWorkInIsolation(session, work, transacted); + tx.Complete(); + } + } + public class DistributedTransactionContext : ITransactionContext, IEnlistmentNotification { public System.Transactions.Transaction AmbientTransation { get; set; } Modified: trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate/Transaction/ITransactionFactory.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -3,6 +3,7 @@ using NHibernate; using NHibernate.AdoNet; using NHibernate.Engine; +using NHibernate.Engine.Transaction; namespace NHibernate.Transaction { @@ -30,5 +31,7 @@ void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session); bool IsInDistributedActiveTransaction(ISessionImplementor session); + + void ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, bool transacted); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs 2009-05-22 20:42:29 UTC (rev 4360) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/DummyTransactionFactory.cs 2009-05-22 22:17:15 UTC (rev 4361) @@ -2,6 +2,7 @@ using System.Collections; using NHibernate.AdoNet; using NHibernate.Engine; +using NHibernate.Engine.Transaction; using NHibernate.Transaction; namespace NHibernate.Test.NHSpecificTest.NH1054 @@ -26,5 +27,10 @@ { return false; } + + public void ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, bool transacted) + { + throw new NotImplementedException(); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 22:51:48
|
Revision: 4363 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4363&view=rev Author: ayenderahien Date: 2009-05-22 22:51:28 +0000 (Fri, 22 May 2009) Log Message: ----------- NH-1974 - tests to show that noop strategy works. Adding an alias to noop access strategy - none Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Person.cs Modified: trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2009-05-22 22:31:51 UTC (rev 4362) +++ trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2009-05-22 22:51:28 UTC (rev 4363) @@ -40,6 +40,7 @@ accessors["nosetter.pascalcase-m"] = new NoSetterAccessor(new PascalCaseMStrategy()); accessors["embedded"] = new EmbeddedPropertyAccessor(); accessors["noop"] = new NoopAccessor(); + accessors["none"] = new NoopAccessor(); } private PropertyAccessorFactory() Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Fixture.cs 2009-05-22 22:51:28 UTC (rev 4363) @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using NHibernate.Criterion; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1794 +{ + [TestFixture] + public class Fixture : BugTestCase + { + [Test] + public void CanQueryOnCollectionThatAppearsOnlyInTheMapping() + { + using (ISession session = OpenSession()) + { + session + .CreateQuery("select p.Name, c.Name from Person p join p.Children c") + .List(); + } + } + + [Test] + public void CanQueryOnPropertyThatOnlyShowsUpInMapping_AsAccessNone() + { + using (ISession session = OpenSession()) + { + session + .CreateQuery("from Person p where p.UpdatedAt is null") + .List(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Mappings.hbm.xml 2009-05-22 22:51:28 UTC (rev 4363) @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1794" + assembly="NHibernate.Test"> + + <class name="Person"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Name"/> + <many-to-one name="Parent"/> + <set name="Children" access="noop"> + <key column="Parent"/> + <one-to-many class="Person"/> + </set> + <property name="UpdatedAt" access="none" type="System.DateTime" /> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Person.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1794/Person.cs 2009-05-22 22:51:28 UTC (rev 4363) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.NHSpecificTest.NH1794 +{ + public class Person + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual Person Parent { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 22:31:51 UTC (rev 4362) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 22:51:28 UTC (rev 4363) @@ -434,6 +434,8 @@ <Compile Include="NHSpecificTest\NH1783\SampleTest.cs" /> <Compile Include="NHSpecificTest\NH1792\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1792\Product.cs" /> + <Compile Include="NHSpecificTest\NH1794\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1794\Person.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -1827,6 +1829,7 @@ <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <EmbeddedResource Include="Ado\AlmostSimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1794\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1792\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1756\Mappings.hbm.xml" /> <EmbeddedResource Include="LazyProperty\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-05-22 23:35:54
|
Revision: 4366 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4366&view=rev Author: ayenderahien Date: 2009-05-22 23:35:49 +0000 (Fri, 22 May 2009) Log Message: ----------- Fixing NH-1788 - version column updatability is not taken into account when updating using dynamic-update Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Person.cs Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-05-22 23:32:10 UTC (rev 4365) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-05-22 23:35:49 UTC (rev 4366) @@ -3416,6 +3416,7 @@ if (IsVersioned) { propsToUpdate[VersionProperty] = + PropertyUpdateability[VersionProperty] && Versioning.IsVersionIncrementRequired(dirtyProperties, hasDirtyCollection, PropertyVersionability); } Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Fixture.cs 2009-05-22 23:35:49 UTC (rev 4366) @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using NHibernate.Criterion; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1788 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + [Test] + public void CanUseSqlTimestampWithDynamicInsert() + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + session.Save(new Person + { + Name = "hi" + }); + tx.Commit(); + } + + + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var person = session.Get<Person>(1); + person.Name = "other"; + tx.Commit(); + } + + + using (ISession session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + session.Delete(session.Get<Person>(1)); + tx.Commit(); + } + + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Mappings.hbm.xml 2009-05-22 23:35:49 UTC (rev 4366) @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1788" + assembly="NHibernate.Test"> + + <class name="Person" table="People" dynamic-update="true"> + <id name="Id"> + <generator class="identity"/> + </id> + <version name="Version" generated="always" unsaved-value="null" type="BinaryBlob"> + <column name="Version" sql-type="timestamp" /> + </version> + <property name="Name" /> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Person.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1788/Person.cs 2009-05-22 23:35:49 UTC (rev 4366) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.NHSpecificTest.NH1788 +{ + public class Person + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual byte[] Version { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 23:32:10 UTC (rev 4365) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-22 23:35:49 UTC (rev 4366) @@ -432,6 +432,8 @@ <Compile Include="NHSpecificTest\NH1776\FilterQueryTwiceFixture.cs" /> <Compile Include="NHSpecificTest\NH1783\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH1783\SampleTest.cs" /> + <Compile Include="NHSpecificTest\NH1788\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1788\Person.cs" /> <Compile Include="NHSpecificTest\NH1792\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1792\Product.cs" /> <Compile Include="NHSpecificTest\NH1794\Fixture.cs" /> @@ -1829,6 +1831,7 @@ <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <EmbeddedResource Include="Ado\AlmostSimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1788\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1794\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1792\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1756\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-05-23 04:59:29
|
Revision: 4367 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4367&view=rev Author: fabiomaulo Date: 2009-05-23 04:59:13 +0000 (Sat, 23 May 2009) Log Message: ----------- Revert NH-1790 (only the part that change the base behavior of the AbstractBatcher) See comments on JIRA issue. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-22 23:35:49 UTC (rev 4366) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-05-23 04:59:13 UTC (rev 4367) @@ -80,12 +80,5 @@ totalExpectedRowsAffected = 0; currentBatch = new SqlClientSqlCommandSet(); } - - protected override void OnPreparedCommand() - { - // SQL Server batching can handle several different commands, and - // that gives us a nice perf boost when mixing different queries for - // batching - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-22 23:35:49 UTC (rev 4366) +++ trunk/nhibernate/src/NHibernate.Test/Ado/BatcherFixture.cs 2009-05-23 04:59:13 UTC (rev 4367) @@ -124,7 +124,7 @@ Cleanup(); } - [Test] + [Test, Ignore("Not fixed yet.")] [Description("SqlClient: The batcher log output should be formatted")] public void BatchedoutputShouldBeFormatted() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-23 05:19:10
|
Revision: 4370 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4370&view=rev Author: fabiomaulo Date: 2009-05-23 05:18:39 +0000 (Sat, 23 May 2009) Log Message: ----------- Fix NH-1797 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2009-05-23 05:17:40 UTC (rev 4369) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2009-05-23 05:18:39 UTC (rev 4370) @@ -44,6 +44,12 @@ /// </remarks> public override SqlString GetLimitString(SqlString querySqlString, int offset, int last) { + //dont do this paging code if there is no offset, use the + //sql 2000 dialect since it wont just uses a top statement + if (offset == 0) + { + return base.GetLimitString(querySqlString, offset, last); + } // we have to do this in order to support parameters in order clause, the foramt // that sql 2005 uses for paging means that we move the parameters around, which means, // that positions are lost, so we record them before making any changes. Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2009-05-23 05:17:40 UTC (rev 4369) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2009-05-23 05:18:39 UTC (rev 4370) @@ -15,28 +15,28 @@ { MsSql2005Dialect d = new MsSql2005Dialect(); - SqlString str = d.GetLimitString(new SqlString("select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_ from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name"), 0, 10); + SqlString str = d.GetLimitString(new SqlString("select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_ from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name"), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 Contact1_19_0_, Rating2_19_0_ FROM (select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_, ROW_NUMBER() OVER(ORDER BY c.Rating DESC, c.Last_Name, c.First_Name) as __hibernate_sort_row from dbo.Contact c where COALESCE(c.Rating, 0) > 0) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 Contact1_19_0_, Rating2_19_0_ FROM (select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_, ROW_NUMBER() OVER(ORDER BY c.Rating DESC, c.Last_Name, c.First_Name) as __hibernate_sort_row from dbo.Contact c where COALESCE(c.Rating, 0) > 0) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); - str = d.GetLimitString(new SqlString("SELECT fish.id FROM fish"), 0, 10); + str = d.GetLimitString(new SqlString("SELECT fish.id FROM fish"), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 id FROM (SELECT fish.id, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 id FROM (SELECT fish.id, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); - str = d.GetLimitString(new SqlString("SELECT DISTINCT fish_.id FROM fish fish_"), 0, 10); + str = d.GetLimitString(new SqlString("SELECT DISTINCT fish_.id FROM fish fish_"), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 id FROM (SELECT DISTINCT fish_.id, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish fish_) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 id FROM (SELECT DISTINCT fish_.id, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish fish_) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); - str = d.GetLimitString(new SqlString("SELECT DISTINCT fish_.id as ixx9_ FROM fish fish_"), 0, 10); + str = d.GetLimitString(new SqlString("SELECT DISTINCT fish_.id as ixx9_ FROM fish fish_"), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 ixx9_ FROM (SELECT DISTINCT fish_.id as ixx9_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish fish_) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 ixx9_ FROM (SELECT DISTINCT fish_.id as ixx9_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish fish_) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); str = d.GetLimitString(new SqlString("SELECT * FROM fish ORDER BY name"), 5, 15); @@ -59,40 +59,51 @@ "SELECT TOP 20 * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY name DESC) as __hibernate_sort_row FROM fish LEFT JOIN (SELECT * FROM meat ORDER BY weight) AS t) as query WHERE query.__hibernate_sort_row > 10 ORDER BY query.__hibernate_sort_row", str.ToString()); - str = d.GetLimitString(new SqlString("SELECT *, (SELECT COUNT(1) FROM fowl WHERE fish_id = fish.id) AS some_count FROM fish"), 0, 10); + str = d.GetLimitString(new SqlString("SELECT *, (SELECT COUNT(1) FROM fowl WHERE fish_id = fish.id) AS some_count FROM fish"), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 *, some_count FROM (SELECT *, (SELECT COUNT(1) FROM fowl WHERE fish_id = fish.id) AS some_count, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 *, some_count FROM (SELECT *, (SELECT COUNT(1) FROM fowl WHERE fish_id = fish.id) AS some_count, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); - str = d.GetLimitString(new SqlString("SELECT * FROM fish WHERE scales = ", Parameter.Placeholder), 0, 10); + str = d.GetLimitString(new SqlString("SELECT * FROM fish WHERE scales = ", Parameter.Placeholder), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish WHERE scales = ?) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish WHERE scales = ?) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); - str = d.GetLimitString(new SqlString("SELECT f.Type, COUNT(DISTINCT f.Name) AS Name FROM Fish f GROUP BY f.Type ORDER BY COUNT(DISTINCT f.Name)"), 0, 10); + str = d.GetLimitString(new SqlString("SELECT f.Type, COUNT(DISTINCT f.Name) AS Name FROM Fish f GROUP BY f.Type ORDER BY COUNT(DISTINCT f.Name)"), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 Type, Name FROM (SELECT f.Type, COUNT(DISTINCT f.Name) AS Name, ROW_NUMBER() OVER(ORDER BY COUNT(DISTINCT f.Name)) as __hibernate_sort_row FROM Fish f GROUP BY f.Type) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 Type, Name FROM (SELECT f.Type, COUNT(DISTINCT f.Name) AS Name, ROW_NUMBER() OVER(ORDER BY COUNT(DISTINCT f.Name)) as __hibernate_sort_row FROM Fish f GROUP BY f.Type) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); } [Test] + [Description("should use only TOP clause if there is no offset")] + public void OnlyOffsetLimit() + { + var d = new MsSql2005Dialect(); + + SqlString str = d.GetLimitString(new SqlString("select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_ from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name"), 0, 10); + System.Console.WriteLine(str); + Assert.That(str.ToString(), Is.EqualTo("select distinct top 10 c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_ from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name")); + } + + [Test] public void NH1187() { MsSql2005Dialect d = new MsSql2005Dialect(); SqlString result = - d.GetLimitString(new SqlString("select concat(a.Description,', ', a.Description) as desc from Animal a"), 0, 10); + d.GetLimitString(new SqlString("select concat(a.Description,', ', a.Description) as desc from Animal a"), 1, 10); System.Console.WriteLine(result); - Assert.AreEqual("SELECT TOP 10 desc FROM (select concat(a.Description,', ', a.Description) as desc, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row from Animal a) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", result.ToString()); + Assert.AreEqual("SELECT TOP 10 desc FROM (select concat(a.Description,', ', a.Description) as desc, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row from Animal a) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", result.ToString()); // The test use the function "cast" because cast need the keyWork "as" too SqlString str = - d.GetLimitString(new SqlString("SELECT fish.id, cast('astring, with,comma' as string) as bar FROM fish"), 0, 10); + d.GetLimitString(new SqlString("SELECT fish.id, cast('astring, with,comma' as string) as bar FROM fish"), 1, 10); System.Console.WriteLine(str); Assert.AreEqual( - "SELECT TOP 10 id, bar FROM (SELECT fish.id, cast('astring, with,comma' as string) as bar, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish) as query WHERE query.__hibernate_sort_row > 0 ORDER BY query.__hibernate_sort_row", + "SELECT TOP 10 id, bar FROM (SELECT fish.id, cast('astring, with,comma' as string) as bar, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM fish) as query WHERE query.__hibernate_sort_row > 1 ORDER BY query.__hibernate_sort_row", str.ToString()); } [Test] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-24 06:13:44
|
Revision: 4373 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4373&view=rev Author: fabiomaulo Date: 2009-05-24 06:13:38 +0000 (Sun, 24 May 2009) Log Message: ----------- Fix NH-1553 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs trunk/nhibernate/src/NHibernate/Exceptions/ISQLExceptionConverter.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Exceptions/AdoExceptionContextInfo.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Person.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SQLUpdateConflictToStaleStateExceptionConverter.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs Modified: trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2009-05-24 05:24:03 UTC (rev 4372) +++ trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2009-05-24 06:13:38 UTC (rev 4373) @@ -12,8 +12,20 @@ { public const string SQLNotAvailable = "SQL not available"; + public static Exception Convert(ISQLExceptionConverter converter, AdoExceptionContextInfo exceptionContextInfo) + { + if(exceptionContextInfo == null) + { + throw new AssertionFailure("The argument exceptionContextInfo is null."); + } + var sql = TryGetActualSqlQuery(exceptionContextInfo.SqlException, exceptionContextInfo.Sql); + ADOExceptionReporter.LogExceptions(exceptionContextInfo.SqlException, + ExtendMessage(exceptionContextInfo.Message, sql, null, null)); + return converter.Convert(exceptionContextInfo); + } + /// <summary> - /// Converts the given SQLException into NHibernate's ADOException hierarchy, as well as performing + /// Converts the given SQLException into Exception hierarchy, as well as performing /// appropriate logging. /// </summary> /// <param name="converter">The converter to use.</param> @@ -24,14 +36,11 @@ public static Exception Convert(ISQLExceptionConverter converter, Exception sqlException, string message, SqlString sql) { - sql = TryGetActualSqlQuery(sqlException, sql); - ADOExceptionReporter.LogExceptions(sqlException, ExtendMessage(message, sql, null, null)); - return - converter.Convert(new AdoExceptionContextInfo {SqlException = sqlException, Message = message, Sql = sql.ToString()}); + return Convert(converter, new AdoExceptionContextInfo {SqlException = sqlException, Message = message, Sql = sql.ToString()}); } /// <summary> - /// Converts the given SQLException into NHibernate's ADOException hierarchy, as well as performing + /// Converts the given SQLException into Exception hierarchy, as well as performing /// appropriate logging. /// </summary> /// <param name="converter">The converter to use.</param> @@ -40,16 +49,15 @@ /// <returns> The converted <see cref="ADOException"/>.</returns> public static Exception Convert(ISQLExceptionConverter converter, Exception sqlException, string message) { - var sql = new SqlString(SQLNotAvailable); - sql = TryGetActualSqlQuery(sqlException, sql); - return Convert(converter, sqlException, message, sql); + var sql = TryGetActualSqlQuery(sqlException, SQLNotAvailable); + return Convert(converter, new AdoExceptionContextInfo {SqlException = sqlException, Message = message, Sql = sql}); } public static ADOException Convert(ISQLExceptionConverter converter, Exception sqle, string message, SqlString sql, object[] parameterValues, IDictionary<string, TypedValue> namedParameters) { sql = TryGetActualSqlQuery(sqle, sql); - string extendMessage = ExtendMessage(message, sql, parameterValues, namedParameters); + string extendMessage = ExtendMessage(message, sql.ToString(), parameterValues, namedParameters); ADOExceptionReporter.LogExceptions(sqle, extendMessage); return new ADOException(extendMessage, sqle, sql.ToString()); } @@ -69,7 +77,7 @@ return result; } - public static string ExtendMessage(string message, SqlString sql, object[] parameterValues, + public static string ExtendMessage(string message, string sql, object[] parameterValues, IDictionary<string, TypedValue> namedParameters) { var sb = new StringBuilder(); @@ -105,5 +113,11 @@ } return sql; } + + public static string TryGetActualSqlQuery(Exception sqle, string sql) + { + var query = (string)sqle.Data["actual-sql-query"]; + return query ?? sql; + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Exceptions/AdoExceptionContextInfo.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Exceptions/AdoExceptionContextInfo.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Exceptions/AdoExceptionContextInfo.cs 2009-05-24 06:13:38 UTC (rev 4373) @@ -0,0 +1,40 @@ +using System; + +namespace NHibernate.Exceptions +{ + /// <summary> + /// Collect data of an <see cref="ADOException"/> to be converted. + /// </summary> + [Serializable] + public class AdoExceptionContextInfo + { + // This class was introduced, in NH, to allow less intrusive possible extensions + // of information given to the ISQLExceptionConverter + // (extensions of a class instead succesive changes of a method) + + /// <summary> + /// The <see cref="System.Data.Common.DbException"/> to be converted. + /// </summary> + public Exception SqlException { get; set; } + + /// <summary> + /// An optional error message. + /// </summary> + public string Message { get; set; } + + /// <summary> + /// The SQL that generate the exception + /// </summary> + public string Sql { get; set; } + + /// <summary> + /// Optional EntityName where available in the original exception context. + /// </summary> + public string EntityName { get; set; } + + /// <summary> + /// Optional EntityId where available in the original exception context. + /// </summary> + public object EntityId { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Exceptions/ISQLExceptionConverter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Exceptions/ISQLExceptionConverter.cs 2009-05-24 05:24:03 UTC (rev 4372) +++ trunk/nhibernate/src/NHibernate/Exceptions/ISQLExceptionConverter.cs 2009-05-24 06:13:38 UTC (rev 4373) @@ -2,31 +2,6 @@ namespace NHibernate.Exceptions { - /// <summary> - /// Collect data of an <see cref="ADOException"/> to be converted. - /// </summary> - public class AdoExceptionContextInfo - { - // This class was introduced, in NH, to allow less intrusive possible extensions - // of information given to the ISQLExceptionConverter - // (extensions of a class instead succesive changes of a method) - - /// <summary> - /// The <see cref="System.Data.Common.DbException"/> to be converted. - /// </summary> - public Exception SqlException { get; set; } - - /// <summary> - /// An optional error message. - /// </summary> - public string Message { get; set; } - - /// <summary> - /// The SQL that generate the exception - /// </summary> - public string Sql { get; set; } - } - /// <summary> /// Defines a contract for implementations that know how to convert a <see cref="System.Data.Common.DbException"/> /// into NHibernate's <see cref="ADOException"/> hierarchy. Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-24 05:24:03 UTC (rev 4372) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-24 06:13:38 UTC (rev 4373) @@ -478,6 +478,7 @@ <Compile Include="EntityModeEqualityComparer.cs" /> <Compile Include="Event\AbstractPreDatabaseOperationEvent.cs" /> <Compile Include="Event\IDestructible.cs" /> + <Compile Include="Exceptions\AdoExceptionContextInfo.cs" /> <Compile Include="Exceptions\ReflectionBasedSqlStateExtracter.cs" /> <Compile Include="Exceptions\SqlStateExtracter.cs" /> <Compile Include="Exceptions\TemplatedViolatedConstraintNameExtracter.cs" /> Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-05-24 05:24:03 UTC (rev 4372) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2009-05-24 06:13:38 UTC (rev 4373) @@ -2727,7 +2727,15 @@ } catch (DbException sqle) { - throw ADOExceptionHelper.Convert(Factory.SQLExceptionConverter, sqle, "could not update: " + MessageHelper.InfoString(this, id, Factory), sql.Text); + var exceptionContext = new AdoExceptionContextInfo + { + SqlException = sqle, + Message = "could not update: " + MessageHelper.InfoString(this, id, Factory), + Sql = sql.Text.ToString(), + EntityName = EntityName, + EntityId = id + }; + throw ADOExceptionHelper.Convert(Factory.SQLExceptionConverter, exceptionContext); } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Mappings.hbm.xml 2009-05-24 06:13:38 UTC (rev 4373) @@ -0,0 +1,19 @@ +<?xml version="1.0" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1553.MsSQL"> + + + <class name="Person"> + <id name="Id" column="Id" type="long"> + <generator class="identity" /> + </id> + + <version name="Version" column="Version" type="long" /> + + <property name="IdentificationNumber" column="IdentificationNumber" type="long" /> + + </class> + + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Person.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/Person.cs 2009-05-24 06:13:38 UTC (rev 4373) @@ -0,0 +1,14 @@ +namespace NHibernate.Test.NHSpecificTest.NH1553.MsSQL +{ + /// <summary> + /// A simple entity for the test. + /// </summary> + public class Person + { + public virtual long Id { get; set; } + + public virtual long Version { get; set; } + + public virtual long IdentificationNumber { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SQLUpdateConflictToStaleStateExceptionConverter.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SQLUpdateConflictToStaleStateExceptionConverter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SQLUpdateConflictToStaleStateExceptionConverter.cs 2009-05-24 06:13:38 UTC (rev 4373) @@ -0,0 +1,23 @@ +using System; +using System.Data.SqlClient; +using NHibernate.Exceptions; + +namespace NHibernate.Test.NHSpecificTest.NH1553.MsSQL +{ + /// <summary> + /// Exception converter to convert SQL Snapshot isolation update conflict to + /// StaleObjectStateException + /// </summary> + public class SQLUpdateConflictToStaleStateExceptionConverter : ISQLExceptionConverter + { + public Exception Convert(AdoExceptionContextInfo exInfo) + { + var sqle = ADOExceptionHelper.ExtractDbException(exInfo.SqlException) as SqlException; + if ((sqle != null) && (sqle.Number == 3960)) + { + return new StaleObjectStateException(exInfo.EntityName, exInfo.EntityId); + } + return SQLStateConverter.HandledNonSpecificException(exInfo.SqlException, exInfo.Message, exInfo.Sql); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs 2009-05-24 06:13:38 UTC (rev 4373) @@ -0,0 +1,180 @@ +using System.Data; +using NHibernate.Cfg; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1553.MsSQL +{ + /// <summary> + /// Test fixture for NH1553, which checks update conflict detection together with snapshot isolation transaction isolation level. + /// </summary> + [TestFixture] + public class SnapshotIsolationUpdateConflictTest : BugTestCase + { + private Person person; + + public override string BugNumber + { + get { return "NH1553.MsSQL"; } + } + + private ITransaction BeginTransaction(ISession session) + { + return session.BeginTransaction(IsolationLevel.Snapshot); + } + + private Person LoadPerson() + { + using (ISession session = OpenSession()) + { + using (ITransaction tr = BeginTransaction(session)) + { + var p = session.Get<Person>(person.Id); + tr.Commit(); + return p; + } + } + } + + private void SavePerson(Person p) + { + using (ISession session = OpenSession()) + { + using (ITransaction tr = BeginTransaction(session)) + { + session.SaveOrUpdate(p); + session.Flush(); + tr.Commit(); + } + } + } + + /// <summary> + /// Tests, that NHibernate detects the update conflict and returns a StaleObjectStateException as expected. + /// This behaviour is part of the standard NHibernate feature set. + /// </summary> + [Test] + public void UpdateConflictDetectedByNH() + { + Person p1 = LoadPerson(); + Person p2 = LoadPerson(); + + p1.IdentificationNumber++; + p2.IdentificationNumber += 2; + + SavePerson(p1); + Assert.AreEqual(person.Version + 1, p1.Version); + try + { + SavePerson(p2); + Assert.Fail("Expecting stale object state exception"); + } + catch (StaleObjectStateException sose) + { + Assert.AreEqual(typeof (Person).FullName, sose.EntityName); + Assert.AreEqual(p2.Id, sose.Identifier); + // as expected. + } + } + + /// <summary> + /// Tests, that the extension provided wraps the returned SQL Exception inside a StaleObjectStateException, + /// if the SQL Server detects an update conflict in snapshot isolation. + /// </summary> + [Test] + public void UpdateConflictDetectedBySQLServer() + { + Person p1 = LoadPerson(); + + p1.IdentificationNumber++; + + using (ISession session1 = OpenSession()) + { + using (ITransaction tr1 = BeginTransaction(session1)) + { + session1.SaveOrUpdate(p1); + session1.Flush(); + + using (ISession session2 = OpenSession()) + { + using (ITransaction tr2 = BeginTransaction(session2)) + { + var p2 = session2.Get<Person>(person.Id); + p2.IdentificationNumber += 2; + + tr1.Commit(); + Assert.AreEqual(person.Version + 1, p1.Version); + + try + { + session2.SaveOrUpdate(p2); + session2.Flush(); + + tr2.Commit(); + Assert.Fail("StaleObjectStateException expected"); + } + catch (StaleObjectStateException sose) + { + Assert.AreEqual(typeof (Person).FullName, sose.EntityName); + Assert.AreEqual(p2.Id, sose.Identifier); + // as expected + } + } + } + } + } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2005Dialect || dialect is MsSql2008Dialect; + } + + private void SetAllowSnapshotIsolation(bool on) + { + using (ISession session = OpenSession()) + { + IDbCommand command = session.Connection.CreateCommand(); + command.CommandText = "ALTER DATABASE " + session.Connection.Database + " set allow_snapshot_isolation " + + (on ? "on" : "off"); + command.ExecuteNonQuery(); + } + } + + protected override void OnSetUp() + { + base.OnSetUp(); + + SetAllowSnapshotIsolation(true); + + person = new Person(); + person.IdentificationNumber = 123; + SavePerson(person); + } + + protected override void OnTearDown() + { + using (ISession session = OpenSession()) + { + using (ITransaction tr = session.BeginTransaction(IsolationLevel.Serializable)) + { + string hql = "from Person"; + session.Delete(hql); + session.Flush(); + tr.Commit(); + } + } + + SetAllowSnapshotIsolation(false); + + base.OnTearDown(); + } + + protected override void Configure(Configuration configuration) + { + base.Configure(configuration); + configuration.SetProperty(Environment.SqlExceptionConverter, + typeof (SQLUpdateConflictToStaleStateExceptionConverter).AssemblyQualifiedName); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-24 05:24:03 UTC (rev 4372) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-05-24 06:13:38 UTC (rev 4373) @@ -356,6 +356,9 @@ <Compile Include="NHSpecificTest\NH1343\Product.cs" /> <Compile Include="NHSpecificTest\NH1343\ProductFixture.cs" /> <Compile Include="NHSpecificTest\NH1388\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1553\MsSQL\Person.cs" /> + <Compile Include="NHSpecificTest\NH1553\MsSQL\SnapshotIsolationUpdateConflictTest.cs" /> + <Compile Include="NHSpecificTest\NH1553\MsSQL\SQLUpdateConflictToStaleStateExceptionConverter.cs" /> <Compile Include="NHSpecificTest\NH1574\Principal.cs" /> <Compile Include="NHSpecificTest\NH1574\SpecializedPrincipal.cs" /> <Compile Include="NHSpecificTest\NH1574\SpecializedTeaml.cs" /> @@ -1831,6 +1834,7 @@ <EmbeddedResource Include="Ado\VerySimple.hbm.xml" /> <EmbeddedResource Include="Ado\AlmostSimple.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1553\MsSQL\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1788\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1794\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1792\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-05-25 22:27:07
|
Revision: 4388 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4388&view=rev Author: fabiomaulo Date: 2009-05-25 22:26:28 +0000 (Mon, 25 May 2009) Log Message: ----------- Refactoring (common AbstractProxyFactory) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ProxyFactory.cs trunk/nhibernate/src/NHibernate.ByteCode.Spring/NHibernate.ByteCode.Spring.csproj trunk/nhibernate/src/NHibernate.ByteCode.Spring/ProxyFactoryFactory.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Proxy/AbstractProxyFactory.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate.ByteCode.Spring/AbstractProxyFactory.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-25 21:31:19 UTC (rev 4387) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-05-25 22:26:28 UTC (rev 4388) @@ -598,6 +598,7 @@ <Compile Include="Hql\Ast\ANTLR\Util\LiteralProcessor.cs" /> <Compile Include="Hql\Ast\ANTLR\Util\NodeTraverser.cs" /> <Compile Include="Param\VersionTypeSeedParameterSpecification.cs" /> + <Compile Include="Proxy\AbstractProxyFactory.cs" /> <Compile Include="SqlCommand\InsertSelect.cs" /> <Compile Include="Transaction\AdoNetWithDistrubtedTransactionFactory.cs" /> <Compile Include="Transform\ToListResultTransformer.cs" /> Added: trunk/nhibernate/src/NHibernate/Proxy/AbstractProxyFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Proxy/AbstractProxyFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Proxy/AbstractProxyFactory.cs 2009-05-25 22:26:28 UTC (rev 4388) @@ -0,0 +1,46 @@ +using System.Reflection; +using Iesi.Collections.Generic; +using NHibernate.Engine; +using NHibernate.Type; + +namespace NHibernate.Proxy +{ + /// <summary> + /// Convenient common implementation for ProxyFactory + /// </summary> + public abstract class AbstractProxyFactory: IProxyFactory + { + protected virtual string EntityName { get; private set; } + protected virtual System.Type PersistentClass { get; private set; } + protected virtual System.Type[] Interfaces { get; private set; } + protected virtual MethodInfo GetIdentifierMethod { get; private set; } + protected virtual MethodInfo SetIdentifierMethod { get; private set; } + protected virtual IAbstractComponentType ComponentIdType { get; private set; } + + protected bool IsClassProxy + { + get { return Interfaces.Length == 1; } + } + + public virtual void PostInstantiate(string entityName, System.Type persistentClass, ISet<System.Type> interfaces, + MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, + IAbstractComponentType componentIdType) + { + EntityName = entityName; + PersistentClass = persistentClass; + Interfaces = new System.Type[interfaces.Count]; + + if (interfaces.Count > 0) + { + interfaces.CopyTo(Interfaces, 0); + } + + GetIdentifierMethod = getIdentifierMethod; + SetIdentifierMethod = setIdentifierMethod; + ComponentIdType = componentIdType; + } + + + public abstract INHibernateProxy GetProxy(object id, ISessionImplementor session); + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs 2009-05-25 21:31:19 UTC (rev 4387) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs 2009-05-25 22:26:28 UTC (rev 4388) @@ -1,95 +1,37 @@ using System; -using System.Reflection; using Castle.DynamicProxy; -using Iesi.Collections.Generic; using log4net; using NHibernate.Engine; using NHibernate.Proxy; -using NHibernate.Type; namespace NHibernate.ByteCode.Castle { - public class ProxyFactory : IProxyFactory + public class ProxyFactory : AbstractProxyFactory { protected static readonly ILog log = LogManager.GetLogger(typeof (ProxyFactory)); - private static readonly ProxyGenerator _proxyGenerator = new ProxyGenerator(); + private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator(); - private System.Type _persistentClass; - private System.Type[] _interfaces; - private MethodInfo _getIdentifierMethod; - private MethodInfo _setIdentifierMethod; - private string _entityName; - private IAbstractComponentType _componentIdType; - - public virtual void PostInstantiate(string entityName, System.Type persistentClass, ISet<System.Type> interfaces, - MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, - IAbstractComponentType componentIdType) - { - _entityName = entityName; - _persistentClass = persistentClass; - _interfaces = new System.Type[interfaces.Count]; - interfaces.CopyTo(_interfaces, 0); - _getIdentifierMethod = getIdentifierMethod; - _setIdentifierMethod = setIdentifierMethod; - _componentIdType = componentIdType; - } - protected static ProxyGenerator DefaultProxyGenerator { - get { return _proxyGenerator; } + get { return ProxyGenerator; } } - protected System.Type PersistentClass - { - get { return _persistentClass; } - } - - protected System.Type[] Interfaces - { - get { return _interfaces; } - } - - protected MethodInfo GetIdentifierMethod - { - get { return _getIdentifierMethod; } - } - - protected MethodInfo SetIdentifierMethod - { - get { return _setIdentifierMethod; } - } - - protected bool IsClassProxy - { - get { return _interfaces.Length == 1; } - } - - public string EntityName - { - get { return _entityName; } - } - - public IAbstractComponentType ComponentIdType - { - get { return _componentIdType; } - } - /// <summary> /// Build a proxy using the Castle.DynamicProxy library. /// </summary> /// <param name="id">The value for the Id.</param> /// <param name="session">The Session the proxy is in.</param> /// <returns>A fully built <c>INHibernateProxy</c>.</returns> - public virtual INHibernateProxy GetProxy(object id, ISessionImplementor session) + public override INHibernateProxy GetProxy(object id, ISessionImplementor session) { try { - var initializer = new LazyInitializer(EntityName, _persistentClass, id, _getIdentifierMethod, - _setIdentifierMethod, ComponentIdType, session); + var initializer = new LazyInitializer(EntityName, PersistentClass, id, GetIdentifierMethod, + SetIdentifierMethod, ComponentIdType, session); object generatedProxy = IsClassProxy - ? _proxyGenerator.CreateClassProxy(_persistentClass, _interfaces, initializer) - : _proxyGenerator.CreateInterfaceProxyWithoutTarget(_interfaces[0], _interfaces, + ? ProxyGenerator.CreateClassProxy(PersistentClass, Interfaces, initializer) + : ProxyGenerator.CreateInterfaceProxyWithoutTarget(Interfaces[0], Interfaces, initializer); initializer._constructed = true; Modified: trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ProxyFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ProxyFactory.cs 2009-05-25 21:31:19 UTC (rev 4387) +++ trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ProxyFactory.cs 2009-05-25 22:26:28 UTC (rev 4388) @@ -1,57 +1,19 @@ using System; -using System.Reflection; -using Iesi.Collections.Generic; using log4net; using NHibernate.Engine; using NHibernate.Proxy; -using NHibernate.Type; namespace NHibernate.ByteCode.LinFu { - public class ProxyFactory : IProxyFactory + public class ProxyFactory : AbstractProxyFactory { private static readonly global::LinFu.DynamicProxy.ProxyFactory factory = new global::LinFu.DynamicProxy.ProxyFactory(); protected static readonly ILog log = LogManager.GetLogger(typeof (ProxyFactory)); - protected System.Type PersistentClass { get; private set; } - - protected System.Type[] Interfaces { get; private set; } - - protected MethodInfo GetIdentifierMethod { get; private set; } - - public MethodInfo SetIdentifierMethod { get; private set; } - - protected IAbstractComponentType ComponentIdType { get; private set; } - - protected string EntityName { get; private set; } - - protected bool IsClassProxy - { - get { return Interfaces.Length == 1; } - } - #region IProxyFactory Members - public void PostInstantiate(string entityName, System.Type persistentClass, ISet<System.Type> interfaces, - MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, - IAbstractComponentType componentIdType) + public override INHibernateProxy GetProxy(object id, ISessionImplementor session) { - EntityName = entityName; - PersistentClass = persistentClass; - Interfaces = new System.Type[interfaces.Count]; - - if (interfaces.Count > 0) - { - interfaces.CopyTo(Interfaces, 0); - } - - GetIdentifierMethod = getIdentifierMethod; - SetIdentifierMethod = setIdentifierMethod; - ComponentIdType = componentIdType; - } - - public INHibernateProxy GetProxy(object id, ISessionImplementor session) - { try { var initializer = new LazyInitializer(EntityName, PersistentClass, id, GetIdentifierMethod, SetIdentifierMethod, Deleted: trunk/nhibernate/src/NHibernate.ByteCode.Spring/AbstractProxyFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Spring/AbstractProxyFactory.cs 2009-05-25 21:31:19 UTC (rev 4387) +++ trunk/nhibernate/src/NHibernate.ByteCode.Spring/AbstractProxyFactory.cs 2009-05-25 22:26:28 UTC (rev 4388) @@ -1,48 +0,0 @@ -using System.Reflection; -using Iesi.Collections.Generic; -using NHibernate.Engine; -using NHibernate.Proxy; -using NHibernate.Type; - -namespace NHibernate.ByteCode.Spring -{ - /// <summary> - /// Convenience base class for <see cref="IProxyFactory"/> implementations, - /// providing common functionality. - /// </summary> - /// <author>Erich Eichinger (Spring.NET Team)</author> - public abstract class AbstractProxyFactory : IProxyFactory - { - protected string EntityName { get; private set; } - protected System.Type PersistentClass { get; private set; } - protected System.Type[] Interfaces { get; private set; } - protected MethodInfo GetIdentifierMethod { get; private set; } - protected MethodInfo SetIdentifierMethod { get; private set; } - protected IAbstractComponentType ComponentIdType { get; private set; } - - protected bool IsClassProxy - { - get { return Interfaces.Length == 1; } - } - - public virtual void PostInstantiate(string entityName, System.Type persistentClass, ISet<System.Type> interfaces, - MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, - IAbstractComponentType componentIdType) - { - EntityName = entityName; - PersistentClass = persistentClass; - Interfaces = new System.Type[interfaces.Count]; - - if (interfaces.Count > 0) - { - interfaces.CopyTo(Interfaces, 0); - } - - GetIdentifierMethod = getIdentifierMethod; - SetIdentifierMethod = setIdentifierMethod; - ComponentIdType = componentIdType; - } - - public abstract INHibernateProxy GetProxy(object id, ISessionImplementor session); - } -} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.ByteCode.Spring/NHibernate.ByteCode.Spring.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Spring/NHibernate.ByteCode.Spring.csproj 2009-05-25 21:31:19 UTC (rev 4387) +++ trunk/nhibernate/src/NHibernate.ByteCode.Spring/NHibernate.ByteCode.Spring.csproj 2009-05-25 22:26:28 UTC (rev 4388) @@ -63,7 +63,6 @@ </Reference> </ItemGroup> <ItemGroup> - <Compile Include="AbstractProxyFactory.cs" /> <Compile Include="AssemblyInfo.cs" /> <Compile Include="LazyInitializer.cs" /> <Compile Include="ProxyFactory.cs" /> Modified: trunk/nhibernate/src/NHibernate.ByteCode.Spring/ProxyFactoryFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Spring/ProxyFactoryFactory.cs 2009-05-25 21:31:19 UTC (rev 4387) +++ trunk/nhibernate/src/NHibernate.ByteCode.Spring/ProxyFactoryFactory.cs 2009-05-25 22:26:28 UTC (rev 4388) @@ -6,9 +6,6 @@ /// <summary> /// Creates a Spring for .NET backed <see cref="IProxyFactory"/> instance. /// </summary> - /// <remarks> - /// TODO: mention how to configure - /// </remarks> /// <author>Erich Eichinger</author> public class ProxyFactoryFactory : IProxyFactoryFactory { @@ -21,7 +18,6 @@ public IProxyValidator ProxyValidator { - // TODO : check what this validator does? get { return new DynProxyTypeValidator(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-05-30 03:49:20
|
Revision: 4391 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4391&view=rev Author: fabiomaulo Date: 2009-05-30 03:49:14 +0000 (Sat, 30 May 2009) Log Message: ----------- Fix NH-1804 introducing a new property cache.default_expiration Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2009-05-29 16:35:45 UTC (rev 4390) +++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2009-05-30 03:49:14 UTC (rev 4391) @@ -120,6 +120,7 @@ public const string UseSecondLevelCache = "cache.use_second_level_cache"; public const string CacheRegionPrefix = "cache.region_prefix"; public const string UseMinimalPuts = "cache.use_minimal_puts"; + public const string CacheDefaultExpiration = "cache.default_expiration"; public const string QuerySubstitutions = "query.substitutions"; /// <summary> Should named queries be checked during startup (the default is enabled). </summary> Modified: trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd =================================================================== --- trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2009-05-29 16:35:45 UTC (rev 4390) +++ trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2009-05-30 03:49:14 UTC (rev 4391) @@ -79,6 +79,7 @@ <xs:enumeration value="cache.use_second_level_cache" /> <xs:enumeration value="cache.region_prefix" /> <xs:enumeration value="cache.use_minimal_puts" /> + <xs:enumeration value="cache.default_expiration" /> <xs:enumeration value="query.substitutions" /> <xs:enumeration value="query.factory_class" /> <xs:enumeration value="query.imports" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |