From: <fab...@us...> - 2009-03-16 16:27:12
|
Revision: 4139 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4139&view=rev Author: fabiomaulo Date: 2009-03-16 16:27:01 +0000 (Mon, 16 Mar 2009) Log Message: ----------- Fix NH-1222 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd trunk/nhibernate/src/NHibernate.Test/Join/Employee.cs trunk/nhibernate/src/NHibernate.Test/Join/JoinTest.cs trunk/nhibernate/src/NHibernate.Test/Join/Person.cs trunk/nhibernate/src/NHibernate.Test/Join/Person.hbm.xml trunk/nhibernate/src/NHibernate.Tool.HbmXsd/Program.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs 2009-03-16 16:27:01 UTC (rev 4139) @@ -3780,10 +3780,17 @@ /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("any", typeof(HbmAny))] + [System.Xml.Serialization.XmlElementAttribute("array", typeof(HbmArray))] + [System.Xml.Serialization.XmlElementAttribute("bag", typeof(HbmBag))] [System.Xml.Serialization.XmlElementAttribute("component", typeof(HbmComponent))] [System.Xml.Serialization.XmlElementAttribute("dynamic-component", typeof(HbmDynamicComponent))] + [System.Xml.Serialization.XmlElementAttribute("idbag", typeof(HbmIdbag))] + [System.Xml.Serialization.XmlElementAttribute("list", typeof(HbmList))] [System.Xml.Serialization.XmlElementAttribute("many-to-one", typeof(HbmManyToOne))] + [System.Xml.Serialization.XmlElementAttribute("map", typeof(HbmMap))] + [System.Xml.Serialization.XmlElementAttribute("primitive-array", typeof(HbmPrimitiveArray))] [System.Xml.Serialization.XmlElementAttribute("property", typeof(HbmProperty))] + [System.Xml.Serialization.XmlElementAttribute("set", typeof(HbmSet))] public object[] Items; /// <remarks/> Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-03-16 16:27:01 UTC (rev 4139) @@ -348,28 +348,40 @@ string propertyName = nameAttribute == null ? null : nameAttribute.Value; IValue value = null; - switch (name) + var collectionBinder = new CollectionBinder(this); + if (collectionBinder.CanCreate(name)) { - case "many-to-one": - value = new ManyToOne(table); - BindManyToOne(subnode, (ManyToOne) value, propertyName, true); - break; - case "any": - value = new Any(table); - BindAny(subnode, (Any) value, true); - break; - case "property": - value = new SimpleValue(table); - BindSimpleValue(subnode, (SimpleValue) value, true, propertyName); - break; - case "component": - case "dynamic-component": - string subpath = StringHelper.Qualify(path, propertyName); - value = new Component(join); - BindComponent(subnode, (Component) value, join.PersistentClass.MappedClass, join.PersistentClass.ClassName, propertyName, subpath, true); - break; + Mapping.Collection collection = collectionBinder.Create(name, subnode, persistentClass.EntityName, + propertyName, persistentClass, persistentClass.MappedClass); + + mappings.AddCollection(collection); + value = collection; } - + else + { + switch (name) + { + case "many-to-one": + value = new ManyToOne(table); + BindManyToOne(subnode, (ManyToOne) value, propertyName, true); + break; + case "any": + value = new Any(table); + BindAny(subnode, (Any) value, true); + break; + case "property": + value = new SimpleValue(table); + BindSimpleValue(subnode, (SimpleValue) value, true, propertyName); + break; + case "component": + case "dynamic-component": + string subpath = StringHelper.Qualify(path, propertyName); + value = new Component(join); + BindComponent(subnode, (Component) value, join.PersistentClass.MappedClass, join.PersistentClass.ClassName, + propertyName, subpath, true); + break; + } + } if (value != null) { Mapping.Property prop = CreateProperty(value, propertyName, persistentClass.MappedClass.AssemblyQualifiedName, subnode); Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-16 16:27:01 UTC (rev 4139) @@ -1149,16 +1149,10 @@ <SubType> </SubType> </EmbeddedResource> - <None Include="nhibernate-configuration.xsx"> - <DependentUpon>nhibernate-configuration.xsd</DependentUpon> - </None> <EmbeddedResource Include="nhibernate-mapping.xsd"> <SubType> </SubType> </EmbeddedResource> - <None Include="nhibernate-mapping.xsx"> - <DependentUpon>nhibernate-mapping.xsd</DependentUpon> - </None> <None Include="NHibernate.build" /> <None Include="Type\IType.cs.xmldoc" /> </ItemGroup> Modified: trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd =================================================================== --- trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd 2009-03-16 16:27:01 UTC (rev 4139) @@ -616,6 +616,13 @@ <xs:element ref="component" /> <xs:element ref="dynamic-component" /> <xs:element ref="any" /> + <xs:element ref="map" /> + <xs:element ref="set" /> + <xs:element ref="list" /> + <xs:element ref="bag" /> + <xs:element ref="idbag" /> + <xs:element ref="array" /> + <xs:element ref="primitive-array" /> </xs:choice> <xs:element ref="sql-insert" minOccurs="0" /> <xs:element ref="sql-update" minOccurs="0" /> Modified: trunk/nhibernate/src/NHibernate.Test/Join/Employee.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Join/Employee.cs 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate.Test/Join/Employee.cs 2009-03-16 16:27:01 UTC (rev 4139) @@ -1,9 +1,14 @@ using System; +using System.Collections.Generic; namespace NHibernate.Test.Join { public class Employee : Person { + public Employee() + { + Meetings = new List<Meeting>(); + } private string _Title; public virtual string Title { @@ -25,5 +30,13 @@ set { _Salary = value; } } + public virtual IList<Meeting> Meetings { get; set; } } + + public class Meeting + { + public virtual int Id { get; set; } + public virtual Employee Employee { get; set; } + public virtual string Description { get; set; } + } } Modified: trunk/nhibernate/src/NHibernate.Test/Join/JoinTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Join/JoinTest.cs 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate.Test/Join/JoinTest.cs 2009-03-16 16:27:01 UTC (rev 4139) @@ -1,3 +1,4 @@ +using Iesi.Collections.Generic; using log4net; using NHibernate.Criterion; using NUnit.Framework; @@ -154,7 +155,7 @@ Person p = CreatePerson("A guy"); p.HomePhone = null; p.BusinessPhone = null; - + p.OthersPhones = null; s.Save(p); s.Flush(); s.Clear(); @@ -295,7 +296,7 @@ p.Country = "Canada"; p.HomePhone = "555-1234"; p.BusinessPhone = "555-4321"; - + p.OthersPhones = new HashedSet<string> {"555-9876", "555-6789"}; return p; } @@ -308,7 +309,10 @@ if (!string.Equals(x.Country, y.Country)) return false; if (!string.Equals(x.HomePhone, y.HomePhone)) return false; if (!string.Equals(x.BusinessPhone, y.BusinessPhone)) return false; - + if(x.OthersPhones.Count != y.OthersPhones.Count) + { + return false; + } return true; } @@ -399,7 +403,8 @@ p.Title = title; p.Salary = 100; - + p.Meetings.Add(new Meeting {Employee = p, Description = "salary definition"}); + p.Meetings.Add(new Meeting { Employee = p, Description = "targets definition" }); return p; } @@ -475,7 +480,7 @@ if (!PersonsAreEqual(x, y)) return false; if (!string.Equals(x.Title, y.Title)) return false; if (x.Salary != y.Salary) return false; - + if (x.Meetings.Count != y.Meetings.Count) return false; if (x.Manager != null && y.Manager != null) { return x.Manager.Id == y.Manager.Id; @@ -509,6 +514,9 @@ emp0.Salary = 20000; emp0.Title = "Title"; emp0.Zip = "Zip"; + NHibernateUtil.Initialize(emp0.Meetings); + NHibernateUtil.Initialize(emp0.OthersPhones); + emp0.Meetings.Add(new Meeting { Employee = emp0, Description = "vacation def" }); // Not updating emp0.Sex because it is marked update=false in the mapping file. s.Flush(); Modified: trunk/nhibernate/src/NHibernate.Test/Join/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Join/Person.cs 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate.Test/Join/Person.cs 2009-03-16 16:27:01 UTC (rev 4139) @@ -1,9 +1,14 @@ using System; +using Iesi.Collections.Generic; namespace NHibernate.Test.Join { public class Person { + public Person() + { + OthersPhones = new HashedSet<string>(); + } private char _Sex; public virtual char Sex { @@ -67,5 +72,6 @@ set { _StuffName = value; } } + public virtual ISet<string> OthersPhones { get; set; } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Join/Person.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Join/Person.hbm.xml 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate.Test/Join/Person.hbm.xml 2009-03-16 16:27:01 UTC (rev 4139) @@ -27,6 +27,10 @@ <key column="phone_id"/> <property name="HomePhone"/> <property name="BusinessPhone"/> + <set name="OthersPhones" cascade="all" access="property"> + <key column="phone_id"/> + <element column="phone" type="string" length="20"/> + </set> </join> <join table="inversed_stuff" inverse="true"> @@ -40,6 +44,10 @@ <property name="Title" not-null="true" length="20"/> <property name="Salary"/> <many-to-one name="Manager"/> + <bag name="Meetings" cascade="all" inverse="true" access="property"> + <key column="person_id" on-delete="cascade"/> + <one-to-many class="Meeting"/> + </bag> </join> </subclass> @@ -62,5 +70,12 @@ </join> </subclass> </class> - + + <class name="Meeting"> + <id name="Id" access="property"> + <generator class="native"/> + </id> + <many-to-one name="Employee" column="person_id" access="property"/> + <property name="Description" length="100" access="property"/> + </class> </hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Tool.HbmXsd/Program.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Tool.HbmXsd/Program.cs 2009-03-15 16:55:08 UTC (rev 4138) +++ trunk/nhibernate/src/NHibernate.Tool.HbmXsd/Program.cs 2009-03-16 16:27:01 UTC (rev 4139) @@ -1,17 +1,11 @@ -using System; - namespace NHibernate.Tool.HbmXsd { public class Program { private static void Main(string[] args) { - // For debugging: ..\..\..\NHibernate\Cfg\MappingSchema\Hbm.generated.cs - - if (args.Length == 1) - new HbmCodeGenerator().Execute(args[0]); - else - Console.WriteLine("usage: HbmXsd <outputfile>"); + string outFile = args.Length == 0 ? @"..\..\..\NHibernate\Cfg\MappingSchema\Hbm.generated.cs" : args[0]; + new HbmCodeGenerator().Execute(outFile); } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-17 16:51:58
|
Revision: 4142 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4142&view=rev Author: fabiomaulo Date: 2009-03-17 16:51:43 +0000 (Tue, 17 Mar 2009) Log Message: ----------- Fix NH-1671 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Util/SoftLimitMRUCache.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/UtilityTest/SoftLimitMRUCacheFixture.cs Modified: trunk/nhibernate/src/NHibernate/Util/SoftLimitMRUCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/SoftLimitMRUCache.cs 2009-03-17 05:01:00 UTC (rev 4141) +++ trunk/nhibernate/src/NHibernate/Util/SoftLimitMRUCache.cs 2009-03-17 16:51:43 UTC (rev 4142) @@ -32,8 +32,8 @@ // actual cache of the entries. soft references are used for both the keys and the // values here since the values pertaining to the MRU entries are kept in a // separate hard reference cache (to avoid their enqueuement/garbage-collection). - [NonSerialized] - private readonly IDictionary softReferenceCache = new Hashtable(); + [NonSerialized] + private readonly IDictionary softReferenceCache = new WeakHashtable(); // the MRU cache used to keep hard references to the most recently used query plans; // note : LRU here is a bit of a misnomer, it indicates that LRU entries are removed, the Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-17 05:01:00 UTC (rev 4141) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-17 16:51:43 UTC (rev 4142) @@ -1113,6 +1113,7 @@ <Compile Include="UtilityTest\SafetyEnumerableFixture.cs" /> <Compile Include="UtilityTest\SequencedHashMapFixture.cs" /> <Compile Include="UtilityTest\SingletonEnumerableFixture.cs" /> + <Compile Include="UtilityTest\SoftLimitMRUCacheFixture.cs" /> <Compile Include="UtilityTest\StringHelperFixture.cs" /> <Compile Include="UtilityTest\StringTokenizerFixture.cs" /> <Compile Include="UtilityTest\ThreadSafeDictionaryFixture.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/UtilityTest/SoftLimitMRUCacheFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/SoftLimitMRUCacheFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/SoftLimitMRUCacheFixture.cs 2009-03-17 16:51:43 UTC (rev 4142) @@ -0,0 +1,29 @@ +using System; +using NHibernate.Util; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.UtilityTest +{ + [TestFixture] + public class SoftLimitMRUCacheFixture + { + [Test] + public void DontFillUp() + { + // NH-1671 + const int count = 32; + var s = new SoftLimitMRUCache(count); + for (int i = 0; i < count+10; i++) + { + s.Put(new object(), new object()); + } + Assert.That(s.Count, Is.EqualTo(count)); + + GC.Collect(); + s.Put(new object(), new object()); + + Assert.That(s.SoftCount, Is.EqualTo(count + 1)); + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-18 13:41:57
|
Revision: 4145 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4145&view=rev Author: fabiomaulo Date: 2009-03-18 13:41:14 +0000 (Wed, 18 Mar 2009) Log Message: ----------- Fix NH-1708 (Schema metadata for MsSQL ce) by Sushant Khurana Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSqlCeDialect.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Dialect/Schema/MsSqlCeMetaData.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSqlCeDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSqlCeDialect.cs 2009-03-18 13:30:33 UTC (rev 4144) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSqlCeDialect.cs 2009-03-18 13:41:14 UTC (rev 4145) @@ -1,6 +1,6 @@ -using System; using System.Data; -using NHibernate.SqlCommand; +using System.Data.Common; +using NHibernate.Dialect.Schema; using Environment=NHibernate.Cfg.Environment; namespace NHibernate.Dialect @@ -92,5 +92,10 @@ { get { return false; } } + + public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) + { + return new MsSqlCeDataBaseSchema(connection); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Dialect/Schema/MsSqlCeMetaData.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/MsSqlCeMetaData.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/MsSqlCeMetaData.cs 2009-03-18 13:41:14 UTC (rev 4145) @@ -0,0 +1,96 @@ +using System; +using System.Data; +using System.Data.Common; + +namespace NHibernate.Dialect.Schema +{ + public class MsSqlCeDataBaseSchema: AbstractDataBaseSchema + { + public MsSqlCeDataBaseSchema(DbConnection connection) : base(connection) {} + + public override ITableMetadata GetTableMetadata(DataRow rs, bool extras) + { + return new MsSqlCeTableMetadata(rs, this, extras); + } + } + + public class MsSqlCeTableMetadata: AbstractTableMetadata + { + public MsSqlCeTableMetadata(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) { } + + protected override void ParseTableInfo(DataRow rs) + { + Catalog = Convert.ToString(rs["TABLE_CATALOG"]); + Schema = Convert.ToString(rs["TABLE_SCHEMA"]); + if (string.IsNullOrEmpty(Catalog)) Catalog = null; + if (string.IsNullOrEmpty(Schema)) Schema = null; + Name = Convert.ToString(rs["TABLE_NAME"]); + } + + protected override string GetConstraintName(DataRow rs) + { + return Convert.ToString(rs["CONSTRAINT_NAME"]); + } + + protected override string GetColumnName(DataRow rs) + { + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override string GetIndexName(DataRow rs) + { + return Convert.ToString(rs["INDEX_NAME"]); + } + + protected override IColumnMetadata GetColumnMetadata(DataRow rs) + { + return new MsSqlCeColumnMetadata(rs); + } + + protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs) + { + return new MsSqlCeForeignKeyMetadata(rs); + } + + protected override IIndexMetadata GetIndexMetadata(DataRow rs) + { + return new MsSqlCeIndexMetadata(rs); + } + } + + public class MsSqlCeColumnMetadata : AbstractColumnMetaData + { + public MsSqlCeColumnMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["COLUMN_NAME"]); + + object aValue = rs["CHARACTER_MAXIMUM_LENGTH"]; + if (aValue != DBNull.Value) + ColumnSize = Convert.ToInt32(aValue); + + aValue = rs["NUMERIC_PRECISION"]; + if (aValue != DBNull.Value) + NumericalPrecision = Convert.ToInt32(aValue); + + Nullable = Convert.ToString(rs["IS_NULLABLE"]); + TypeName = Convert.ToString(rs["DATA_TYPE"]); + } + } + + public class MsSqlCeIndexMetadata: AbstractIndexMetadata + { + public MsSqlCeIndexMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["INDEX_NAME"]); + } + } + + public class MsSqlCeForeignKeyMetadata : AbstractForeignKeyMetadata + { + public MsSqlCeForeignKeyMetadata(DataRow rs) + : base(rs) + { + Name = Convert.ToString(rs["CONSTRAINT_NAME"]); + } + } +} Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-18 13:30:33 UTC (rev 4144) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-18 13:41:14 UTC (rev 4145) @@ -454,6 +454,7 @@ <Compile Include="Dialect\Oracle8iDialect.cs" /> <Compile Include="Dialect\Oracle9iDialect.cs" /> <Compile Include="Dialect\OracleLiteDialect.cs" /> + <Compile Include="Dialect\Schema\MsSqlCeMetaData.cs" /> <Compile Include="Dialect\Schema\MySQLMetaData.cs" /> <Compile Include="Dialect\Schema\SQLiteMetaData.cs" /> <Compile Include="Dialect\Schema\SybaseAnywhereMetaData.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-18 15:54:49
|
Revision: 4146 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4146&view=rev Author: fabiomaulo Date: 2009-03-18 15:54:41 +0000 (Wed, 18 Mar 2009) Log Message: ----------- Fix NH-1706 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/EntityKey.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/KeyPropertyRefFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Mappings.hbm.xml Removed Paths: ------------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityKeyFixture.cs Modified: trunk/nhibernate/src/NHibernate/Engine/EntityKey.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/EntityKey.cs 2009-03-18 13:41:14 UTC (rev 4145) +++ trunk/nhibernate/src/NHibernate/Engine/EntityKey.cs 2009-03-18 15:54:41 UTC (rev 4146) @@ -41,14 +41,6 @@ if (identifier == null) throw new AssertionFailure("null identifier"); - System.Type expected = identifier.GetType(); - System.Type found = identifierType.ReturnedClass; - if (!found.IsAssignableFrom(expected)) - { - throw new ArgumentException(string.Format("Identifier type mismatch; Found:<{0}> Expected:<{1}>", found, expected), - "identifier"); - } - this.identifier = identifier; this.rootEntityName = rootEntityName; this.entityName = entityName; @@ -76,7 +68,7 @@ public override bool Equals(object other) { - EntityKey otherKey = other as EntityKey; + var otherKey = other as EntityKey; if(otherKey==null) return false; return @@ -108,10 +100,10 @@ /// <summary> /// To use in deserialization callback /// </summary> - /// <param name="factory"></param> - internal void SetSessionFactory(ISessionFactoryImplementor factory) + /// <param name="sessionFactory"></param> + internal void SetSessionFactory(ISessionFactoryImplementor sessionFactory) { - this.factory = factory; + factory = sessionFactory; hashCode = GetHashCode(); } } Deleted: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityKeyFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityKeyFixture.cs 2009-03-18 13:41:14 UTC (rev 4145) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityKeyFixture.cs 2009-03-18 15:54:41 UTC (rev 4146) @@ -1,499 +0,0 @@ -using System; -using System.Collections; -using NHibernate.Cache; -using NHibernate.Cache.Entry; -using NHibernate.Engine; -using NHibernate.Id; -using NHibernate.Metadata; -using NHibernate.Persister.Entity; -using NHibernate.Tuple.Entity; -using NHibernate.Type; -using NUnit.Framework; - -namespace NHibernate.Test.NHSpecificTest -{ - - public class TestingClassPersister : IEntityPersister - { - public IType IdentifierType - { - get { return NHibernateUtil.Int32; } - } - - // NOTE: - // IdentifierType is what we need for this test. - // other properties with a sort of implementation are : - // RootEntityName, EntityName, IsBatchLoadable, Factory - - #region IEntityPersister Members - - public ISessionFactoryImplementor Factory - { - get { return null; } - } - - public string RootEntityName - { - get { return null; } - } - - public string EntityName - { - get { return null; } - } - - public EntityMetamodel EntityMetamodel - { - get { throw new NotImplementedException(); } - } - - public string[] PropertySpaces - { - get { throw new NotImplementedException(); } - } - - public string[] QuerySpaces - { - get { throw new NotImplementedException(); } - } - - public bool IsMutable - { - get { throw new NotImplementedException(); } - } - - public bool IsInherited - { - get { throw new NotImplementedException(); } - } - - public bool IsIdentifierAssignedByInsert - { - get { throw new NotImplementedException(); } - } - - #region IOptimisticCacheSource Members - - public bool IsVersioned - { - get { throw new NotImplementedException(); } - } - - bool IEntityPersister.IsVersioned - { - get { throw new NotImplementedException(); } - } - - public IVersionType VersionType - { - get { throw new NotImplementedException(); } - } - - public int VersionProperty - { - get { throw new NotImplementedException(); } - } - - public int[] NaturalIdentifierProperties - { - get { throw new NotImplementedException(); } - } - - public IIdentifierGenerator IdentifierGenerator - { - get { throw new NotImplementedException(); } - } - - public IType[] PropertyTypes - { - get { throw new NotImplementedException(); } - } - - public string[] PropertyNames - { - get { throw new NotImplementedException(); } - } - - public bool[] PropertyInsertability - { - get { throw new NotImplementedException(); } - } - - public ValueInclusion[] PropertyInsertGenerationInclusions - { - get { throw new NotImplementedException(); } - } - - public ValueInclusion[] PropertyUpdateGenerationInclusions - { - get { throw new NotImplementedException(); } - } - - public bool[] PropertyCheckability - { - get { throw new NotImplementedException(); } - } - - public bool[] PropertyNullability - { - get { throw new NotImplementedException(); } - } - - public bool[] PropertyVersionability - { - get { throw new NotImplementedException(); } - } - - public bool[] PropertyLaziness - { - get { throw new NotImplementedException(); } - } - - public CascadeStyle[] PropertyCascadeStyles - { - get { throw new NotImplementedException(); } - } - - public string IdentifierPropertyName - { - get { throw new NotImplementedException(); } - } - - public bool IsCacheInvalidationRequired - { - get { throw new NotImplementedException(); } - } - - public bool IsLazyPropertiesCacheable - { - get { throw new NotImplementedException(); } - } - - public ICacheConcurrencyStrategy Cache - { - get { throw new NotImplementedException(); } - } - - public ICacheEntryStructure CacheEntryStructure - { - get { throw new NotImplementedException(); } - } - - public IClassMetadata ClassMetadata - { - get { throw new NotImplementedException(); } - } - - public bool IsBatchLoadable - { - get { return false; } - } - - public bool IsSelectBeforeUpdateRequired - { - get { throw new NotImplementedException(); } - } - - public bool IsVersionPropertyGenerated - { - get { throw new NotImplementedException(); } - } - - public void PostInstantiate() - { - throw new NotImplementedException(); - } - - public bool IsSubclassEntityName(string entityName) - { - throw new NotImplementedException(); - } - - public bool HasProxy - { - get { throw new NotImplementedException(); } - } - - public bool HasCollections - { - get { throw new NotImplementedException(); } - } - - public bool HasMutableProperties - { - get { throw new NotImplementedException(); } - } - - public bool HasSubselectLoadableCollections - { - get { throw new NotImplementedException(); } - } - - public bool HasCascades - { - get { throw new NotImplementedException(); } - } - - public IType GetPropertyType(string propertyName) - { - throw new NotImplementedException(); - } - - public int[] FindDirty(object[] currentState, object[] previousState, object entity, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public int[] FindModified(object[] old, object[] current, object entity, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public bool HasIdentifierProperty - { - get { throw new NotImplementedException(); } - } - - public bool CanExtractIdOutOfEntity - { - get { throw new NotImplementedException(); } - } - - public bool HasNaturalIdentifier - { - get { throw new NotImplementedException(); } - } - - public object[] GetNaturalIdentifierSnapshot(object id, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public bool HasLazyProperties - { - get { throw new NotImplementedException(); } - } - - public object Load(object id, object optionalObject, LockMode lockMode, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public void Lock(object id, object version, object obj, LockMode lockMode, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public void Insert(object id, object[] fields, object obj, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public object Insert(object[] fields, object obj, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public void Delete(object id, object version, object obj, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public void Update(object id, object[] fields, int[] dirtyFields, bool hasDirtyCollection, object[] oldFields, - object oldVersion, object obj, object rowId, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public bool[] PropertyUpdateability - { - get { throw new NotImplementedException(); } - } - - public bool HasCache - { - get { throw new NotImplementedException(); } - } - - public object[] GetDatabaseSnapshot(object id, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public object GetCurrentVersion(object id, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public object ForceVersionIncrement(object id, object currentVersion, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public EntityMode? GuessEntityMode(object obj) - { - throw new NotImplementedException(); - } - - public bool IsInstrumented(EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public bool HasInsertGeneratedProperties - { - get { throw new NotImplementedException(); } - } - - public bool HasUpdateGeneratedProperties - { - get { throw new NotImplementedException(); } - } - - public void AfterInitialize(object entity, bool lazyPropertiesAreUnfetched, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public void AfterReassociate(object entity, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public object CreateProxy(object id, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public bool? IsTransient(object obj, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public object[] GetPropertyValuesToInsert(object obj, IDictionary mergeMap, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public void ProcessInsertGeneratedProperties(object id, object entity, object[] state, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public void ProcessUpdateGeneratedProperties(object id, object entity, object[] state, ISessionImplementor session) - { - throw new NotImplementedException(); - } - - public System.Type GetMappedClass(EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public bool ImplementsLifecycle(EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public bool ImplementsValidatable(EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public System.Type GetConcreteProxyClass(EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public void SetPropertyValues(object obj, object[] values, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public void SetPropertyValue(object obj, int i, object value, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public object[] GetPropertyValues(object obj, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public object GetPropertyValue(object obj, int i, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public object GetPropertyValue(object obj, string name, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public object GetIdentifier(object obj, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public void SetIdentifier(object obj, object id, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public object GetVersion(object obj, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public object Instantiate(object id, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public bool IsInstance(object entity, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public bool HasUninitializedLazyProperties(object obj, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public void ResetIdentifier(object entity, object currentId, object currentVersion, EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public IEntityPersister GetSubclassEntityPersister(object instance, ISessionFactoryImplementor factory, - EntityMode entityMode) - { - throw new NotImplementedException(); - } - - public bool? IsUnsavedVersion(object version) - { - throw new NotImplementedException(); - } - - #endregion - - public IComparer VersionComparator - { - get { throw new NotImplementedException(); } - } - - #endregion - } - - [TestFixture] - public class EntityKeyFixture - { - [Test, ExpectedException(typeof(ArgumentException))] - public void CreateWithWrongTypeOfId() - { - IEntityPersister persister = new TestingClassPersister(); - EntityKey key = new EntityKey(1L, persister, EntityMode.Poco); - } - } -} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Domain.cs 2009-03-18 15:54:41 UTC (rev 4146) @@ -0,0 +1,28 @@ +using Iesi.Collections; + +namespace NHibernate.Test.NHSpecificTest.NH1706 +{ + public class A + { + public A() + { + Items = new HashedSet(); + } + public int Id { get; set; } + + public string ExtraIdA { get; set; } + + public string Name { get; set; } + + public virtual ISet Items { get; set; } + } + + public class B + { + public virtual int Id { get; set; } + + public virtual string Name { get; set; } + + public virtual string ExtraIdB { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/KeyPropertyRefFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/KeyPropertyRefFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/KeyPropertyRefFixture.cs 2009-03-18 15:54:41 UTC (rev 4146) @@ -0,0 +1,42 @@ +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1706 +{ + [TestFixture] + public class KeyPropertyRefFixture : BugTestCase + { + [Test] + public void PropertyRefUsesOtherColumn() + { + const string ExtraId = "extra"; + + var a = new A { Name = "First", ExtraIdA = ExtraId }; + + var b = new B { Name = "Second", ExtraIdB = ExtraId }; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(a); + s.Save(b); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + var newA = s.Get<A>(a.Id); + + Assert.AreEqual(1, newA.Items.Count); + } + + // cleanup + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from B"); + s.Delete("from A"); + tx.Commit(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1706/Mappings.hbm.xml 2009-03-18 15:54:41 UTC (rev 4146) @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1706"> + + <class name="A" lazy="false"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="Name"/> + <property name="ExtraIdA"/> + <set name="Items" lazy="true"> + <key column="ExtraIdb" property-ref="ExtraIdA" /> + <one-to-many class="B" /> + </set> + </class> + + <class name="B"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="Name"/> + <property name="ExtraIdB"/> + </class> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-18 13:41:14 UTC (rev 4145) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-18 15:54:41 UTC (rev 4146) @@ -292,6 +292,8 @@ <Compile Include="GenericTest\SetGeneric\SetGenericFixture.cs" /> <Compile Include="HQL\Animal.cs" /> <Compile Include="HQL\BaseFunctionFixture.cs" /> + <Compile Include="NHSpecificTest\NH1706\Domain.cs" /> + <Compile Include="NHSpecificTest\NH1706\KeyPropertyRefFixture.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -668,7 +670,6 @@ <Compile Include="NHSpecificTest\Docs\ExampleParentChild\UpdateFixture.cs" /> <Compile Include="NHSpecificTest\Docs\PersistentClasses\Cat.cs" /> <Compile Include="NHSpecificTest\EmptyMappingsFixture.cs" /> - <Compile Include="NHSpecificTest\EntityKeyFixture.cs" /> <Compile Include="NHSpecificTest\GetSetHelperFixture.cs" /> <Compile Include="NHSpecificTest\GetTest.cs" /> <Compile Include="NHSpecificTest\LazyLoadBugTest.cs" /> @@ -1683,6 +1684,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1706\Mappings.hbm.xml" /> <EmbeddedResource Include="Stateless\Naturalness.hbm.xml" /> <EmbeddedResource Include="TransformTests\Simple.hbm.xml" /> <EmbeddedResource Include="VersionTest\Db\MsSQL\ComplexVersioned.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2009-03-22 14:21:08
|
Revision: 4149 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4149&view=rev Author: ayenderahien Date: 2009-03-22 14:21:03 +0000 (Sun, 22 Mar 2009) Log Message: ----------- Fixing NH-1711 - Failure of DTC transaction with multiple durable enlistment will crash the process Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/FutureCriteriaFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Person.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-03-18 16:36:27 UTC (rev 4148) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-03-22 14:21:03 UTC (rev 4149) @@ -258,14 +258,23 @@ void IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment) { - BeforeTransactionCompletion(null); - if (FlushMode != FlushMode.Never) - { - using (ConnectionManager.FlushingFromDtcTransaction) - Flush(); - } - preparingEnlistment.Prepared(); - logger.Debug("prepared for DTC transaction"); + try + { + BeforeTransactionCompletion(null); + if (FlushMode != FlushMode.Never) + { + using (ConnectionManager.FlushingFromDtcTransaction) + Flush(); + } + preparingEnlistment.Prepared(); + logger.Debug("prepared for DTC transaction"); + } + catch (Exception exception) + { + logger.Error("DTC transaction prepre phase failed", exception); + preparingEnlistment.ForceRollback(exception); + + } } void IEnlistmentNotification.Commit(Enlistment enlistment) Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/FutureCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/FutureCriteriaFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/FutureCriteriaFixture.cs 2009-03-22 14:21:03 UTC (rev 4149) @@ -0,0 +1,90 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using System.Threading; +using System.Transactions; +using NHibernate.Criterion; +using NHibernate.Dialect; +using NHibernate.Exceptions; +using NHibernate.Impl; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.DtcFailures +{ + using System.Collections; + + [TestFixture] + public class DtcFailuresFixture : TestCase + { + + protected override IList Mappings + { + get { return new string[] { "NHSpecificTest.DtcFailures.Mappings.hbm.xml" }; } + } + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + [Test] + public void WillNotCrashOnDtcPrepareFailure() + { + var tx = new TransactionScope(); + using (var s = sessions.OpenSession()) + { + s.Save(new Person + { + CreatedAt = DateTime.MinValue // will cause SQL date failure + }); + } + + new ForceEscalationToDistributedTx(); + + tx.Complete(); + try + { + tx.Dispose(); + Assert.Fail("Expected failure"); + } + catch (AssertionException) + { + throw; + } + catch (Exception) + { + } + } + + public class ForceEscalationToDistributedTx : IEnlistmentNotification + { + private readonly int thread; + public ForceEscalationToDistributedTx() + { + thread = Thread.CurrentThread.ManagedThreadId; + System.Transactions.Transaction.Current.EnlistDurable(Guid.NewGuid(), this, EnlistmentOptions.None); + } + + public void Prepare(PreparingEnlistment preparingEnlistment) + { + Assert.AreNotEqual(thread, Thread.CurrentThread.ManagedThreadId); + preparingEnlistment.Prepared(); + } + + public void Commit(Enlistment enlistment) + { + enlistment.Done(); + } + + public void Rollback(Enlistment enlistment) + { + enlistment.Done(); + } + + public void InDoubt(Enlistment enlistment) + { + enlistment.Done(); + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Mappings.hbm.xml 2009-03-22 14:21:03 UTC (rev 4149) @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.DtcFailures" + assembly="NHibernate.Test"> + + <class name="Person"> + <id name="Id"> + <generator class="hilo"/> + </id> + <property name="CreatedAt"/> + + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Person.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/DtcFailures/Person.cs 2009-03-22 14:21:03 UTC (rev 4149) @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System; + +namespace NHibernate.Test.NHSpecificTest.DtcFailures +{ + public class Person + { + private int id; + + public virtual DateTime CreatedAt { get; set; } + + public virtual int Id + { + get { return id; } + set { id = 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-03-18 16:36:27 UTC (rev 4148) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-22 14:21:03 UTC (rev 4149) @@ -292,6 +292,8 @@ <Compile Include="GenericTest\SetGeneric\SetGenericFixture.cs" /> <Compile Include="HQL\Animal.cs" /> <Compile Include="HQL\BaseFunctionFixture.cs" /> + <Compile Include="NHSpecificTest\DtcFailures\FutureCriteriaFixture.cs" /> + <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> <Compile Include="NHSpecificTest\NH1694\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1706\Domain.cs" /> <Compile Include="NHSpecificTest\NH1706\KeyPropertyRefFixture.cs" /> @@ -1685,6 +1687,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\DtcFailures\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1694\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1706\Mappings.hbm.xml" /> <EmbeddedResource Include="Stateless\Naturalness.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dar...@us...> - 2009-03-25 18:36:44
|
Revision: 4154 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4154&view=rev Author: darioquintana Date: 2009-03-25 18:35:41 +0000 (Wed, 25 Mar 2009) Log Message: ----------- NH-1715 partially applied, because the duration < 0 hours or > 24 hours shouldn't be handle with "TimeSpan" NHibernate type. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/ClassA.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-24 11:56:15 UTC (rev 4153) +++ trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-25 18:35:41 UTC (rev 4154) @@ -32,9 +32,8 @@ object value = rs[index]; if(value is TimeSpan) return (TimeSpan)value; - - DateTime time = (DateTime)rs[index]; - return new TimeSpan(Convert.ToInt64(time.Ticks)); + + return ((DateTime)value).Subtract(BaseDateValue); } catch (Exception ex) { @@ -50,8 +49,7 @@ if (value is TimeSpan) //For those dialects where DbType.Time means TimeSpan. return (TimeSpan)value; - DateTime time = (DateTime)rs[name]; - return new TimeSpan(Convert.ToInt64(time.Ticks)); + return ((DateTime)value).Subtract(BaseDateValue); } catch (Exception ex) { Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/ClassA.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/ClassA.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/ClassA.cs 2009-03-25 18:35:41 UTC (rev 4154) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH1715 +{ + public class ClassA + { + public virtual int Id { get; set; } + public virtual TimeSpan Time { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Fixture.cs 2009-03-25 18:35:41 UTC (rev 4154) @@ -0,0 +1,55 @@ +using System; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1715 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from ClassA"); + tx.Commit(); + } + } + + [Test] + public void TimeSpanLargerThan2h() + { + var time = new TimeSpan(0, 2, 1, 0); + var entity = new ClassA {Time = time}; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + Assert.AreEqual(time, s.Get<ClassA>(entity.Id).Time); + } + } + + [Test] + public void VerifyDaysShouldBeZeroInSmallTimeSpan() + { + var time = new TimeSpan(1, 0, 0); + var entity = new ClassA {Time = time}; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + Assert.AreEqual(0, s.Get<ClassA>(entity.Id).Time.Days); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml 2009-03-25 18:35:41 UTC (rev 4154) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> + +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1715" + assembly="NHibernate.Test"> + + <class name="ClassA"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Time" type="TimeSpan"/> + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-24 11:56:15 UTC (rev 4153) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-25 18:35:41 UTC (rev 4154) @@ -297,6 +297,8 @@ <Compile Include="NHSpecificTest\NH1694\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1706\Domain.cs" /> <Compile Include="NHSpecificTest\NH1706\KeyPropertyRefFixture.cs" /> + <Compile Include="NHSpecificTest\NH1715\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1715\ClassA.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -1687,6 +1689,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1715\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\DtcFailures\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1694\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1706\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-03-28 15:28:22
|
Revision: 4155 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4155&view=rev Author: fabiomaulo Date: 2009-03-28 15:28:16 +0000 (Sat, 28 Mar 2009) Log Message: ----------- Fix NH-1710 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/FirebirdDialect.cs trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs trunk/nhibernate/src/NHibernate/Mapping/Column.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Defined.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Heuristic.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/InLine.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/WithColumnNode.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Dialect/FirebirdDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/FirebirdDialect.cs 2009-03-25 18:35:41 UTC (rev 4154) +++ trunk/nhibernate/src/NHibernate/Dialect/FirebirdDialect.cs 2009-03-28 15:28:16 UTC (rev 4155) @@ -41,10 +41,11 @@ RegisterColumnType(DbType.Boolean, "SMALLINT"); RegisterColumnType(DbType.Byte, "SMALLINT"); RegisterColumnType(DbType.Currency, "DECIMAL(18,4)"); + RegisterColumnType(DbType.Currency, "DECIMAL($p,$s)"); RegisterColumnType(DbType.Date, "DATE"); RegisterColumnType(DbType.DateTime, "TIMESTAMP"); RegisterColumnType(DbType.Decimal, "DECIMAL(18,5)"); // NUMERIC(18,5) is equivalent to DECIMAL(18,5) - RegisterColumnType(DbType.Decimal, 18, "DECIMAL(18, $l)"); + RegisterColumnType(DbType.Decimal, 18, "DECIMAL($p, $s)"); RegisterColumnType(DbType.Double, "DOUBLE PRECISION"); RegisterColumnType(DbType.Guid, "CHAR(16) CHARACTER SET OCTETS"); RegisterColumnType(DbType.Int16, "SMALLINT"); Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2009-03-25 18:35:41 UTC (rev 4154) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2009-03-28 15:28:16 UTC (rev 4155) @@ -57,7 +57,6 @@ RegisterColumnType(DbType.Date, "DATETIME"); RegisterColumnType(DbType.DateTime, "DATETIME"); RegisterColumnType(DbType.Decimal, "DECIMAL(19,5)"); - RegisterColumnType(DbType.Decimal, 19, "DECIMAL(19, $l)"); RegisterColumnType(DbType.Decimal, 19, "DECIMAL($p, $s)"); RegisterColumnType(DbType.Double, "DOUBLE PRECISION"); //synonym for FLOAT(53) RegisterColumnType(DbType.Guid, "UNIQUEIDENTIFIER"); Modified: trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs 2009-03-25 18:35:41 UTC (rev 4154) +++ trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs 2009-03-28 15:28:16 UTC (rev 4155) @@ -109,9 +109,7 @@ RegisterColumnType(DbType.Single, "FLOAT(24)"); RegisterColumnType(DbType.Double, "DOUBLE PRECISION"); RegisterColumnType(DbType.Double, 19, "NUMBER($p,$s)"); - RegisterColumnType(DbType.Double, 19, "NUMBER(19, $l)"); RegisterColumnType(DbType.Decimal, "NUMBER(19,5)"); - RegisterColumnType(DbType.Decimal, 19, "NUMBER(19, $l)"); RegisterColumnType(DbType.Decimal, 19, "NUMBER($p,$s)"); } Modified: trunk/nhibernate/src/NHibernate/Mapping/Column.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/Column.cs 2009-03-25 18:35:41 UTC (rev 4154) +++ trunk/nhibernate/src/NHibernate/Mapping/Column.cs 2009-03-28 15:28:16 UTC (rev 4155) @@ -211,7 +211,10 @@ private string GetDialectTypeName(Dialect.Dialect dialect, IMapping mapping) { if (IsCaracteristicsDefined()) - return dialect.GetTypeName(GetSqlTypeCode(mapping), Length, Precision, Scale); + { + // NH-1070 (the size should be 0 if the precision is defined) + return dialect.GetTypeName(GetSqlTypeCode(mapping), (!IsPrecisionDefined()) ? Length:0, Precision, Scale); + } else return dialect.GetTypeName(GetSqlTypeCode(mapping)); } @@ -414,6 +417,11 @@ return length.HasValue || precision.HasValue || scale.HasValue; } + private bool IsPrecisionDefined() + { + return precision.HasValue || scale.HasValue; + } + #region ICloneable Members /// <summary> Shallow copy, the value is not copied</summary> public object Clone() Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-25 18:35:41 UTC (rev 4154) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-28 15:28:16 UTC (rev 4155) @@ -156,11 +156,12 @@ // be created. RegisterType(typeof(Object), NHibernateUtil.Object, "object"); - // These are in here for Hibernate mapping compatibility + // These are in here because needed to NO override default CLR types and be available in mappings typeByTypeOfName["int"] = NHibernateUtil.Int32; typeByTypeOfName["date"] = NHibernateUtil.Date; typeByTypeOfName["time"] = NHibernateUtil.Time; typeByTypeOfName["timestamp"] = NHibernateUtil.Timestamp; + typeByTypeOfName["decimal"] = NHibernateUtil.Decimal; typeByTypeOfName["serializable"] = NHibernateUtil.Serializable; typeByTypeOfName["true_false"] = NHibernateUtil.TrueFalse; Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Defined.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Defined.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Defined.hbm.xml 2009-03-28 15:28:16 UTC (rev 4155) @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1710"> + + <class name="A"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Amount" type="decimal" precision="5" scale="2"/> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Fixture.cs 2009-03-28 15:28:16 UTC (rev 4155) @@ -0,0 +1,93 @@ +using System.Text; +using NHibernate.Cfg; +using NHibernate.Engine; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.NHSpecificTest.NH1710 +{ + public class A + { + public virtual decimal? Amount { get; set; } + } + + public abstract class BaseFixture + { + protected const string TestNameSpace = "NHibernate.Test.NHSpecificTest.NH1710."; + protected Configuration cfg; + protected ISessionFactoryImplementor factory; + private string expectedExportString; + + [TestFixtureSetUp] + public void Config() + { + cfg = new Configuration(); + if (TestConfigurationHelper.hibernateConfigFile != null) + cfg.Configure(TestConfigurationHelper.hibernateConfigFile); + + cfg.AddResource(GetResourceFullName(), GetType().Assembly); + + factory = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); + + expectedExportString = GetDialect().GetTypeName(NHibernateUtil.Decimal.SqlType, 0, 5, 2); + } + + [Test] + public void NotIgnorePrecisionScaleInSchemaExport() + { + var script = new StringBuilder(); + new SchemaExport(cfg).Create(sl => script.AppendLine(sl), true); + Assert.That(script.ToString(), Text.Contains(expectedExportString)); + new SchemaExport(cfg).Drop(false, true); + } + + private Dialect.Dialect GetDialect() + { + return Dialect.Dialect.GetDialect(cfg.Properties); + } + + protected abstract string GetResourceName(); + + private string GetResourceFullName() + { + return TestNameSpace + GetResourceName(); + } + } + + [TestFixture] + public class FixtureWithExplicitDefinedType : BaseFixture + { + protected override string GetResourceName() + { + return "Heuristic.hbm.xml"; + } + } + + [TestFixture] + public class FixtureWithHeuristicDefinedType : BaseFixture + { + protected override string GetResourceName() + { + return "Defined.hbm.xml"; + } + } + + [TestFixture] + public class FixtureWithInLineDefinedType : BaseFixture + { + protected override string GetResourceName() + { + return "InLine.hbm.xml"; + } + } + + [TestFixture] + public class FixtureWithColumnNode : BaseFixture + { + protected override string GetResourceName() + { + return "WithColumnNode.hbm.xml"; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Heuristic.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Heuristic.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/Heuristic.hbm.xml 2009-03-28 15:28:16 UTC (rev 4155) @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1710"> + + <class name="A"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Amount" precision="5" scale="2"/> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/InLine.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/InLine.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/InLine.hbm.xml 2009-03-28 15:28:16 UTC (rev 4155) @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1710"> + + <class name="A"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Amount" type="Decimal(5,2)"/> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/WithColumnNode.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/WithColumnNode.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1710/WithColumnNode.hbm.xml 2009-03-28 15:28:16 UTC (rev 4155) @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1710"> + + <class name="A"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Amount"> + <column name="Amount" precision="5" scale="2"/> + </property> + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-25 18:35:41 UTC (rev 4154) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-28 15:28:16 UTC (rev 4155) @@ -297,6 +297,7 @@ <Compile Include="NHSpecificTest\NH1694\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1706\Domain.cs" /> <Compile Include="NHSpecificTest\NH1706\KeyPropertyRefFixture.cs" /> + <Compile Include="NHSpecificTest\NH1710\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1715\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1715\ClassA.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> @@ -1689,6 +1690,10 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1710\WithColumnNode.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH1710\InLine.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH1710\Heuristic.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH1710\Defined.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1715\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\DtcFailures\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1694\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-03-28 16:17:31
|
Revision: 4156 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4156&view=rev Author: fabiomaulo Date: 2009-03-28 16:17:20 +0000 (Sat, 28 Mar 2009) Log Message: ----------- - Fix NH-1713 - Removed prepare_sql from our configuration in order to use the default defined in the dialect. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs trunk/nhibernate/src/NHibernate.Test/App.config trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2009-03-28 15:28:16 UTC (rev 4155) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2009-03-28 16:17:20 UTC (rev 4156) @@ -131,7 +131,6 @@ RegisterKeyword("integer"); DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver"; - DefaultProperties[Environment.PrepareSql] = "true"; } /// <summary></summary> Modified: trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs 2009-03-28 15:28:16 UTC (rev 4155) +++ trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs 2009-03-28 16:17:20 UTC (rev 4156) @@ -218,7 +218,6 @@ protected internal virtual void RegisterDefaultProperties() { - DefaultProperties[Environment.PrepareSql] = "false"; //DefaultProperties[Environment.DefaultBatchFetchSize] = DefaultBatchSize; It can break some test and it is a user matter // Oracle driver reports to support GetGeneratedKeys(), but they only Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2009-03-28 15:28:16 UTC (rev 4155) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2009-03-28 16:17:20 UTC (rev 4156) @@ -46,7 +46,6 @@ <property name="connection.provider">NHibernate.Test.DebugConnectionProvider, NHibernate.Test</property> <property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider, NHibernate</property> <property name="cache.use_query_cache">true</property> - <property name="prepare_sql">false</property> <property name="query.startup_check">false</property> <!-- The valid strings for Isolation can be found in the documentation for the System.Data.IsolationLevel Modified: trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs 2009-03-28 15:28:16 UTC (rev 4155) +++ trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs 2009-03-28 16:17:20 UTC (rev 4156) @@ -29,7 +29,8 @@ Assert.IsTrue(cfg.Properties.ContainsKey(Environment.ShowSql)); Assert.IsTrue(cfg.Properties.ContainsKey(Environment.UseQueryCache)); - Assert.IsTrue(cfg.Properties.ContainsKey(Environment.PrepareSql)); + Assert.IsFalse(cfg.Properties.ContainsKey(Environment.PrepareSql), + "Our default conf should not include override the possible Dialect default configuration."); Assert.IsTrue(cfg.Properties.ContainsKey(Environment.Isolation)); Assert.AreEqual("true 1, false 0, yes 1, no 0", cfg.Properties[Environment.QuerySubstitutions]); Assert.AreEqual("Server=localhost;initial catalog=nhibernate;User Id=;Password=", Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Domain.cs 2009-03-28 16:17:20 UTC (rev 4156) @@ -0,0 +1,8 @@ +namespace NHibernate.Test.NHSpecificTest.NH1713 +{ + public class A + { + public virtual int Id { get; set; } + public virtual decimal? Amount { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Fixture.cs 2009-03-28 16:17:20 UTC (rev 4156) @@ -0,0 +1,96 @@ +using NHibernate.Cfg; +using NHibernate.Dialect; +using NHibernate.Util; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.NHSpecificTest.NH1713 +{ + [TestFixture, Ignore("Should be fixed in some way.")] + public class Fixture : BugTestCase + { + /* NOTE + * This test should be fixed in some way at least to support Money. + * So far it is only a demostration that using + * <property name="prepare_sql">false</property> + * we should do some additional work for INSERT+UPDATE + */ + protected override void Configure(Configuration configuration) + { + configuration.SetProperty(Environment.PrepareSql, "true"); + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + [Test] + public void Can_Save_Money_Column() + { + Assert.That(PropertiesHelper.GetBoolean(Environment.PrepareSql, cfg.Properties, false)); + var item = new A {Amount = 2600}; + + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(item); + tx.Commit(); + } + } + + Assert.IsTrue(item.Id > 0); + + // cleanup + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from A"); + tx.Commit(); + } + } + } + + [Test] + public void Can_Update_Money_Column() + { + Assert.That(PropertiesHelper.GetBoolean(Environment.PrepareSql, cfg.Properties, false)); + object savedId; + var item = new A {Amount = (decimal?) 2600.55}; + + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + savedId= s.Save(item); + tx.Commit(); + } + } + + Assert.That(item.Id, Is.GreaterThan(0)); + + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + var item2 = s.Load<A>(savedId); + item2.Amount = item2.Amount - 1.5m; + s.SaveOrUpdate(item2); + tx.Commit(); + } + } + + // cleanup + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from A"); + tx.Commit(); + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1713/Mappings.hbm.xml 2009-03-28 16:17:20 UTC (rev 4156) @@ -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.NH1713"> + + <class name="A"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="Amount"> + <column name="Amount" sql-type="money"/> + </property> + </class> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-28 15:28:16 UTC (rev 4155) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-28 16:17:20 UTC (rev 4156) @@ -298,6 +298,12 @@ <Compile Include="NHSpecificTest\NH1706\Domain.cs" /> <Compile Include="NHSpecificTest\NH1706\KeyPropertyRefFixture.cs" /> <Compile Include="NHSpecificTest\NH1710\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1713\Domain.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="NHSpecificTest\NH1713\Fixture.cs"> + <SubType>Code</SubType> + </Compile> <Compile Include="NHSpecificTest\NH1715\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1715\ClassA.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> @@ -1694,6 +1700,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1710\InLine.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1710\Heuristic.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1710\Defined.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH1713\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1715\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\DtcFailures\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1694\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-03-28 19:07:13
|
Revision: 4158 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4158&view=rev Author: fabiomaulo Date: 2009-03-28 19:07:03 +0000 (Sat, 28 Mar 2009) Log Message: ----------- Fix NH-1693 and one more step to fix NH-1098 Thanks to Richard Brown Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectCollectionLoader.cs trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectOneToManyLoader.cs trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1098/FilterParameterOrderFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Model.cs Modified: trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -57,58 +57,6 @@ } } - /// <summary> - /// Bind positional parameter values to the <tt>PreparedStatement</tt> - /// (these are parameters specified by a JDBC-style ?). - /// </summary> - private static int BindPositionalParameters(IDbCommand st, QueryParameters queryParameters, int start, ISessionImplementor session) - { - object[] values = queryParameters.FilteredPositionalParameterValues; - IType[] types = queryParameters.FilteredPositionalParameterTypes; - int span = 0; - for (int i = 0; i < values.Length; i++) - { - types[i].NullSafeSet(st, values[i], start + span, session); - span += types[i].GetColumnSpan(session.Factory); - } - return span; - } - - /// <summary> - /// Bind named parameters to the <tt>PreparedStatement</tt>. This has an - /// empty implementation on this superclass and should be implemented by - /// subclasses (queries) which allow named parameters. - /// </summary> - private void BindNamedParameters(IDbCommand ps, IEnumerable<KeyValuePair<string, TypedValue>> namedParams, int start, ISessionImplementor session) - { - if (namedParams != null) - { - // assumes that types are all of span 1 - int result = 0; - foreach (KeyValuePair<string, TypedValue> param in namedParams) - { - string name = param.Key; - TypedValue typedval = param.Value; - - int[] locs = GetNamedParameterLocs(name); - for (int i = 0; i < locs.Length; i++) - { - if (log.IsDebugEnabled) - { - log.Debug(string.Format("BindNamedParameters() {0} -> {1} [{2}]", typedval.Value, name, (locs[i] + start))); - } - typedval.Type.NullSafeSet(ps, typedval.Value, locs[i] + start, session); - } - result += locs.Length; - } - return; - } - else - { - return; - } - } - private void CoordinateSharedCacheCleanup(ISessionImplementor session) { BulkOperationCleanupAction action = new BulkOperationCleanupAction(session, CustomQuery.QuerySpaces); @@ -149,9 +97,12 @@ // NH Difference : set Timeout for native query ps.CommandTimeout = selection.Timeout; } - int col = 0; // NH Different (initialized to 1 in JAVA) - col += BindPositionalParameters(ps, queryParameters, col, session); - BindNamedParameters(ps, queryParameters.NamedParameters, col, session); + // NH Different behavior: + // The inital value is 0 (initialized to 1 in JAVA) + // The responsibility of parameter binding was entirely moved to QueryParameters + // to deal with positionslParameter+NamedParameter+ParameterOfFilters + + queryParameters.BindParameters(ps, GetNamedParameterLocs, 0, session); result = session.Batcher.ExecuteNonQuery(ps); } finally @@ -180,7 +131,7 @@ List<IType> paramTypeList = new List<IType>(); int span = 0; - foreach (IType type in parameters.FilteredPositionalParameterTypes) + foreach (IType type in parameters.PositionalParameterTypes) { paramTypeList.Add(type); span += type.GetColumnSpan(session.Factory); Modified: trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -1,5 +1,7 @@ using System; using System.Collections; +using System.Collections.Generic; +using System.Data; using log4net; using NHibernate.Hql.Classic; using NHibernate.Impl; @@ -7,7 +9,6 @@ using NHibernate.Transform; using NHibernate.Type; using NHibernate.Util; -using System.Collections.Generic; namespace NHibernate.Engine { @@ -17,45 +18,39 @@ [Serializable] public sealed class QueryParameters { - private static readonly ILog log = LogManager.GetLogger(typeof(QueryParameters)); + public delegate int[] GetNamedParameterLocations(string parameterName); + private static readonly ILog log = LogManager.GetLogger(typeof (QueryParameters)); + private IType[] _positionalParameterTypes; private object[] _positionalParameterValues; + private int[] _positionalParameterLocations; private IDictionary<string, TypedValue> _namedParameters; private IDictionary<string, LockMode> _lockModes; + private IList<IType> filteredParameterTypes; + private IList<object> filteredParameterValues; + private IList<int> filteredParameterLocations; private RowSelection _rowSelection; private bool _cacheable; private string _cacheRegion; - private bool _forceCacheRefresh; private object[] _collectionKeys; private object _optionalObject; private string _optionalEntityName; private object _optionalId; private string _comment; - private bool _naturalKeyLookup; private bool _readOnly; - private bool _callable; - private bool autoDiscoverTypes; private SqlString processedSQL; - private IType[] processedPositionalParameterTypes; - private object[] processedPositionalParameterValues; private readonly IResultTransformer _resultTransformer; // not implemented: private ScrollMode _scrollMode; - public QueryParameters() - : this(ArrayHelper.EmptyTypeArray, ArrayHelper.EmptyObjectArray) - { - } + public QueryParameters() : this(ArrayHelper.EmptyTypeArray, ArrayHelper.EmptyObjectArray) {} - public QueryParameters(IType type, object value) - : this(new IType[] { type }, new object[] { value }) - { - } + public QueryParameters(IType type, object value) : this(new[] {type}, new[] {value}) {} - public QueryParameters(IType[] positionalParameterTypes, object[] postionalParameterValues, - object optionalObject, string optionalEntityName, object optionalObjectId) + public QueryParameters(IType[] positionalParameterTypes, object[] postionalParameterValues, object optionalObject, + string optionalEntityName, object optionalObjectId) : this(positionalParameterTypes, postionalParameterValues) { _optionalObject = optionalObject; @@ -64,33 +59,31 @@ } public QueryParameters(IType[] positionalParameterTypes, object[] postionalParameterValues) - : this(positionalParameterTypes, postionalParameterValues, null, null, false, null, null, false, null) - { - } + : this(positionalParameterTypes, postionalParameterValues, null, null, false, null, null, false, null) {} - public QueryParameters(IType[] positionalParameterTypes, object[] postionalParameterValues, - object[] collectionKeys) - : this(positionalParameterTypes, postionalParameterValues, null, collectionKeys) - { - } + public QueryParameters(IType[] positionalParameterTypes, object[] postionalParameterValues, object[] collectionKeys) + : this(positionalParameterTypes, postionalParameterValues, null, collectionKeys) {} public QueryParameters(IType[] positionalParameterTypes, object[] postionalParameterValues, - IDictionary<string, TypedValue> namedParameters, object[] collectionKeys) - : this(positionalParameterTypes, postionalParameterValues, namedParameters, null, null, false, false, null, null, collectionKeys, null) - { - } + IDictionary<string, TypedValue> namedParameters, object[] collectionKeys) + : this( + positionalParameterTypes, postionalParameterValues, namedParameters, null, null, false, false, null, null, + collectionKeys, null) {} public QueryParameters(IType[] positionalParameterTypes, object[] positionalParameterValues, - IDictionary<string, LockMode> lockModes, RowSelection rowSelection, bool cacheable, string cacheRegion, string comment, bool isLookupByNaturalKey, IResultTransformer transformer) - : this(positionalParameterTypes, positionalParameterValues, null, lockModes, rowSelection, false, cacheable, cacheRegion, comment, null, transformer) + IDictionary<string, LockMode> lockModes, RowSelection rowSelection, bool cacheable, + string cacheRegion, string comment, bool isLookupByNaturalKey, IResultTransformer transformer) + : this( + positionalParameterTypes, positionalParameterValues, null, lockModes, rowSelection, false, cacheable, cacheRegion, + comment, null, transformer) { - _naturalKeyLookup = isLookupByNaturalKey; + NaturalKeyLookup = isLookupByNaturalKey; } public QueryParameters(IType[] positionalParameterTypes, object[] positionalParameterValues, - IDictionary<string, TypedValue> namedParameters, IDictionary<string, LockMode> lockModes, RowSelection rowSelection, - bool readOnly, bool cacheable, string cacheRegion, string comment, - object[] collectionKeys, IResultTransformer transformer) + IDictionary<string, TypedValue> namedParameters, IDictionary<string, LockMode> lockModes, + RowSelection rowSelection, bool readOnly, bool cacheable, string cacheRegion, string comment, + object[] collectionKeys, IResultTransformer transformer) { _positionalParameterTypes = positionalParameterTypes; _positionalParameterValues = positionalParameterValues; @@ -103,13 +96,21 @@ _collectionKeys = collectionKeys; _readOnly = readOnly; _resultTransformer = transformer; + + if (_positionalParameterLocations == null) + { + CreatePositionalParameterLocations(); + } } public QueryParameters(IType[] positionalParameterTypes, object[] positionalParameterValues, - IDictionary<string, TypedValue> namedParameters, IDictionary<string, LockMode> lockModes, RowSelection rowSelection, - bool readOnly, bool cacheable, string cacheRegion, string comment, object[] collectionKeys, - object optionalObject, string optionalEntityName, object optionalId, IResultTransformer transformer) - : this(positionalParameterTypes, positionalParameterValues, namedParameters, lockModes, rowSelection, readOnly, cacheable, cacheRegion, comment, collectionKeys, transformer) + IDictionary<string, TypedValue> namedParameters, IDictionary<string, LockMode> lockModes, + RowSelection rowSelection, bool readOnly, bool cacheable, string cacheRegion, string comment, + object[] collectionKeys, object optionalObject, string optionalEntityName, object optionalId, + IResultTransformer transformer) + : this( + positionalParameterTypes, positionalParameterValues, namedParameters, lockModes, rowSelection, readOnly, cacheable, + cacheRegion, comment, collectionKeys, transformer) { _optionalEntityName = optionalEntityName; _optionalId = optionalId; @@ -141,6 +142,11 @@ set { _positionalParameterTypes = value; } } + public int[] PositionalParameterLocations + { + get { return _positionalParameterLocations; } + } + /// <summary> /// Gets or sets an array of <see cref="object"/> objects that is stored at the index /// of the Parameter. @@ -171,6 +177,18 @@ set { _lockModes = value; } } + private void CreatePositionalParameterLocations() + { + if (_positionalParameterTypes != null) + { + _positionalParameterLocations = new int[_positionalParameterTypes.Length]; + for (int i = 0; i < _positionalParameterLocations.Length; i++) + { + _positionalParameterLocations[i] = i; + } + } + } + private int SafeLength(Array array) { if (array == null) @@ -183,11 +201,10 @@ /// <summary></summary> public void LogParameters(ISessionFactoryImplementor factory) { - Printer print = new Printer(factory); + var print = new Printer(factory); if (_positionalParameterValues.Length != 0) { - log.Debug("parameters: " - + print.ToString(_positionalParameterTypes, _positionalParameterValues)); + log.Debug("parameters: " + print.ToString(_positionalParameterTypes, _positionalParameterValues)); } if (_namedParameters != null) @@ -228,16 +245,12 @@ if (typesLength != valuesLength) { - throw new QueryException("Number of positional parameter types (" + typesLength + - ") does not match number of positional parameter values (" + valuesLength + ")"); + throw new QueryException("Number of positional parameter types (" + typesLength + + ") does not match number of positional parameter values (" + valuesLength + ")"); } } - public bool ForceCacheRefresh - { - get { return _forceCacheRefresh; } - set { _forceCacheRefresh = value; } - } + public bool ForceCacheRefresh { get; set; } public string OptionalEntityName { @@ -263,11 +276,7 @@ set { _collectionKeys = value; } } - public bool Callable - { - get { return _callable; } - set { _callable = value; } - } + public bool Callable { get; set; } public bool ReadOnly { @@ -277,100 +286,178 @@ /************** Filters ********************************/ + private void AdjustPostionalParameterLocations(int parameterIndex) + { + for (int i = 0; i < _positionalParameterLocations.Length; i++) + { + if (_positionalParameterLocations[i] >= parameterIndex) + { + _positionalParameterLocations[i]++; + } + } + } + public void ProcessFilters(SqlString sql, ISessionImplementor session) { + filteredParameterValues = new List<object>(); + filteredParameterTypes = new List<IType>(); + filteredParameterLocations = new List<int>(); + if (session.EnabledFilters.Count == 0 || sql.ToString().IndexOf(ParserHelper.HqlVariablePrefix) < 0) { - processedPositionalParameterValues = PositionalParameterValues; - processedPositionalParameterTypes = PositionalParameterTypes; processedSQL = sql; + return; } - else - { - Dialect.Dialect dialect = session.Factory.Dialect; - string symbols = ParserHelper.HqlSeparators + dialect.OpenQuote + dialect.CloseQuote; - SqlStringBuilder result = new SqlStringBuilder(); + Dialect.Dialect dialect = session.Factory.Dialect; + string symbols = ParserHelper.HqlSeparators + dialect.OpenQuote + dialect.CloseQuote; - List<object> parameters = new List<object>(); - List<IType> parameterTypes = new List<IType>(); - int parameterCount = 0; // keep track of the positional parameter + var result = new SqlStringBuilder(); - foreach (object part in sql.Parts) + int parameterIndex = 0; // keep track of the positional parameter + + foreach (var part in sql.Parts) + { + if (part is Parameter) { - if (part is Parameter) - { - result.AddParameter(); + result.AddParameter(); - // (?) can be a position parameter or a named parameter (already substituted by (?), - // but only the positional parameters are available at this point. Adding them in the - // order of appearance is best that can be done at this point of time, but if they - // are mixed with named parameters, the order is still wrong, because values and - // types for the named parameters are added later to the end of the list. - // see test fixture NH-1098 - if (parameterCount < PositionalParameterValues.Length) - { - parameters.Add(PositionalParameterValues[parameterCount]); - parameterTypes.Add(PositionalParameterTypes[parameterCount]); - parameterCount++; - } + // (?) can be a position parameter or a named parameter (already substituted by (?), + // but only the positional parameters are available at this point. Adding them in the + // order of appearance is best that can be done at this point of time, but if they + // are mixed with named parameters, the order is still wrong, because values and + // types for the named parameters are added later to the end of the list. + // see test fixture NH-1098 - continue; - } + parameterIndex++; + continue; + } - StringTokenizer tokenizer = new StringTokenizer((string)part, symbols, true); + var tokenizer = new StringTokenizer((string) part, symbols, true); - foreach (string token in tokenizer) + foreach (var token in tokenizer) + { + if (token.StartsWith(ParserHelper.HqlVariablePrefix)) { - if (token.StartsWith(ParserHelper.HqlVariablePrefix)) + string filterParameterName = token.Substring(1); + object value = session.GetFilterParameterValue(filterParameterName); + IType type = session.GetFilterParameterType(filterParameterName); + + // If the value is not a value of the type but a collection of values... + if (value != null && !type.ReturnedClass.IsAssignableFrom(value.GetType()) && // Added to fix NH-882 + typeof (ICollection).IsAssignableFrom(value.GetType())) { - string filterParameterName = token.Substring(1); - object value = session.GetFilterParameterValue(filterParameterName); - IType type = session.GetFilterParameterType(filterParameterName); - - // If the value is not a value of the type but a collection of values... - if (value != null && - !type.ReturnedClass.IsAssignableFrom(value.GetType()) && // Added to fix NH-882 - typeof(ICollection).IsAssignableFrom(value.GetType())) + var coll = (ICollection) value; + int i = 0; + foreach (var elementValue in coll) { - ICollection coll = (ICollection)value; - int i = 0; - foreach (object elementValue in coll) - { - i++; - int span = type.GetColumnSpan(session.Factory); - if (span > 0) - { - result.AddParameter(); - parameters.Add(elementValue); - parameterTypes.Add(type); - if (i < coll.Count) - result.Add(", "); - } - } - } - else - { + i++; int span = type.GetColumnSpan(session.Factory); if (span > 0) { result.AddParameter(); - parameters.Add(value); - parameterTypes.Add(type); + filteredParameterTypes.Add(type); + filteredParameterValues.Add(elementValue); + filteredParameterLocations.Add(parameterIndex); + AdjustPostionalParameterLocations(parameterIndex); + parameterIndex++; + if (i < coll.Count) + { + result.Add(", "); + } } } } else { - result.Add(token); + int span = type.GetColumnSpan(session.Factory); + if (span > 0) + { + result.AddParameter(); + filteredParameterTypes.Add(type); + filteredParameterValues.Add(value); + filteredParameterLocations.Add(parameterIndex); + AdjustPostionalParameterLocations(parameterIndex); + parameterIndex++; + } } } + else + { + result.Add(token); + } } + } - processedPositionalParameterValues = parameters.ToArray(); - processedPositionalParameterTypes = parameterTypes.ToArray(); - processedSQL = result.ToSqlString(); + processedSQL = result.ToSqlString(); + } + + public int BindParameters(IDbCommand command, GetNamedParameterLocations getNamedParameterLocations, int start, + ISessionImplementor session) + { + var values = new List<object>(); + var types = new List<IType>(); + var sources = new List<string>(); + + for (int i = 0; i < _positionalParameterLocations.Length; i++) + { + int location = _positionalParameterLocations[i]; + object value = _positionalParameterValues[i]; + IType type = _positionalParameterTypes[i]; + ArrayHelper.SafeSetValue(values, location, value); + ArrayHelper.SafeSetValue(types, location, type); + ArrayHelper.SafeSetValue(sources, location, "Positional" + i); } + + for (int i = 0; i < filteredParameterLocations.Count; i++) + { + int location = filteredParameterLocations[i]; + object value = filteredParameterValues[i]; + IType type = filteredParameterTypes[i]; + ArrayHelper.SafeSetValue(values, location, value); + ArrayHelper.SafeSetValue(types, location, type); + ArrayHelper.SafeSetValue(sources, location, "Filter" + i); + } + + if ((_namedParameters != null) && (_namedParameters.Count > 0)) + { + foreach (var namedParameter in _namedParameters) + { + string name = namedParameter.Key; + TypedValue typedval = namedParameter.Value; + int[] locations = getNamedParameterLocations(name); + for (int i = 0; i < locations.Length; i++) + { + int location = locations[i]; + + // can still clash with positional parameters + // could consider throwing an exception to locate problem (NH-1098) + while ((location < types.Count) && (types[location] != null)) + { + location++; + } + + ArrayHelper.SafeSetValue(values, location, typedval.Value); + ArrayHelper.SafeSetValue(types, location, typedval.Type); + ArrayHelper.SafeSetValue(sources, location, "name" + i); + } + } + } + + int span = 0; + for (int i = 0; i < values.Count; i++) + { + IType type = types[i]; + object value = values[i]; + if (log.IsDebugEnabled) + { + log.Debug(string.Format("BindParameters({0}:{1}) {2} -> [{3}]", "Named", type, value, i)); + } + type.NullSafeSet(command, value, start + span, session); + span += type.GetColumnSpan(session.Factory); + } + + return span; } public SqlString FilteredSQL @@ -378,42 +465,41 @@ get { return processedSQL; } } - public object[] FilteredPositionalParameterValues + public IList<IType> FilteredParameterTypes { - get { return processedPositionalParameterValues; } + get { return filteredParameterTypes; } } - public IType[] FilteredPositionalParameterTypes + public IList<object> FilteredParameterValues { - get { return processedPositionalParameterTypes; } + get { return filteredParameterValues; } } - public bool NaturalKeyLookup + public IList<int> FilteredParameterLocations { - get { return _naturalKeyLookup; } - set { _naturalKeyLookup = value; } + get { return filteredParameterLocations; } } + public bool NaturalKeyLookup { get; set; } + public IResultTransformer ResultTransformer { get { return _resultTransformer; } } - public bool HasAutoDiscoverScalarTypes - { - get { return autoDiscoverTypes; } - set { autoDiscoverTypes = value; } - } + public bool HasAutoDiscoverScalarTypes { get; set; } public QueryParameters CreateCopyUsing(RowSelection selection) { - QueryParameters copy = new QueryParameters(_positionalParameterTypes, _positionalParameterValues, - _namedParameters, _lockModes, selection, _readOnly, _cacheable, _cacheRegion, _comment, - _collectionKeys, _optionalObject, _optionalEntityName, _optionalId, _resultTransformer); + var copy = new QueryParameters(_positionalParameterTypes, _positionalParameterValues, _namedParameters, _lockModes, + selection, _readOnly, _cacheable, _cacheRegion, _comment, _collectionKeys, + _optionalObject, _optionalEntityName, _optionalId, _resultTransformer); + copy._positionalParameterLocations = _positionalParameterLocations; copy.processedSQL = processedSQL; - copy.processedPositionalParameterTypes = processedPositionalParameterTypes; - copy.processedPositionalParameterValues = processedPositionalParameterValues; + copy.filteredParameterTypes = filteredParameterTypes; + copy.filteredParameterValues = filteredParameterValues; + copy.filteredParameterLocations = filteredParameterLocations; return copy; } } -} +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -701,6 +701,21 @@ return o.ToArray(); } + protected override void AdjustNamedParameterLocationsForQueryParameters(QueryParameters parameters) + { + foreach (int existingParameterLocation in parameters.FilteredParameterLocations) + { + foreach (IList<int> namedParameterLocations in namedParameters.Values) + { + for (int index = 0; index < namedParameterLocations.Count; index++) + { + if (namedParameterLocations[index] == existingParameterLocation) + namedParameterLocations[index]++; + } + } + } + } + public static string ScalarName(int x, int y) { return new StringBuilder() Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -307,8 +307,7 @@ for (int i = 0; i < loaders.Count; i++) { QueryParameters parameter = parameters[i]; - colIndex += loaders[i].BindPositionalParameters(command, parameter, colIndex, session); - colIndex += loaders[i].BindNamedParameters(command, parameter.NamedParameters, colIndex, session); + colIndex += parameter.BindParameters(command, loaders[i].GetNamedParameterLocs, colIndex, session); } return colIndex; } Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -632,8 +632,7 @@ { QueryTranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; - colIndex += translator.BindPositionalParameters(command, parameter, colIndex, session); - colIndex += translator.BindNamedParameters(command, parameter.NamedParameters, colIndex, session); + colIndex += parameter.BindParameters(command, translator.GetNamedParameterLocs, colIndex, session); } return colIndex; } Modified: trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectCollectionLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectCollectionLoader.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectCollectionLoader.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -28,8 +28,9 @@ } namedParameters = queryParameters.NamedParameters; - types = queryParameters.FilteredPositionalParameterTypes; - values = queryParameters.FilteredPositionalParameterValues; + // NH Different behavior: to deal with positionslParameter+NamedParameter+ParameterOfFilters + types = queryParameters.PositionalParameterTypes; + values = queryParameters.PositionalParameterValues; this.namedParameterLocMap = namedParameterLocMap; } @@ -42,5 +43,23 @@ { return namedParameterLocMap[name]; } + + protected override void AdjustNamedParameterLocationsForQueryParameters(QueryParameters parameters) + { + if (namedParameterLocMap == null) + return; + + foreach (int existingParameterLocation in parameters.FilteredParameterLocations) + { + foreach (IList<int> namedParameterLocations in namedParameterLocMap.Values) + { + for (int index = 0; index < namedParameterLocations.Count; index++) + { + if (namedParameterLocations[index] >= existingParameterLocation) + namedParameterLocations[index]++; + } + } + } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectOneToManyLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectOneToManyLoader.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Loader/Collection/SubselectOneToManyLoader.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -30,8 +30,9 @@ } namedParameters = queryParameters.NamedParameters; - types = queryParameters.FilteredPositionalParameterTypes; - values = queryParameters.FilteredPositionalParameterValues; + // NH Different behavior: to deal with positionslParameter+NamedParameter+ParameterOfFilters + types = queryParameters.PositionalParameterTypes; + values = queryParameters.PositionalParameterValues; this.namedParameterLocMap = namedParameterLocMap; } @@ -44,5 +45,24 @@ { return namedParameterLocMap[name]; } + + protected override void AdjustNamedParameterLocationsForQueryParameters(QueryParameters parameters) + { + if (namedParameterLocMap == null) + return; + + foreach (int existingParameterLocation in parameters.FilteredParameterLocations) + { + foreach (IList<int> namedParameterLocations in namedParameterLocMap.Values) + { + for (int index = 0; index < namedParameterLocations.Count; index++) + { + if (namedParameterLocations[index] >= existingParameterLocation) + namedParameterLocations[index]++; + } + } + } + } + } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -320,6 +320,30 @@ } } + protected override void AdjustNamedParameterLocationsForQueryParameters(QueryParameters parameters) + { + var existingParameterLocations = parameters.FilteredParameterLocations.GetEnumerator(); + while (existingParameterLocations.MoveNext()) + { + foreach (string name in parameters.NamedParameters.Keys) + { + object locations = namedParameterBindPoints[name]; + if (locations is int) + { + namedParameterBindPoints[name] = ((int)locations) + 1; + } + else + { + IList locationsList = (IList)locations; + for (int i = 0; i < locationsList.Count; i++) + { + locationsList[i] = ((int)locationsList[i]) + 1; + } + } + } + } + } + protected override void AutoDiscoverTypes(IDataReader rs) { MetaData metadata = new MetaData(rs); Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -1173,6 +1173,7 @@ protected virtual SqlString ProcessFilters(QueryParameters parameters, ISessionImplementor session) { parameters.ProcessFilters(SqlString, session); + AdjustNamedParameterLocationsForQueryParameters(parameters); return parameters.FilteredSQL; } @@ -1256,79 +1257,26 @@ protected internal virtual int BindParameterValues(IDbCommand statement, QueryParameters queryParameters, int startIndex, ISessionImplementor session) { - int span = 0; - span += BindPositionalParameters(statement, queryParameters, startIndex, session); - span += BindNamedParameters(statement, queryParameters.NamedParameters, startIndex + span, session); - return span; + // NH Different behavior: + // The responsibility of parameter binding was entirely moved to QueryParameters + // to deal with positionslParameter+NamedParameter+ParameterOfFilters + return queryParameters.BindParameters(statement, GetNamedParameterLocs, 0, session); } - /// <summary> - /// Bind positional parameter values to the <c>IDbCommand</c> - /// (these are parameters specified by ?). - /// </summary> - /// <param name="st">The ADO prepared statement </param> - /// <param name="queryParameters">The encapsulation of the parameter values to be bound. </param> - /// <param name="start">The position from which to start binding parameter values. </param> - /// <param name="session">The originating session. </param> - /// <returns> The number of ADO bind positions actually bound during this method execution. </returns> - protected internal virtual int BindPositionalParameters(IDbCommand st, QueryParameters queryParameters, int start, - ISessionImplementor session) + public virtual int[] GetNamedParameterLocs(string name) { - object[] values = queryParameters.FilteredPositionalParameterValues; - IType[] types = queryParameters.FilteredPositionalParameterTypes; - - int span = 0; - for (int i = 0; i < values.Length; i++) - { - types[i].NullSafeSet(st, values[i], start + span, session); - span += types[i].GetColumnSpan(session.Factory); - } - - return span; + throw new AssertionFailure("no named parameters"); } - /// <summary> - /// Bind named parameters to the <c>IDbCommand</c> - /// </summary> - /// <param name="st">The <see cref="IDbCommand"/> that contains the parameters.</param> - /// <param name="namedParams">The named parameters (key) and the values to set.</param> - /// <param name="session">The <see cref="ISession"/> this Loader is using.</param> - /// <param name="start"></param> - protected internal virtual int BindNamedParameters(IDbCommand st, IDictionary<string, TypedValue> namedParams, - int start, ISessionImplementor session) + protected virtual void AdjustNamedParameterLocationsForQueryParameters(QueryParameters parameters) { - if (namedParams != null) - { - // assumes that types are all of span 1 - int result = 0; - foreach (KeyValuePair<string, TypedValue> namedParam in namedParams) - { - string name = namedParam.Key; - TypedValue typedval = namedParam.Value; - int[] locs = GetNamedParameterLocs(name); - for (int i = 0; i < locs.Length; i++) - { - if (log.IsDebugEnabled) - { - log.Debug("BindNamedParameters() " + typedval.Value + " -> " + name + " [" + (locs[i] + start) + "]"); - } - typedval.Type.NullSafeSet(st, typedval.Value, locs[i] + start, session); - } - result += locs.Length; - } - return result; - } - else - { - return 0; - } + // if you support named parameter locations (by overriding GetNamedParameterLocs), then you might need to + // allow for the locations to be adjusted by introduced filtered parameters by overriding + // this method too. + if ((parameters.NamedParameters != null) && (parameters.NamedParameters.Keys.Count > 0)) + throw new AssertionFailure(GetType() + " must override to handle implementation of named parameter locations"); } - public virtual int[] GetNamedParameterLocs(string name) - { - throw new AssertionFailure("no named parameters"); - } - /// <summary> /// Fetch a <c>IDbCommand</c>, call <c>SetMaxRows</c> and then execute it, /// advance to the first result and return an SQL <c>IDataReader</c> @@ -1784,16 +1732,24 @@ List<IType> paramTypeList = new List<IType>(); int span = 0; - foreach (IType type in parameters.FilteredPositionalParameterTypes) + for (int index = 0; index < parameters.PositionalParameterTypes.Length; index++) { - paramTypeList.Add(type); + int location = parameters.PositionalParameterLocations[index]; + IType type = parameters.PositionalParameterTypes[index]; + ArrayHelper.SafeSetValue(paramTypeList, location, type); span += type.GetColumnSpan(Factory); } - if (parameters.NamedParameters != null && parameters.NamedParameters.Count > 0) + for (int index = 0; index < parameters.FilteredParameterTypes.Count; index++) { - int offset = paramTypeList.Count; + int location = parameters.FilteredParameterLocations[index]; + IType type = parameters.FilteredParameterTypes[index]; + ArrayHelper.SafeSetValue(paramTypeList, location, type); + span += type.GetColumnSpan(Factory); + } + if (parameters.NamedParameters != null && parameters.NamedParameters.Count > 0) + { // convert the named parameters to an array of types foreach (KeyValuePair<string, TypedValue> namedParameter in parameters.NamedParameters) { @@ -1804,7 +1760,14 @@ for (int i = 0; i < locs.Length; i++) { - ArrayHelper.SafeSetValue(paramTypeList, locs[i] + offset, typedval.Type); + int location = locs[i]; + + // can still clash with positional parameters + // could consider throwing an exception to locate problem (NH-1098) + while ((location < paramTypeList.Count) && (paramTypeList[location] != null)) + location++; + + ArrayHelper.SafeSetValue(paramTypeList, location, typedval.Type); } } } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1098/FilterParameterOrderFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1098/FilterParameterOrderFixture.cs 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1098/FilterParameterOrderFixture.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -121,7 +121,7 @@ Assert.AreEqual( 1, result.Count ); } - [Test, Ignore( "Known issue, parameter order is wrong when named and positional parameters are mixed" )] + [Test] public void QueryWithNamedParameters() { ISession session = OpenSession(); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Fixture.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -0,0 +1,76 @@ +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.NHSpecificTest.NH1693 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + using (var session = OpenSession()) + { + session.Delete("from Invoice"); + session.Flush(); + } + } + + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + session.Save(new Invoice { Mode = "a", Num = 1, Category = 10 }); + session.Save(new Invoice { Mode = "a", Num = 2, Category = 10 }); + session.Save(new Invoice { Mode = "a", Num = 3, Category = 20 }); + session.Save(new Invoice { Mode = "a", Num = 4, Category = 10 }); + session.Save(new Invoice { Mode = "b", Num = 2, Category = 10 }); + session.Save(new Invoice { Mode = "b", Num = 3, Category = 10 }); + session.Save(new Invoice { Mode = "b", Num = 5, Category = 10 }); + + tx.Commit(); + } + } + + [Test] + public void without_filter() + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var q1 = + "from Invoice i where i.Mode='a' and i.Category=:cat and not exists (from Invoice i2 where i2.Mode='a' and i2.Category=:cat and i2.Num=i.Num+1)"; + var list = session.CreateQuery(q1) + .SetParameter("cat", 10) + .List<Invoice>(); + Assert.That(list, Has.Count(2)); + Assert.That(list[0].Num == 2 && list[0].Mode == "a"); + Assert.That(list[1].Num == 4 && list[1].Mode == "a"); + + tx.Commit(); + } + } + + [Test] + public void with_filter() + { + using (var session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + session.EnableFilter("modeFilter").SetParameter("currentMode", "a"); + + var q1 = + "from Invoice i where i.Category=:cat and not exists (from Invoice i2 where i2.Category=:cat and i2.Num=i.Num+1)"; + var list = session.CreateQuery(q1) + .SetParameter("cat", 10) + .List<Invoice>(); + Assert.That(list, Has.Count(2)); + Assert.That(list[0].Num == 2 && list[0].Mode == "a"); + Assert.That(list[1].Num == 4 && list[1].Mode == "a"); + + tx.Commit(); + } + } + + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Mappings.hbm.xml 2009-03-28 19:07:03 UTC (rev 4158) @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1693"> + + <class name="Invoice"> + <id name="ID" type="Int32"> + <generator class="hilo" /> + </id> + <property name="Mode" type="String" /> + <property name="Num" type="Int32" /> + <property name="Category" type="Int32" /> + + <filter name="modeFilter" condition="Mode=:currentMode" /> + </class> + + <filter-def name="modeFilter"> + <filter-param name="currentMode" type="String"/> + </filter-def> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1693/Model.cs 2009-03-28 19:07:03 UTC (rev 4158) @@ -0,0 +1,10 @@ +namespace NHibernate.Test.NHSpecificTest.NH1693 +{ + public class Invoice + { + public virtual int ID { get; private set; } + public virtual string Mode { get; set; } + public virtual int Category { get; set; } + public virtual int Num { get; set; } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-28 16:35:33 UTC (rev 4157) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-28 19:07:03 UTC (rev 4158) @@ -294,6 +294,8 @@ <Compile Include="HQL\BaseFunctionFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\DtcFailuresFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> + <Compile Include="NHSpecificTest\NH1693\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1693\Model.cs" /> <Compile Include="NHSpecificTest\NH1694\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1706\Domain.cs" /> <Compile Include="NHSpecificTest\NH1706\KeyPropertyRefFixture.cs" /> @@ -1696,6 +1698,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1693\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1710\WithColumnNode.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1710\InLine.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1710\Heuristic.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-28 20:15:11
|
Revision: 4159 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4159&view=rev Author: fabiomaulo Date: 2009-03-28 20:15:05 +0000 (Sat, 28 Mar 2009) Log Message: ----------- Fix NH-1700 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs 2009-03-28 19:07:03 UTC (rev 4158) +++ trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs 2009-03-28 20:15:05 UTC (rev 4159) @@ -315,17 +315,25 @@ public Table AddDenormalizedTable(string schema, string catalog, string name, bool isAbstract, string subselect, Table includedTable) { string key = subselect ?? dialect.Qualify(schema, catalog, name); - if (tables.ContainsKey(key)) + + Table table = new DenormalizedTable(includedTable) + { + IsAbstract = isAbstract, + Name = name, + Catalog = catalog, + Schema = schema, + Subselect = subselect + }; + + Table existing; + if (tables.TryGetValue(key, out existing)) { - throw new DuplicateMappingException("table", name); + if (existing.IsPhysicalTable) + { + throw new DuplicateMappingException("table", name); + } } - Table table = new DenormalizedTable(includedTable); - table.IsAbstract = isAbstract; - table.Name = name; - table.Catalog = catalog; - table.Schema = schema; - table.Subselect = subselect; tables[key] = table; return table; } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Domain.cs 2009-03-28 20:15:05 UTC (rev 4159) @@ -0,0 +1,16 @@ +namespace NHibernate.Test.NHSpecificTest.NH1700 +{ + public class PayrollSegment + { + public virtual string Id { get; set; } + } + public class ActualPayrollSegment : PayrollSegment + { + } + public class ProjectedPayrollSegment : PayrollSegment + { + } + public class ClosedPayrollSegment : PayrollSegment + { + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Fixture.cs 2009-03-28 20:15:05 UTC (rev 4159) @@ -0,0 +1,23 @@ +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1700 +{ + [TestFixture] + public class Fixture + { + [Test] + public void ShouldNotThrowDuplicateMapping() + { + var cfg = new Configuration(); + if (TestConfigurationHelper.hibernateConfigFile != null) + cfg.Configure(TestConfigurationHelper.hibernateConfigFile); + + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH1700.Mappings.hbm.xml", GetType().Assembly); + new SchemaExport(cfg).Create(false, true); + + new SchemaExport(cfg).Drop(false, true); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1700/Mappings.hbm.xml 2009-03-28 20:15:05 UTC (rev 4159) @@ -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.NHSpecificTest.NH1700"> + + <class name="PayrollSegment" abstract="true" polymorphism="explicit"> + <id name="Id" column="PayrollSegmentKey"/> + <union-subclass name="ActualPayrollSegment" table="PayrollSegment"/> + <union-subclass name="ProjectedPayrollSegment" table="ProjectedPayrollSegment"/> + <union-subclass name="ClosedPayrollSegment" table="ClosedPayrollSegment"/> + </class> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-28 19:07:03 UTC (rev 4158) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-28 20:15:05 UTC (rev 4159) @@ -297,6 +297,8 @@ <Compile Include="NHSpecificTest\NH1693\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1693\Model.cs" /> <Compile Include="NHSpecificTest\NH1694\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1700\Domain.cs" /> + <Compile Include="NHSpecificTest\NH1700\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1706\Domain.cs" /> <Compile Include="NHSpecificTest\NH1706\KeyPropertyRefFixture.cs" /> <Compile Include="NHSpecificTest\NH1710\Fixture.cs" /> @@ -1698,6 +1700,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1700\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1693\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1710\WithColumnNode.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1710\InLine.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-28 22:10:40
|
Revision: 4160 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4160&view=rev Author: fabiomaulo Date: 2009-03-28 22:10:37 +0000 (Sat, 28 Mar 2009) Log Message: ----------- Applying change needed for AST parser based on ANTLR Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs trunk/nhibernate/src/NHibernate/Hql/IQueryTranslator.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2009-03-28 20:15:05 UTC (rev 4159) +++ trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2009-03-28 22:10:37 UTC (rev 4160) @@ -356,8 +356,13 @@ get { return returnTypes; } } - internal virtual IType[] ActualReturnTypes + public Loader.Loader Loader { + get { return this; } + } + + public virtual IType[] ActualReturnTypes + { get { return actualReturnTypes; } } Modified: trunk/nhibernate/src/NHibernate/Hql/IQueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/IQueryTranslator.cs 2009-03-28 20:15:05 UTC (rev 4159) +++ trunk/nhibernate/src/NHibernate/Hql/IQueryTranslator.cs 2009-03-28 22:10:37 UTC (rev 4160) @@ -116,5 +116,9 @@ bool ContainsCollectionFetches { get; } bool IsManipulationStatement { get; } + + Loader.Loader Loader { get; } + + IType[] ActualReturnTypes { get; } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-03-28 20:15:05 UTC (rev 4159) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-03-28 22:10:37 UTC (rev 4160) @@ -23,9 +23,9 @@ private static readonly ILog log = LogManager.GetLogger(typeof(MultiQueryImpl)); private readonly List<IQuery> queries = new List<IQuery>(); - private readonly List<QueryTranslator> translators = new List<QueryTranslator>(); + private readonly List<IQueryTranslator> translators = new List<IQueryTranslator>(); private readonly List<QueryParameters> parameters = new List<QueryParameters>(); - private IList criteriaResults; + private IList queryResults; private readonly Dictionary<string, int> criteriaResultPositions = new Dictionary<string, int>(); private string cacheRegion; private int commandTimeout = RowSelection.NoValue; @@ -360,9 +360,7 @@ try { Before(); - - criteriaResults = cacheable ? ListUsingQueryCache() : ListIgnoreQueryCache(); - return criteriaResults; + return cacheable ? ListUsingQueryCache() : ListIgnoreQueryCache(); } finally { @@ -405,9 +403,7 @@ { for (int j = 0; j < subList.Count; j++) { - object[] row = subList[j] as object[]; - if (row == null) - row = new object[] { subList[j] }; + object[] row = subList[j] as object[] ?? new[] { subList[j] }; subList[j] = holderInstantiator.Instantiate(row); } @@ -458,10 +454,10 @@ log.DebugFormat("Executing {0} queries", translators.Count); for (int i = 0; i < translators.Count; i++) { - QueryTranslator translator = Translators[i]; + IQueryTranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; ArrayList tempResults = new ArrayList(); - int entitySpan = translator.EntityPersisters.Length; + int entitySpan = translator.Loader.EntityPersisters.Length; hydratedObjects[i] = entitySpan > 0 ? new ArrayList() : null; RowSelection selection = parameter.RowSelection; int maxRows = Loader.Loader.HasMaxRows(selection) ? selection.MaxRows : int.MaxValue; @@ -470,13 +466,13 @@ Loader.Loader.Advance(reader, selection); } - LockMode[] lockModeArray = translator.GetLockModes(parameter.LockModes); + LockMode[] lockModeArray = translator.Loader.GetLockModes(parameter.LockModes); EntityKey optionalObjectKey = Loader.Loader.GetOptionalObjectKey(parameter, session); - createSubselects[i] = translator.IsSubselectLoadingEnabled; + createSubselects[i] = translator.Loader.IsSubselectLoadingEnabled; subselectResultKeys[i] = createSubselects[i] ? new List<EntityKey[]>() : null; - translator.HandleEmptyCollections(parameter.CollectionKeys, reader, session); + translator.Loader.HandleEmptyCollections(parameter.CollectionKeys, reader, session); EntityKey[] keys = new EntityKey[entitySpan]; // we can reuse it each time if (log.IsDebugEnabled) @@ -493,7 +489,7 @@ } object result = - translator.GetRowFromResultSet(reader, + translator.Loader.GetRowFromResultSet(reader, session, parameter, lockModeArray, @@ -536,14 +532,14 @@ } for (int i = 0; i < translators.Count; i++) { - QueryTranslator translator = translators[i]; + IQueryTranslator translator = translators[i]; QueryParameters parameter = parameters[i]; - translator.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); + translator.Loader.InitializeEntitiesAndCollections(hydratedObjects[i], reader, session, false); if (createSubselects[i]) { - translator.CreateSubselects(subselectResultKeys[i], parameter, session); + translator.Loader.CreateSubselects(subselectResultKeys[i], parameter, session); } } return results; @@ -630,23 +626,26 @@ { for (int i = 0; i < queries.Count; i++) { - QueryTranslator translator = Translators[i]; + IQueryTranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; - colIndex += parameter.BindParameters(command, translator.GetNamedParameterLocs, colIndex, session); + colIndex += parameter.BindParameters(command, translator.Loader.GetNamedParameterLocs, colIndex, session); } return colIndex; } public object GetResult(string key) { - if (criteriaResults == null) List(); + if (queryResults == null) + { + queryResults= List(); + } if (!criteriaResultPositions.ContainsKey(key)) { throw new InvalidOperationException(String.Format("The key '{0}' is unknown", key)); } - return criteriaResults[criteriaResultPositions[key]]; + return queryResults[criteriaResultPositions[key]]; } private int BindLimitParametersFirstIfNeccesary(IDbCommand command, int colIndex) @@ -685,7 +684,7 @@ List<IType[]> resultTypesList = new List<IType[]>(Translators.Count); for (int i = 0; i < Translators.Count; i++) { - QueryTranslator queryTranslator = Translators[i]; + IQueryTranslator queryTranslator = Translators[i]; querySpaces.AddAll(queryTranslator.QuerySpaces); resultTypesList.Add(queryTranslator.ActualReturnTypes); } @@ -717,7 +716,7 @@ return GetResultList(result); } - private IList<QueryTranslator> Translators + private IList<IQueryTranslator> Translators { get { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-29 04:42:56
|
Revision: 4164 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4164&view=rev Author: fabiomaulo Date: 2009-03-29 04:42:52 +0000 (Sun, 29 Mar 2009) Log Message: ----------- Fix NH-1635 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/TestCase.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumMessage.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumThread.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-03-29 04:12:21 UTC (rev 4163) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-03-29 04:42:52 UTC (rev 4164) @@ -852,7 +852,7 @@ protected void BindManyToOne(XmlNode node, ManyToOne model, string defaultColumnName, bool isNullable) { - BindColumns(node, model, isNullable, true, defaultColumnName); + BindColumnsOrFormula(node, model, defaultColumnName, isNullable); InitOuterJoinFetchSetting(node, model); InitLaziness(node, model, true); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Fixture.cs 2009-03-29 04:42:52 UTC (rev 4164) @@ -0,0 +1,68 @@ +using System.Text; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.NHSpecificTest.NH1635 +{ + [TestFixture] + public class Fixture : BugTestCase + { + private void CreateTestContext() + { + var t1 = new ForumThread {Id = 1, Name = "Thread 1"}; + var t2 = new ForumThread {Id = 2, Name = "Thread 2"}; + var m1 = new ForumMessage {Id = 1, Name = "Thread 1: Message 1", ForumThread = t1}; + var m2 = new ForumMessage {Id = 2, Name = "Thread 1: Message 2", ForumThread = t1}; + var m3 = new ForumMessage {Id = 3, Name = "Thread 2: Message 1", ForumThread = t2}; + + t1.Messages.Add(m1); + t1.Messages.Add(m2); + t2.Messages.Add(m3); + + using (ISession session = OpenSession()) + { + using (ITransaction transaction = session.BeginTransaction()) + { + session.Save(t1); + session.Save(t2); + + transaction.Commit(); + } + } + } + + private void CleanUp() + { + using (ISession session = OpenSession()) + { + session.Delete("from ForumMessage"); + session.Delete("from ForumThread"); + session.Flush(); + } + } + + protected override void CreateSchema() + { + var script = new StringBuilder(); + new SchemaExport(cfg).Create(sl=> script.Append(sl) , true); + Assert.That(script.ToString(), Text.DoesNotContain("LatestMessage")); + } + + [Test] + public void Test() + { + CreateTestContext(); + using (ISession session = OpenSession()) + { + var thread = session.Get<ForumThread>(1); + + Assert.IsNotNull(thread.LatestMessage); + Assert.IsTrue(thread.LatestMessage.Id == 2); + + session.Flush(); + } + CleanUp(); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumMessage.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumMessage.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumMessage.cs 2009-03-29 04:42:52 UTC (rev 4164) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.NHSpecificTest.NH1635 +{ + public class ForumMessage + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual ForumThread ForumThread { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumThread.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumThread.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/ForumThread.cs 2009-03-29 04:42:52 UTC (rev 4164) @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1635 +{ + public class ForumThread + { + public ForumThread() + { + Messages = new List<ForumMessage>(); + } + + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual IList<ForumMessage> Messages { get; set; } + public virtual ForumMessage LatestMessage { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1635/Mappings.hbm.xml 2009-03-29 04:42:52 UTC (rev 4164) @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1635"> + + + <class name="ForumThread" table="ForumThread"> + + <id name="Id" column="ForumThreadId" type="Int32"> + <generator class="assigned" /> + </id> + + <property name="Name" column="Name" type="String" length="25" not-null="true" /> + + <bag name="Messages" table="ForumMessage" inverse="true" cascade="all-delete-orphan"> + <key column="ForumThreadId" /> + <one-to-many class="ForumMessage" /> + </bag> + + <many-to-one + name="LatestMessage" + class="ForumMessage" + formula="(SELECT MAX(m.ForumMessageId) FROM ForumMessage m WHERE m.ForumThreadId = ForumThreadId)" /> + + </class> + + + <class name="ForumMessage" table="ForumMessage"> + + <id name="Id" column="ForumMessageId" type="Int32"> + <generator class="assigned" /> + </id> + + <property name="Name" column="Name" type="String" length="25" not-null="true" /> + + <many-to-one name="ForumThread" column="ForumThreadId" class="ForumThread" not-null="true" /> + + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 04:12:21 UTC (rev 4163) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 04:42:52 UTC (rev 4164) @@ -294,6 +294,9 @@ <Compile Include="HQL\BaseFunctionFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\DtcFailuresFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> + <Compile Include="NHSpecificTest\NH1635\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1635\ForumMessage.cs" /> + <Compile Include="NHSpecificTest\NH1635\ForumThread.cs" /> <Compile Include="NHSpecificTest\NH1688\DomainClass.cs" /> <Compile Include="NHSpecificTest\NH1688\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1693\Fixture.cs" /> @@ -1702,6 +1705,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1635\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1688\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1700\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1693\Mappings.hbm.xml" /> Modified: trunk/nhibernate/src/NHibernate.Test/TestCase.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TestCase.cs 2009-03-29 04:12:21 UTC (rev 4163) +++ trunk/nhibernate/src/NHibernate.Test/TestCase.cs 2009-03-29 04:42:52 UTC (rev 4164) @@ -196,7 +196,7 @@ ApplyCacheSettings(cfg); } - private void CreateSchema() + protected virtual void CreateSchema() { new SchemaExport(cfg).Create(OutputDdl, true); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-29 06:27:17
|
Revision: 4165 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4165&view=rev Author: fabiomaulo Date: 2009-03-29 06:27:12 +0000 (Sun, 29 Mar 2009) Log Message: ----------- Fix NH-1718 (new feature Currency type) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/NHibernateUtil.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/CurrencyType.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-29 04:42:52 UTC (rev 4164) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-29 06:27:12 UTC (rev 4165) @@ -1091,6 +1091,7 @@ <Compile Include="Type\AnsiCharType.cs" /> <Compile Include="Type\AnyType.cs" /> <Compile Include="Type\AbstractCharType.cs" /> + <Compile Include="Type\CurrencyType.cs" /> <Compile Include="Type\TimeSpanType.cs" /> <Compile Include="Type\DateTime2Type.cs" /> <Compile Include="Type\ClassMetaType.cs" /> Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2009-03-29 04:42:52 UTC (rev 4164) +++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2009-03-29 06:27:12 UTC (rev 4165) @@ -141,6 +141,11 @@ public static readonly NullableType Double = new DoubleType(); /// <summary> + /// NHibernate Currency type (System.Decimal - DbType.Currency) + /// </summary> + public static readonly NullableType Currency = new CurrencyType(); + + /// <summary> /// NHibernate Guid type. /// </summary> public static readonly NullableType Guid = new GuidType(); Added: trunk/nhibernate/src/NHibernate/Type/CurrencyType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/CurrencyType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/CurrencyType.cs 2009-03-29 06:27:12 UTC (rev 4165) @@ -0,0 +1,17 @@ +using System; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + [Serializable] + public class CurrencyType : DecimalType + { + internal CurrencyType() : this(SqlTypeFactory.Currency) { } + internal CurrencyType(SqlType sqlType) : base(sqlType) { } + + public override string Name + { + get { return "Currency"; } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-29 04:42:52 UTC (rev 4164) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-29 06:27:12 UTC (rev 4165) @@ -95,8 +95,6 @@ //basicTypes.Add(NHibernate.Blob.Name, NHibernate.Blob); //basicTypes.Add(NHibernate.Clob.Name, NHibernate.Clob); - //basicTypes.Add(NHibernate.Currency.Name, NHibernate.Currency); - // the Timezone class .NET is not even close to the java.util.Timezone class - in // .NET all you can do is get the local Timezone - there is no "factory" method to // get a Timezone by name... @@ -145,6 +143,7 @@ typeByTypeOfName[NHibernateUtil.Ticks.Name] = NHibernateUtil.Ticks; typeByTypeOfName[NHibernateUtil.TimeSpanInt64.Name] = NHibernateUtil.TimeSpanInt64; typeByTypeOfName[NHibernateUtil.TimeSpan.Name] = NHibernateUtil.TimeSpan; + typeByTypeOfName[NHibernateUtil.Currency.Name] = NHibernateUtil.Currency; // need to do add the key "Serializable" because the hbm files will have a // type="Serializable", but the SerializableType returns the Name as @@ -162,6 +161,7 @@ typeByTypeOfName["time"] = NHibernateUtil.Time; typeByTypeOfName["timestamp"] = NHibernateUtil.Timestamp; typeByTypeOfName["decimal"] = NHibernateUtil.Decimal; + typeByTypeOfName["currency"] = NHibernateUtil.Currency; typeByTypeOfName["serializable"] = NHibernateUtil.Serializable; typeByTypeOfName["true_false"] = NHibernateUtil.TrueFalse; Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 04:42:52 UTC (rev 4164) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 06:27:12 UTC (rev 4165) @@ -1059,6 +1059,8 @@ <Compile Include="TypesTest\BooleanTypeFixture.cs" /> <Compile Include="TypesTest\ByteClass.cs" /> <Compile Include="TypesTest\ByteTypeFixture.cs" /> + <Compile Include="TypesTest\CurrencyClass.cs" /> + <Compile Include="TypesTest\CurrencyTypeFixture.cs" /> <Compile Include="TypesTest\TimeSpanClass.cs" /> <Compile Include="TypesTest\TimeSpanTypeFixture.cs" /> <Compile Include="TypesTest\TimeSpanInt64Class.cs" /> @@ -1705,6 +1707,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="TypesTest\CurrencyClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1635\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1688\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1700\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.cs 2009-03-29 06:27:12 UTC (rev 4165) @@ -0,0 +1,7 @@ +namespace NHibernate.Test.TypesTest +{ + public class CurrencyClass + { + public decimal CurrencyValue { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyClass.hbm.xml 2009-03-29 06:27:12 UTC (rev 4165) @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.TypesTest" + default-lazy="false"> + + <class name="CurrencyClass"> + <id type="int"> + <generator class="native" /> + </id> + <property name="CurrencyValue" type="currency"/> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/CurrencyTypeFixture.cs 2009-03-29 06:27:12 UTC (rev 4165) @@ -0,0 +1,72 @@ +using NHibernate.Dialect; +using NHibernate.Type; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.TypesTest +{ + [TestFixture] + public class CurrencyTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "Currency"; } + } + + [Test] + public void ShouldBeMoneyType() + { + if (!(Dialect is MsSql2000Dialect)) + { + Assert.Ignore("This test does not apply to " + Dialect); + } + var sqlType = Dialect.GetTypeName(NHibernateUtil.Currency.SqlType); + Assert.That(sqlType, Is.EqualTo("MONEY")); + } + + /// <summary> + /// Test that two decimal fields that are exactly equal are returned + /// as Equal by the DecimalType. + /// </summary> + [Test] + public void Equals() + { + const decimal lhs = 5.6435M; + const decimal rhs = 5.6435M; + + var type = (CurrencyType)NHibernateUtil.Currency; + Assert.IsTrue(type.IsEqual(lhs, rhs)); + } + + [Test] + public void ReadWrite() + { + const decimal expected = 5.6435M; + + var basic = new CurrencyClass {CurrencyValue = expected}; + ISession s = OpenSession(); + object savedId = s.Save(basic); + s.Flush(); + s.Close(); + + s = OpenSession(); + basic = s.Load<CurrencyClass>(savedId); + + Assert.AreEqual(expected, basic.CurrencyValue); + + s.Delete(basic); + s.Flush(); + s.Close(); + } + + [Test] + public void UnsavedValue() + { + var type = (CurrencyType)NHibernateUtil.Currency; + object mappedValue = type.StringToObject("0"); + Assert.AreEqual(0m, mappedValue); + Assert.IsTrue(type.IsEqual(mappedValue, 0m), "'0' in the mapping file should have been converted to a 0m"); + } + + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dar...@us...> - 2009-03-29 15:37:07
|
Revision: 4166 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4166&view=rev Author: darioquintana Date: 2009-03-29 15:36:13 +0000 (Sun, 29 Mar 2009) Log Message: ----------- - the actual TimeSpan type moved to TimeAsTimeSpan. - TimeSpanInt64 type moved back to TimeSpan (related to NH-1617) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/NHibernateUtil.cs trunk/nhibernate/src/NHibernate/Type/TimeType.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-29 15:36:13 UTC (rev 4166) @@ -395,7 +395,7 @@ <Compile Include="Type\StringClobType.cs" /> <Compile Include="Type\StringType.cs" /> <Compile Include="Type\TicksType.cs" /> - <Compile Include="Type\TimeSpanInt64Type.cs" /> + <Compile Include="Type\TimeSpanType.cs" /> <Compile Include="Type\TimestampType.cs" /> <Compile Include="Type\TimeType.cs" /> <Compile Include="Type\TrueFalseType.cs" /> @@ -1092,7 +1092,7 @@ <Compile Include="Type\AnyType.cs" /> <Compile Include="Type\AbstractCharType.cs" /> <Compile Include="Type\CurrencyType.cs" /> - <Compile Include="Type\TimeSpanType.cs" /> + <Compile Include="Type\TimeAsTimeSpanType.cs" /> <Compile Include="Type\DateTime2Type.cs" /> <Compile Include="Type\ClassMetaType.cs" /> <Compile Include="Type\CollectionType.cs" /> Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -213,12 +213,12 @@ /// <summary> /// NHibernate Ticks type /// </summary> - public static readonly NullableType TimeSpan = new TimeSpanType(); + public static readonly NullableType TimeAsTimeSpan = new TimeAsTimeSpanType(); /// <summary> /// NHibernate Ticks type /// </summary> - public static readonly NullableType TimeSpanInt64 = new TimeSpanInt64Type(); + public static readonly NullableType TimeSpan = new TimeSpanType(); /// <summary> /// NHibernate Timestamp type Copied: trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs (from rev 4165, trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,122 @@ +using System; +using System.Collections; +using System.Data; +using NHibernate.Engine; +using NHibernate.SqlTypes; +using System.Collections.Generic; + +namespace NHibernate.Type +{ + /// <summary> + /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Time" /> column + /// This is an extra way to map a <see cref="DbType.Time"/>. You already have <see cref="TimeType"/> + /// but mapping against a <see cref="DateTime"/>. + /// </summary> + [Serializable] + public class TimeAsTimeSpanType : PrimitiveType, IVersionType + { + private static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01); + + internal TimeAsTimeSpanType() + : base(SqlTypeFactory.Time) + { + } + + public override string Name + { + get { return "TimeAsTimeSpan"; } + } + + public override object Get(IDataReader rs, int index) + { + try + { + object value = rs[index]; + if(value is TimeSpan) + return (TimeSpan)value; + + return ((DateTime)value).Subtract(BaseDateValue); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); + } + } + + public override object Get(IDataReader rs, string name) + { + try + { + object value = rs[name]; + if (value is TimeSpan) //For those dialects where DbType.Time means TimeSpan. + return (TimeSpan)value; + + return ((DateTime)value).Subtract(BaseDateValue); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); + } + } + + public override void Set(IDbCommand st, object value, int index) + { + DateTime date = BaseDateValue.AddTicks(((TimeSpan)value).Ticks); + ((IDataParameter) st.Parameters[index]).Value = date; + } + + public override System.Type ReturnedClass + { + get { return typeof(TimeSpan); } + } + + public override string ToString(object val) + { + return ((TimeSpan)val).Ticks.ToString(); + } + + #region IVersionType Members + + public object Next(object current, ISessionImplementor session) + { + return Seed(session); + } + + public virtual object Seed(ISessionImplementor session) + { + return new TimeSpan(DateTime.Now.Ticks); + } + + public object StringToObject(string xml) + { + return TimeSpan.Parse(xml); + } + + public IComparer Comparator + { + get { return Comparer<TimeSpan>.Default; } + } + + #endregion + + public override object FromStringValue(string xml) + { + return TimeSpan.Parse(xml); + } + + public override System.Type PrimitiveClass + { + get { return typeof(TimeSpan); } + } + + public override object DefaultValue + { + get { return TimeSpan.Zero; } + } + + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) + { + return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; + } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,119 +0,0 @@ -using System; -using System.Collections; -using System.Data; -using NHibernate.Engine; -using NHibernate.SqlTypes; -using System.Collections.Generic; - -namespace NHibernate.Type -{ - /// <summary> - /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Int64" /> column - /// </summary> - [Serializable] - public class TimeSpanInt64Type : PrimitiveType, IVersionType, ILiteralType - { - /// <summary></summary> - internal TimeSpanInt64Type() - : base(SqlTypeFactory.Int64) - { - } - - /// <summary></summary> - public override string Name - { - get { return "TimeSpanInt64"; } - } - - public override object Get(IDataReader rs, int index) - { - try - { - return new TimeSpan(Convert.ToInt64(rs[index])); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); - } - } - - public override object Get(IDataReader rs, string name) - { - try - { - return new TimeSpan(Convert.ToInt64(rs[name])); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); - } - } - - /// <summary></summary> - public override System.Type ReturnedClass - { - get { return typeof(TimeSpan); } - } - - /// <summary> - /// - /// </summary> - /// <param name="st"></param> - /// <param name="value"></param> - /// <param name="index"></param> - public override void Set(IDbCommand st, object value, int index) - { - ((IDataParameter)st.Parameters[index]).Value = ((TimeSpan)value).Ticks; - } - - public override string ToString(object val) - { - return ((TimeSpan)val).Ticks.ToString(); - } - - #region IVersionType Members - - public object Next(object current, ISessionImplementor session) - { - return Seed(session); - } - - /// <summary></summary> - public virtual object Seed(ISessionImplementor session) - { - return new TimeSpan(DateTime.Now.Ticks); - } - - public object StringToObject(string xml) - { - return TimeSpan.Parse(xml); - } - - public IComparer Comparator - { - get { return Comparer<TimeSpan>.Default; } - } - - #endregion - - public override object FromStringValue(string xml) - { - return TimeSpan.Parse(xml); - } - - public override System.Type PrimitiveClass - { - get { return typeof(TimeSpan); } - } - - public override object DefaultValue - { - get { return TimeSpan.Zero; } - } - - public override string ObjectToSQLString(object value, Dialect.Dialect dialect) - { - return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; - } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,120 +0,0 @@ -using System; -using System.Collections; -using System.Data; -using NHibernate.Engine; -using NHibernate.SqlTypes; -using System.Collections.Generic; - -namespace NHibernate.Type -{ - /// <summary> - /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Time" /> column - /// </summary> - [Serializable] - public class TimeSpanType : PrimitiveType, IVersionType, ILiteralType - { - private static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01); - - internal TimeSpanType() - : base(SqlTypeFactory.Time) - { - } - - public override string Name - { - get { return "TimeSpan"; } - } - - public override object Get(IDataReader rs, int index) - { - try - { - object value = rs[index]; - if(value is TimeSpan) - return (TimeSpan)value; - - return ((DateTime)value).Subtract(BaseDateValue); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); - } - } - - public override object Get(IDataReader rs, string name) - { - try - { - object value = rs[name]; - if (value is TimeSpan) //For those dialects where DbType.Time means TimeSpan. - return (TimeSpan)value; - - return ((DateTime)value).Subtract(BaseDateValue); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); - } - } - - public override void Set(IDbCommand st, object value, int index) - { - DateTime date = BaseDateValue.AddTicks(((TimeSpan)value).Ticks); - ((IDataParameter) st.Parameters[index]).Value = date; - } - - public override System.Type ReturnedClass - { - get { return typeof(TimeSpan); } - } - - public override string ToString(object val) - { - return ((TimeSpan)val).Ticks.ToString(); - } - - #region IVersionType Members - - public object Next(object current, ISessionImplementor session) - { - return Seed(session); - } - - public virtual object Seed(ISessionImplementor session) - { - return new TimeSpan(DateTime.Now.Ticks); - } - - public object StringToObject(string xml) - { - return TimeSpan.Parse(xml); - } - - public IComparer Comparator - { - get { return Comparer<TimeSpan>.Default; } - } - - #endregion - - public override object FromStringValue(string xml) - { - return TimeSpan.Parse(xml); - } - - public override System.Type PrimitiveClass - { - get { return typeof(TimeSpan); } - } - - public override object DefaultValue - { - get { return TimeSpan.Zero; } - } - - public override string ObjectToSQLString(object value, Dialect.Dialect dialect) - { - return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; - } - } -} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs (from rev 4165, trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,119 @@ +using System; +using System.Collections; +using System.Data; +using NHibernate.Engine; +using NHibernate.SqlTypes; +using System.Collections.Generic; + +namespace NHibernate.Type +{ + /// <summary> + /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Int64" /> column + /// </summary> + [Serializable] + public class TimeSpanType : PrimitiveType, IVersionType, ILiteralType + { + /// <summary></summary> + internal TimeSpanType() + : base(SqlTypeFactory.Int64) + { + } + + /// <summary></summary> + public override string Name + { + get { return "TimeSpan"; } + } + + public override object Get(IDataReader rs, int index) + { + try + { + return new TimeSpan(Convert.ToInt64(rs[index])); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); + } + } + + public override object Get(IDataReader rs, string name) + { + try + { + return new TimeSpan(Convert.ToInt64(rs[name])); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); + } + } + + /// <summary></summary> + public override System.Type ReturnedClass + { + get { return typeof(TimeSpan); } + } + + /// <summary> + /// + /// </summary> + /// <param name="st"></param> + /// <param name="value"></param> + /// <param name="index"></param> + public override void Set(IDbCommand st, object value, int index) + { + ((IDataParameter)st.Parameters[index]).Value = ((TimeSpan)value).Ticks; + } + + public override string ToString(object val) + { + return ((TimeSpan)val).Ticks.ToString(); + } + + #region IVersionType Members + + public object Next(object current, ISessionImplementor session) + { + return Seed(session); + } + + /// <summary></summary> + public virtual object Seed(ISessionImplementor session) + { + return new TimeSpan(DateTime.Now.Ticks); + } + + public object StringToObject(string xml) + { + return TimeSpan.Parse(xml); + } + + public IComparer Comparator + { + get { return Comparer<TimeSpan>.Default; } + } + + #endregion + + public override object FromStringValue(string xml) + { + return TimeSpan.Parse(xml); + } + + public override System.Type PrimitiveClass + { + get { return typeof(TimeSpan); } + } + + public override object DefaultValue + { + get { return TimeSpan.Zero; } + } + + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) + { + return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Type/TimeType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeType.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TimeType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -7,6 +7,8 @@ /// <summary> /// Maps a <see cref="System.DateTime" /> Property to an DateTime column that only stores the /// Hours, Minutes, and Seconds of the DateTime as significant. + /// Also you have for <see cref="DbType.Time"/> handling, the NHibernate Type <see cref="TimeAsTimeSpanType"/>, + /// the which maps to a <see cref="TimeSpan"/>. /// </summary> /// <remarks> /// <para> @@ -14,7 +16,7 @@ /// using this Type indicates that you don't care about the Date portion of the DateTime. /// </para> /// <para> - /// A more appropriate choice to store the duration/time is the <see cref="TimeSpanInt64Type"/>. + /// A more appropriate choice to store the duration/time is the <see cref="TimeSpanType"/>. /// The underlying <see cref="DbType.Time"/> tends to be handled differently by different /// DataProviders. /// </para> Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -120,8 +120,8 @@ RegisterType(typeof(SByte), NHibernateUtil.SByte, null); RegisterType(typeof(Single), NHibernateUtil.Single, "float"); RegisterType(typeof(String), NHibernateUtil.String, "string"); - RegisterType(typeof(TimeSpan), NHibernateUtil.TimeSpanInt64,null); - RegisterType(typeof(TimeSpan), NHibernateUtil.TimeSpan, null); + RegisterType(typeof(TimeSpan), NHibernateUtil.TimeAsTimeSpan, "TimeAsTimeSpan"); + RegisterType(typeof(TimeSpan), NHibernateUtil.TimeSpan,null); RegisterType(typeof(System.Type), NHibernateUtil.Class, "class"); RegisterType(typeof(UInt16), NHibernateUtil.UInt16, null); @@ -141,8 +141,8 @@ typeByTypeOfName[NHibernateUtil.TrueFalse.Name] = NHibernateUtil.TrueFalse; typeByTypeOfName[NHibernateUtil.YesNo.Name] = NHibernateUtil.YesNo; typeByTypeOfName[NHibernateUtil.Ticks.Name] = NHibernateUtil.Ticks; - typeByTypeOfName[NHibernateUtil.TimeSpanInt64.Name] = NHibernateUtil.TimeSpanInt64; typeByTypeOfName[NHibernateUtil.TimeSpan.Name] = NHibernateUtil.TimeSpan; + typeByTypeOfName[NHibernateUtil.TimeAsTimeSpan.Name] = NHibernateUtil.TimeAsTimeSpan; typeByTypeOfName[NHibernateUtil.Currency.Name] = NHibernateUtil.Currency; // need to do add the key "Serializable" because the hbm files will have a Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -12,7 +12,9 @@ public DateTimeOffset Sql_datetimeoffset { get; set; } - public TimeSpan Sql_time { get; set; } + public TimeSpan Sql_TimeAsTimeSpan { get; set; } + + public DateTime Sql_time { get; set; } public DateTime Sql_date { get; set; } } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -9,7 +9,7 @@ <generator class="native"/> </id> - <property name="Sql_time" type="TimeSpan" /> + <property name="Sql_time" type="time" /> </class> Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml (from rev 4165, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.Dates" + assembly="NHibernate.Test"> + + <class name="AllDates" lazy="false"> + + <id name="Id"> + <generator class="native"/> + </id> + + <property name="Sql_TimeAsTimeSpan" type="TimeAsTimeSpan" /> + + </class> + +</hibernate-mapping> Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Dates +{ + [TestFixture] + public class TimeAsTimeSpanFixture : FixtureBase + { + protected override IList Mappings + { + get { return new[] {"NHSpecificTest.Dates.Mappings.TimeAsTimeSpan.hbm.xml"}; } + } + + [Test] + public void SavingAndRetrievingTest() + { + TimeSpan now = DateTime.Parse("23:59:59").TimeOfDay; + + SavingAndRetrievingAction(new AllDates { Sql_TimeAsTimeSpan = now }, + entity => + { + Assert.AreEqual(entity.Sql_TimeAsTimeSpan.Hours, now.Hours); + Assert.AreEqual(entity.Sql_TimeAsTimeSpan.Minutes, now.Minutes); + Assert.AreEqual(entity.Sql_TimeAsTimeSpan.Seconds, now.Seconds); + }); + } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,33 +0,0 @@ -using System; -using System.Collections; -using NHibernate.Dialect; -using NUnit.Framework; - -namespace NHibernate.Test.NHSpecificTest.Dates -{ - [TestFixture] - public class TimeFixture : FixtureBase - { - protected override IList Mappings - { - get { return new[] {"NHSpecificTest.Dates.Mappings.Time.hbm.xml"}; } - } - - [Test] - public void SavingAndRetrievingTest() - { - var now = DateTime.Parse("23:59:59").TimeOfDay; - - SavingAndRetrievingAction(new AllDates {Sql_time = now}, - entity => - { - Assert.AreEqual(entity.Sql_time.Hours, now.Hours); - Assert.AreEqual(entity.Sql_time.Minutes, now.Minutes); - Assert.AreEqual(entity.Sql_time.Seconds, now.Seconds); - }); - - if(Dialect is MsSql2008Dialect) - SavingAndRetrievingAction(new AllDates { Sql_time = now }, entity => Assert.AreEqual(entity.Sql_time, now)); - } - } -} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Dates +{ + [TestFixture] + public class TimeFixture : FixtureBase + { + protected override IList Mappings + { + get { return new[] {"NHSpecificTest.Dates.Mappings.Time.hbm.xml"}; } + } + + [Test] + public void SavingAndRetrievingTest() + { + DateTime now = DateTime.Parse("23:59:59"); + + SavingAndRetrievingAction(new AllDates {Sql_time = now}, + entity => + { + Assert.AreEqual(entity.Sql_time.Hour, now.Hour); + Assert.AreEqual(entity.Sql_time.Minute, now.Minute); + Assert.AreEqual(entity.Sql_time.Second, now.Second); + }); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 15:36:13 UTC (rev 4166) @@ -292,6 +292,7 @@ <Compile Include="GenericTest\SetGeneric\SetGenericFixture.cs" /> <Compile Include="HQL\Animal.cs" /> <Compile Include="HQL\BaseFunctionFixture.cs" /> + <Compile Include="NHSpecificTest\Dates\TimeFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\DtcFailuresFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> <Compile Include="NHSpecificTest\NH1635\Fixture.cs" /> @@ -416,7 +417,7 @@ <Compile Include="NHSpecificTest\BasicTimeFixture.cs" /> <Compile Include="NHSpecificTest\BugTestCase.cs" /> <Compile Include="NHSpecificTest\CollectionFixture.cs" /> - <Compile Include="NHSpecificTest\Dates\TimeFixture.cs" /> + <Compile Include="NHSpecificTest\Dates\TimeAsTimeSpanFixture.cs" /> <Compile Include="NHSpecificTest\Dates\DateFixture.cs" /> <Compile Include="NHSpecificTest\Dates\FixtureBase.cs" /> <Compile Include="NHSpecificTest\Dates\DateTime2Fixture.cs" /> @@ -1061,9 +1062,9 @@ <Compile Include="TypesTest\ByteTypeFixture.cs" /> <Compile Include="TypesTest\CurrencyClass.cs" /> <Compile Include="TypesTest\CurrencyTypeFixture.cs" /> + <Compile Include="TypesTest\TimeAsTimeSpanClass.cs" /> + <Compile Include="TypesTest\TimeAsTimeSpanTypeFixture.cs" /> <Compile Include="TypesTest\TimeSpanClass.cs" /> - <Compile Include="TypesTest\TimeSpanTypeFixture.cs" /> - <Compile Include="TypesTest\TimeSpanInt64Class.cs" /> <Compile Include="TypesTest\Decima2lTypeFixture.cs" /> <Compile Include="TypesTest\DateTimeTypeFixture.cs" /> <Compile Include="TypesTest\DecimalClass.cs" /> @@ -1092,7 +1093,7 @@ <Compile Include="TypesTest\StringClobTypeFixture.cs" /> <Compile Include="TypesTest\StringTypeFixture.cs" /> <Compile Include="TypesTest\TicksTypeFixture.cs" /> - <Compile Include="TypesTest\TimeSpanInt64TypeFixture.cs" /> + <Compile Include="TypesTest\TimeSpanTypeFixture.cs" /> <Compile Include="TypesTest\TimestampTypeFixture.cs" /> <Compile Include="TypesTest\TypeFactoryFixture.cs" /> <Compile Include="TypesTest\TypeFixtureBase.cs" /> @@ -1707,6 +1708,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\Dates\Mappings\TimeAsTimeSpan.hbm.xml" /> <EmbeddedResource Include="TypesTest\CurrencyClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1635\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1688\Mappings.hbm.xml" /> @@ -1742,8 +1744,8 @@ <EmbeddedResource Include="Generatedkeys\ByTrigger\MyEntity.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\Identity\MyEntityIdentity.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1289\Mappings.hbm.xml" /> + <EmbeddedResource Include="TypesTest\TimeAsTimeSpanClass.hbm.xml" /> <EmbeddedResource Include="TypesTest\TimeSpanClass.hbm.xml" /> - <EmbeddedResource Include="TypesTest\TimeSpanInt64Class.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\FileStreamSql2008\Mappings.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\Seqidentity\MyEntity.hbm.xml" /> <EmbeddedResource Include="IdGen\NativeGuid\NativeGuidPoid.hbm.xml" /> Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.TypesTest +{ + public class TimeAsTimeSpanClass + { + public int Id { get; set; } + public TimeSpan TimeSpanValue { get; set; } + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> + + <class name="NHibernate.Test.TypesTest.TimeAsTimeSpanClass, NHibernate.Test"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="TimeSpanValue" type="TimeAsTimeSpan" /> + </class> + +</hibernate-mapping> Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,79 @@ +using System; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + /// <summary> + /// Summary description for TimeAsTimeSpanTypeFixture. + /// </summary> + [TestFixture] + public class TimeAsTimeSpanTypeFixture + { + [Test] + public void Next() + { + var type = (TimeAsTimeSpanType) NHibernateUtil.TimeAsTimeSpan; + object current = new TimeSpan(DateTime.Now.Ticks - 5); + object next = type.Next(current, null); + + Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); + Assert.IsTrue((TimeSpan) next > (TimeSpan) current, + "next should be greater than current (could be equal depending on how quickly this occurs)"); + } + + [Test] + public void Seed() + { + var type = (TimeAsTimeSpanType) NHibernateUtil.TimeAsTimeSpan; + Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); + } + } + + [TestFixture] + public class TimeSpanFixture2 : TypeFixtureBase + { + protected override string TypeName + { + get { return "TimeAsTimeSpan"; } + } + + [Test] + public void SavingAndRetrieving() + { + var ticks = DateTime.Parse("23:59:59").TimeOfDay; + + var entity = new TimeAsTimeSpanClass + { + TimeSpanValue = ticks + }; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + TimeAsTimeSpanClass entityReturned; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + entityReturned = s.CreateQuery("from TimeAsTimeSpanClass").UniqueResult<TimeAsTimeSpanClass>(); + + Assert.AreEqual(ticks, entityReturned.TimeSpanValue); + Assert.AreEqual(entityReturned.TimeSpanValue.Hours,ticks.Hours); + Assert.AreEqual(entityReturned.TimeSpanValue.Minutes, ticks.Minutes); + Assert.AreEqual(entityReturned.TimeSpanValue.Seconds, ticks.Seconds); + } + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete(entityReturned); + tx.Commit(); + } + } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,10 +0,0 @@ -using System; - -namespace NHibernate.Test.TypesTest -{ - public class TimeSpanClass - { - public int Id { get; set; } - public TimeSpan TimeSpanValue { get; set; } - } -} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.TypesTest +{ + public class TimeSpanClass + { + public int Id { get; set; } + public TimeSpan TimeSpanValue { get; set; } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> - - <class name="NHibernate.Test.TypesTest.TimeSpanClass, NHibernate.Test"> - <id name="Id"> - <generator class="native" /> - </id> - <property name="TimeSpanValue" type="TimeSpan" /> - </class> - -</hibernate-mapping> Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> + + <class name="NHibernate.Test.TypesTest.TimeSpanClass, NHibernate.Test"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="TimeSpanValue" type="TimeSpan" /> + </class> + +</hibernate-mapping> Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,10 +0,0 @@ -using System; - -namespace NHibernate.Test.TypesTest -{ - public class TimeSpanInt64Class - { - public int Id { get; set; } - public TimeSpan TimeSpanValue { get; set; } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> - - <class name="NHibernate.Test.TypesTest.TimeSpanInt64Class, NHibernate.Test"> - <id name="Id"> - <generator class="native" /> - </id> - <property name="TimeSpanValue" type="TimeSpanInt64" /> - </class> - -</hibernate-mapping> Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,75 +0,0 @@ -using System; -using NHibernate.Type; -using NUnit.Framework; - -namespace NHibernate.Test.TypesTest -{ - /// <summary> - /// Summary description for TimeSpanTypeFixture. - /// </summary> - [TestFixture] - public class TimeSpanInt64TypeFixture - { - [Test] - public void Next() - { - var type = (TimeSpanInt64Type) NHibernateUtil.TimeSpanInt64; - object current = new TimeSpan(DateTime.Now.Ticks - 5); - object next = type.Next(current, null); - - Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); - Assert.IsTrue((TimeSpan) next > (TimeSpan) current, - "next should be greater than current (could be equal depending on how quickly this occurs)"); - } - - [Test] - public void Seed() - { - var type = (TimeSpanInt64Type) NHibernateUtil.TimeSpanInt64; - Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); - } - } - - [TestFixture] - public class TimeSpanInt64Fixture2 : TypeFixtureBase - { - protected override string TypeName - { - get { return "TimeSpanInt64"; } - } - - [Test] - public void SavingAndRetrieving() - { - var ticks = new TimeSpan(1982); - - var entity = new TimeSpanInt64Class - { - TimeSpanValue = ticks - }; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Save(entity); - tx.Commit(); - } - - TimeSpanInt64Class entityReturned; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - entityReturned = s.CreateQuery("from TimeSpanInt64Class").UniqueResult<TimeSpanInt64Class>(); - Assert.AreEqual(ticks, entityReturned.TimeSpanValue); - } - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Delete(entityReturned); - tx.Commit(); - } - } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,82 +0,0 @@ -using System; -using NHibernate.Dialect; -using NHibernate.Type; -using NUnit.Framework; - -namespace NHibernate.Test.TypesTest -{ - /// <summary> - /// Summary description for TimeSpanTypeFixture. - /// </summary> - [TestFixture] - public class TimeSpanTypeFixture - { - [Test] - public void Next() - { - var type = (TimeSpanType) NHibernateUtil.TimeSpan; - object current = new TimeSpan(DateTime.Now.Ticks - 5); - object next = type.Next(current, null); - - Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); - Assert.IsTrue((TimeSpan) next > (TimeSpan) current, - "next should be greater than current (could be equal depending on how quickly this occurs)"); - } - - [Test] - public void Seed() - { - var type = (TimeSpanType) NHibernateUtil.TimeSpan; - Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); - } - } - - [TestFixture] - public class TimeSpanFixture2 : TypeFixtureBase - { - protected override string TypeName - { - get { return "TimeSpan"; } - } - - [Test] - public void SavingAndRetrieving() - { - var ticks = DateTime.Parse("23:59:59").TimeOfDay; - - var entity = new TimeSpanClass - { - TimeSpanValue = ticks - }; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Save(entity); - tx.Commit(); - } - - TimeSpanClass entityReturned; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - entityReturned = s.CreateQuery("from TimeSpanClass").UniqueResult<TimeSpanClass>(); - - if(Dialect is MsSql2008Dialect) - Assert.AreEqual(ticks, entityReturned.TimeSpanValue); - - Assert.AreEqual(entityReturned.TimeSpanValue.Hours,ticks.Hours); - Assert.AreEqual(entityReturned.TimeSpanValue.Minutes, ticks.Minutes); - Assert.AreEqual(entityReturned.TimeSpanValue.Seconds, ticks.Seconds); - } - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Delete(entityReturned); - tx.Commit(); - } - } - } -} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,75 @@ +using System; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + /// <summary> + /// Summary description for TimeSpanTypeFixture. + /// </summary> + [TestFixture] + public class TimeSpanTypeFixture + { + [Test] + public void Next() + { + var type = (TimeSpanType) NHibernateUtil.TimeSpan; + object current = new TimeSpan(DateTime.Now.Ticks - 5); + object next = type.Next(current, null); + + Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); + Assert.IsTrue((TimeSpan) next > (TimeSpan) current, + "next should be greater than current (could be equal depending on how quickly this occurs)"); + } + + [Test] + public void Seed() + { + var type = (TimeSpanType) NHibernateUtil.TimeSpan; + Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); + } + } + + [TestFixture] + public class TimeSpanTypeFixture2 : TypeFixtureBase + { + protected override string TypeName + { + get { return "TimeSpan"; } + } + + [Test] + public void SavingAndRetrieving() + { + var ticks = new TimeSpan(1982); + + var entity = new TimeSpanClass + { + TimeSpanValue = ticks + }; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + TimeSpanClass entityReturned; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + entityReturned = s.CreateQuery("from TimeSpanClass").UniqueResult<TimeSpanClass>(); + Assert.AreEqual(ticks, entityReturned.TimeSpanValue); + } + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete(entityReturned); + tx.Commit(); + } + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-13 16:41:57
|
Revision: 4176 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4176&view=rev Author: davybrion Date: 2009-04-13 16:41:52 +0000 (Mon, 13 Apr 2009) Log Message: ----------- NH-1737: Make Future<T> fall back to regular List<T> implementation if the current RDBMS does not support query batching Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -828,7 +828,12 @@ public IEnumerable<T> Future<T>() { - session.FutureQueryBatch.Add(this); + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return List<T>(); + } + + session.FutureQueryBatch.Add(this); return session.FutureQueryBatch.GetEnumerator<T>(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -379,6 +379,11 @@ public IEnumerable<T> Future<T>() { + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return List<T>(); + } + session.FutureCriteriaBatch.Add(this); return session.FutureCriteriaBatch.GetEnumerator<T>(); } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -0,0 +1,63 @@ +using System; +using System.Collections; + +using NHibernate.Cfg; +using NHibernate.Dialect; +using NHibernate.Driver; + +using NUnit.Framework; + +using Environment=NHibernate.Cfg.Environment; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + public class TestDriver : SqlClientDriver + { + public override bool SupportsMultipleQueries + { + get { return false; } + } + } + + /// <summary> + /// I've restricted this fixture to MsSql and am using a Driver which derives from SqlClientDriver to + /// return false for the SupportsMultipleQueries property. This is purely to test the way NHibernate + /// will behave when the driver that's being used does not support multiple queries... so even though + /// the test is restricted to MsSql, it's only relevant for databases that don't support multiple queries + /// but this way it's just much easier to test this + /// </summary> + [TestFixture] + public class FallbackFixture : FutureFixture + { + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + protected override void Configure(Configuration configuration) + { + configuration.Properties[Environment.ConnectionDriver] = "NHibernate.Test.NHSpecificTest.Futures.TestDriver, NHibernate.Test"; + base.Configure(configuration); + } + + [Test] + public void CriteriaFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + { + using (var session = sessions.OpenSession()) + { + var results = session.CreateCriteria<Person>().Future<Person>(); + results.GetEnumerator().MoveNext(); + } + } + + [Test] + public void QueryFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + { + using (var session = sessions.OpenSession()) + { + var results = session.CreateQuery("from Person").Future<Person>(); + results.GetEnumerator().MoveNext(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -4,32 +4,15 @@ namespace NHibernate.Test.NHSpecificTest.Futures { - using System.Collections; - [TestFixture] - public class FutureCriteriaFixture : TestCase + public class FutureCriteriaFixture : FutureFixture { - - protected override IList Mappings - { - get { return new string[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } - } - - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - [Test] public void CanUseFutureCriteria() { using (var s = sessions.OpenSession()) { - if(((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons10 = s.CreateCriteria(typeof(Person)) .SetMaxResults(10) @@ -56,16 +39,12 @@ } } - [Test] + [Test] public void TwoFuturesRunInTwoRoundTrips() { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); using (var logSpy = new SqlLogSpy()) { @@ -92,11 +71,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons = s.CreateCriteria(typeof(Person)) .SetMaxResults(10) @@ -120,5 +95,5 @@ } } } - } + } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -0,0 +1,30 @@ +using System.Collections; + +using NHibernate.Impl; + +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + public abstract class FutureFixture : TestCase + { + protected override IList Mappings + { + get { return new[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } + } + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected void IgnoreThisTestIfMultipleQueriesArentSupportedByDriver() + { + if (((SessionFactoryImpl)sessions) + .ConnectionProvider.Driver.SupportsMultipleQueries == false) + { + Assert.Ignore("Not applicable for dialects that do not support multiple queries"); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -6,29 +6,14 @@ using System.Collections; [TestFixture] - public class FutureQueryFixture : TestCase + public class FutureQueryFixture : FutureFixture { - - protected override IList Mappings - { - get { return new string[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } - } - - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - [Test] public void CanUseFutureQuery() { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons10 = s.CreateQuery("from Person") .SetMaxResults(10) @@ -60,11 +45,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); using (var logSpy = new SqlLogSpy()) { @@ -91,11 +72,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons = s.CreateQuery("from Person") .SetMaxResults(10) Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-13 16:41:52 UTC (rev 4176) @@ -295,6 +295,8 @@ <Compile Include="NHSpecificTest\Dates\TimeFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\DtcFailuresFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> + <Compile Include="NHSpecificTest\Futures\FallbackFixture.cs" /> + <Compile Include="NHSpecificTest\Futures\FutureFixture.cs" /> <Compile Include="NHSpecificTest\NH1635\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1635\ForumMessage.cs" /> <Compile Include="NHSpecificTest\NH1635\ForumThread.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-13 17:20:36
|
Revision: 4177 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4177&view=rev Author: davybrion Date: 2009-04-13 17:20:26 +0000 (Mon, 13 Apr 2009) Log Message: ----------- NH-1738: Make FutureValue<T> fall back to regular List implementation if the current RDBMS does not support query batching Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 17:20:26 UTC (rev 4177) @@ -839,7 +839,12 @@ public IFutureValue<T> FutureValue<T>() { - session.FutureQueryBatch.Add(this); + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return new FutureValue<T>(List); + } + + session.FutureQueryBatch.Add(this); return session.FutureQueryBatch.GetFutureValue<T>(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 17:20:26 UTC (rev 4177) @@ -373,6 +373,11 @@ public IFutureValue<T> FutureValue<T>() { + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return new FutureValue<T>(List); + } + session.FutureCriteriaBatch.Add(this); return session.FutureCriteriaBatch.GetFutureValue<T>(); } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 17:20:26 UTC (rev 4177) @@ -2,16 +2,18 @@ using System.Collections; using NHibernate.Cfg; +using NHibernate.Criterion; using NHibernate.Dialect; using NHibernate.Driver; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using Environment=NHibernate.Cfg.Environment; namespace NHibernate.Test.NHSpecificTest.Futures { - public class TestDriver : SqlClientDriver + public class TestDriverThatDoesntSupportQueryBatching : SqlClientDriver { public override bool SupportsMultipleQueries { @@ -36,12 +38,24 @@ protected override void Configure(Configuration configuration) { - configuration.Properties[Environment.ConnectionDriver] = "NHibernate.Test.NHSpecificTest.Futures.TestDriver, NHibernate.Test"; + configuration.Properties[Environment.ConnectionDriver] = + "NHibernate.Test.NHSpecificTest.Futures.TestDriverThatDoesntSupportQueryBatching, NHibernate.Test"; base.Configure(configuration); } + protected override void OnTearDown() + { + using (var session = sessions.OpenSession()) + { + session.Delete("from Person"); + session.Flush(); + } + + base.OnTearDown(); + } + [Test] - public void CriteriaFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + public void FutureOfCriteriaFallsBackToListImplementationWhenQueryBatchingIsNotSupported() { using (var session = sessions.OpenSession()) { @@ -51,7 +65,7 @@ } [Test] - public void QueryFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + public void FutureOfQueryFallsBackToListImplementationWhenQueryBatchingIsNotSupported() { using (var session = sessions.OpenSession()) { @@ -59,5 +73,71 @@ results.GetEnumerator().MoveNext(); } } + + [Test] + public void FutureValueOfCriteriaCanGetSingleEntityWhenQueryBatchingIsNotSupported() + { + int personId = CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futurePerson = session.CreateCriteria<Person>() + .Add(Restrictions.Eq("Id", personId)) + .FutureValue<Person>(); + Assert.IsNotNull(futurePerson.Value); + } + } + + [Test] + public void FutureValueOfCriteriaCanGetScalarValueWhenQueryBatchingIsNotSupported() + { + CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futureCount = session.CreateCriteria<Person>() + .SetProjection(Projections.RowCount()) + .FutureValue<int>(); + Assert.That(futureCount.Value, Is.EqualTo(1)); + } + } + + [Test] + public void FutureValueOfQueryCanGetSingleEntityWhenQueryBatchingIsNotSupported() + { + int personId = CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futurePerson = session.CreateQuery("from Person where Id = :id") + .SetInt32("id", personId) + .FutureValue<Person>(); + Assert.IsNotNull(futurePerson.Value); + } + } + + [Test] + public void FutureValueOfQueryCanGetScalarValueWhenQueryBatchingIsNotSupported() + { + CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futureCount = session.CreateQuery("select count(*) from Person") + .FutureValue<long>(); + Assert.That(futureCount.Value, Is.EqualTo(1L)); + } + } + + private int CreatePerson() + { + using (var session = sessions.OpenSession()) + { + var person = new Person(); + session.Save(person); + session.Flush(); + return person.Id; + } + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-14 18:12:01
|
Revision: 4179 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4179&view=rev Author: davybrion Date: 2009-04-14 18:11:54 +0000 (Tue, 14 Apr 2009) Log Message: ----------- fix for NH-1728 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/Transformers.cs trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs Modified: trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -130,31 +130,32 @@ return null; } + // the BindingFlags.IgnoreCase is important here because if type is a struct, the GetProperty method does + // not ignore case by default. If type is a class, it _does_ ignore case... we're better off explicitly + // stating that casing should be ignored so we get the same behavior for both structs and classes PropertyInfo property = type.GetProperty(propertyName, - BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.IgnoreCase); if (property != null && property.CanWrite) { return new BasicSetter(type, property, propertyName); } - else + + // recursively call this method for the base Type + BasicSetter setter = GetSetterOrNull(type.BaseType, propertyName); + + // didn't find anything in the base class - check to see if there is + // an explicit interface implementation. + if (setter == null) { - // recursively call this method for the base Type - BasicSetter setter = GetSetterOrNull(type.BaseType, propertyName); - - // didn't find anything in the base class - check to see if there is - // an explicit interface implementation. - if (setter == null) + System.Type[] interfaces = type.GetInterfaces(); + for (int i = 0; setter == null && i < interfaces.Length; i++) { - System.Type[] interfaces = type.GetInterfaces(); - for (int i = 0; setter == null && i < interfaces.Length; i++) - { - setter = GetSetterOrNull(interfaces[i], propertyName); - } + setter = GetSetterOrNull(interfaces[i], propertyName); } - return setter; } + return setter; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -40,8 +40,12 @@ throw new ArgumentNullException("resultClass"); } this.resultClass = resultClass; + constructor = resultClass.GetConstructor(flags, null, System.Type.EmptyTypes, null); - if (constructor == null) + + // if resultClass is a ValueType (struct), GetConstructor will return null... + // in that case, we'll use Activator.CreateInstance instead of the ConstructorInfo to create instances + if (constructor == null && resultClass.IsClass) { throw new ArgumentException("The target class of a AliasToBeanResultTransformer need a parameter-less constructor", "resultClass"); @@ -73,7 +77,9 @@ } } } - result = constructor.Invoke(null); + + // 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); for (int i = 0; i < aliases.Length; i++) { Modified: trunk/nhibernate/src/NHibernate/Transform/Transformers.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/Transformers.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate/Transform/Transformers.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -22,9 +22,9 @@ return new AliasToBeanResultTransformer(target); } - public static IResultTransformer AliasToBean<T>() where T: class + public static IResultTransformer AliasToBean<T>() { - return AliasToBean(typeof (T)); + return AliasToBean(typeof(T)); } public static readonly IResultTransformer DistinctRootEntity = new DistinctRootEntityResultTransformer(); Modified: trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using NHibernate.Transform; @@ -36,6 +37,11 @@ } } + public struct TestStruct + { + public string Something { get; set; } + } + #region Overrides of TestCase protected override IList Mappings @@ -53,34 +59,66 @@ [Test] public void WorkWithOutPublicParameterLessCtor() { - Setup(); + try + { + Setup(); - using (ISession s = OpenSession()) + using (ISession s = OpenSession()) + { + IList<WithOutPublicParameterLessCtor> l = + s.CreateSQLQuery("select s.Name as something from Simple s").SetResultTransformer( + Transformers.AliasToBean<WithOutPublicParameterLessCtor>()).List<WithOutPublicParameterLessCtor>(); + Assert.That(l.Count, Is.EqualTo(2)); + Assert.That(l, Has.All.Not.Null); + } + } + finally { - IList<WithOutPublicParameterLessCtor> l = - s.CreateSQLQuery("select s.Name as something from Simple s").SetResultTransformer( - Transformers.AliasToBean<WithOutPublicParameterLessCtor>()).List<WithOutPublicParameterLessCtor>(); - Assert.That(l.Count, Is.EqualTo(2)); - Assert.That(l, Has.All.Not.Null); + Cleanup(); } - - Cleanup(); } [Test] public void WorkWithPublicParameterLessCtor() { - Setup(); + try + { + Setup(); - var queryString = "select s.Name as something from Simple s"; - AssertAreWorking(queryString); // working for field access - - queryString = "select s.Name as Something from Simple s"; - AssertAreWorking(queryString); // working for property access + var queryString = "select s.Name as something from Simple s"; + AssertAreWorking(queryString); // working for field access - Cleanup(); + queryString = "select s.Name as Something from Simple s"; + AssertAreWorking(queryString); // working for property access + } + finally + { + Cleanup(); + } } + [Test] + public void WorksWithStruct() + { + try + { + Setup(); + + IList<TestStruct> result; + using (ISession s = OpenSession()) + { + result = s.CreateSQLQuery("select s.Name as something from Simple s") + .SetResultTransformer(Transformers.AliasToBean<TestStruct>()) + .List<TestStruct>(); + } + Assert.AreEqual(2, result.Count); + } + finally + { + Cleanup(); + } + } + private void AssertAreWorking(string queryString) { using (ISession s = OpenSession()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-15 14:17:30
|
Revision: 4181 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4181&view=rev Author: fabiomaulo Date: 2009-04-15 14:17:10 +0000 (Wed, 15 Apr 2009) Log Message: ----------- - Fix NH-1741 - Fixed some other issues related with query property set from mapping Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs trunk/nhibernate/src/NHibernate/IDetachedQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -29,7 +29,7 @@ int timeout = string.IsNullOrEmpty(querySchema.timeout) ? RowSelection.NoValue : int.Parse(querySchema.timeout); int fetchSize = querySchema.fetchsizeSpecified ? querySchema.fetchsize : -1; bool readOnly = querySchema.readonlySpecified ? querySchema.@readonly : false; - string comment = null; + string comment = querySchema.comment; FlushMode flushMode = FlushModeConverter.GetFlushMode(querySchema); CacheMode? cacheMode = (querySchema.cachemodeSpecified) Modified: trunk/nhibernate/src/NHibernate/IDetachedQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IDetachedQuery.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/IDetachedQuery.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -1,6 +1,5 @@ using System; using System.Collections; -using NHibernate; using NHibernate.Transform; using NHibernate.Type; @@ -54,6 +53,10 @@ /// <param name="timeout"></param> IDetachedQuery SetTimeout(int timeout); + /// <summary> Set a fetch size for the underlying ADO query.</summary> + /// <param name="fetchSize">the fetch size </param> + IDetachedQuery SetFetchSize(int fetchSize); + /// <summary> /// Set the lockmode for the objects idententified by the /// given alias that appears in the <c>FROM</c> clause. @@ -62,6 +65,10 @@ /// <param name="lockMode"></param> void SetLockMode(string alias, LockMode lockMode); + /// <summary> Add a comment to the generated SQL.</summary> + /// <param name="comment">a human-readable string </param> + IDetachedQuery SetComment(string comment); + /// <summary> /// Bind a value to an indexed parameter. /// </summary> Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -1,7 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using NHibernate; using NHibernate.Engine; using NHibernate.Proxy; using NHibernate.Transform; @@ -51,6 +50,7 @@ protected IResultTransformer resultTransformer; protected bool shouldIgnoredUnknownNamedParameters; protected CacheMode? cacheMode; + protected string comment; #region IDetachedQuery Members @@ -68,30 +68,42 @@ return this; } - public IDetachedQuery SetCacheable(bool cacheable) + public virtual IDetachedQuery SetComment(string comment) { + this.comment = comment; + return this; + } + + public virtual IDetachedQuery SetCacheable(bool cacheable) + { this.cacheable = cacheable; return this; } - public IDetachedQuery SetCacheRegion(string cacheRegion) + public virtual IDetachedQuery SetCacheRegion(string cacheRegion) { this.cacheRegion = cacheRegion; return this; } - public IDetachedQuery SetReadOnly(bool readOnly) + public virtual IDetachedQuery SetReadOnly(bool readOnly) { this.readOnly = readOnly; return this; } - public IDetachedQuery SetTimeout(int timeout) + public virtual IDetachedQuery SetTimeout(int timeout) { selection.Timeout = timeout; return this; } + public virtual IDetachedQuery SetFetchSize(int fetchSize) + { + selection.FetchSize = fetchSize; + return this; + } + public void SetLockMode(string alias, LockMode lockMode) { if (string.IsNullOrEmpty(alias)) @@ -368,7 +380,7 @@ return this; } - public IDetachedQuery SetFlushMode(FlushMode flushMode) + public virtual IDetachedQuery SetFlushMode(FlushMode flushMode) { this.flushMode = flushMode; return this; @@ -389,7 +401,7 @@ /// <summary> Override the current session cache mode, just for this query. </summary> /// <param name="cacheMode">The cache mode to use. </param> /// <returns> this (for method chaining) </returns> - public IDetachedQuery SetCacheMode(CacheMode cacheMode) + public virtual IDetachedQuery SetCacheMode(CacheMode cacheMode) { this.cacheMode = cacheMode; return this; @@ -411,7 +423,10 @@ .SetCacheable(cacheable) .SetReadOnly(readOnly) .SetTimeout(selection.Timeout) - .SetFlushMode(flushMode); + .SetFlushMode(flushMode) + .SetFetchSize(selection.FetchSize); + if (!string.IsNullOrEmpty(comment)) + q.SetComment(comment); if (!string.IsNullOrEmpty(cacheRegion)) q.SetCacheRegion(cacheRegion); if (resultTransformer != null) @@ -474,6 +489,7 @@ flushMode = FlushMode.Unspecified; resultTransformer = null; shouldIgnoredUnknownNamedParameters = false; + comment = null; } private void ClearParameters() @@ -503,7 +519,10 @@ .SetCacheable(cacheable) .SetReadOnly(readOnly) .SetTimeout(selection.Timeout) - .SetFlushMode(flushMode); + .SetFlushMode(flushMode) + .SetFetchSize(selection.FetchSize); + if (!string.IsNullOrEmpty(comment)) + destination.SetComment(comment); if (!string.IsNullOrEmpty(cacheRegion)) destination.SetCacheRegion(cacheRegion); if (cacheMode.HasValue) Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -222,6 +222,7 @@ { query.SetComment(nqd.Comment); } + query.SetFlushMode(nqd.FlushMode); } public virtual IQuery CreateQuery(string queryString) Modified: trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -1,4 +1,5 @@ using System; +using NHibernate.Engine; namespace NHibernate.Impl { @@ -13,6 +14,15 @@ public class DetachedNamedQuery : AbstractDetachedQuery { private readonly string queryName; + private bool cacheableWasSet; + private bool cacheModeWasSet; + private bool cacheRegionWasSet; + private bool readOnlyWasSet; + private bool timeoutWasSet; + private bool fetchSizeWasSet; + private bool commentWasSet; + private bool flushModeWasSet; + /// <summary> /// Create a new instance of <see cref="DetachedNamedQuery"/> for a named query string defined in the mapping file. /// </summary> @@ -39,19 +49,112 @@ public override IQuery GetExecutableQuery(ISession session) { IQuery result = session.GetNamedQuery(queryName); + SetDefaultProperties((ISessionFactoryImplementor)session.SessionFactory); SetQueryProperties(result); return result; } + private void SetDefaultProperties(ISessionFactoryImplementor factory) + { + NamedQueryDefinition nqd = factory.GetNamedQuery(queryName) ?? factory.GetNamedSQLQuery(queryName); + + if (!cacheableWasSet) + { + cacheable = nqd.IsCacheable; + } + + if (!cacheRegionWasSet) + { + cacheRegion = nqd.CacheRegion; + } + + if(!timeoutWasSet && nqd.Timeout != -1) + { + selection.Timeout= nqd.Timeout; + } + + if (!fetchSizeWasSet && nqd.FetchSize != -1) + { + selection.FetchSize = nqd.FetchSize; + } + + if (!cacheModeWasSet && nqd.CacheMode.HasValue) + { + cacheMode = nqd.CacheMode.Value; + } + + if (!readOnlyWasSet) + { + readOnly = nqd.IsReadOnly; + } + + if (!commentWasSet && nqd.Comment != null) + { + comment = nqd.Comment; + } + + if(!flushModeWasSet) + { + flushMode = nqd.FlushMode; + } + } + /// <summary> /// Creates a new DetachedNamedQuery that is a deep copy of the current instance. /// </summary> /// <returns>The clone.</returns> public DetachedNamedQuery Clone() { - DetachedNamedQuery result = new DetachedNamedQuery(queryName); + var result = new DetachedNamedQuery(queryName); CopyTo(result); return result; } + + public override IDetachedQuery SetCacheable(bool cacheable) + { + cacheableWasSet = true; + return base.SetCacheable(cacheable); + } + + public override IDetachedQuery SetCacheMode(CacheMode cacheMode) + { + cacheModeWasSet = true; + return base.SetCacheMode(cacheMode); + } + public override IDetachedQuery SetCacheRegion(string cacheRegion) + { + cacheRegionWasSet = true; + return base.SetCacheRegion(cacheRegion); + } + + public override IDetachedQuery SetReadOnly(bool readOnly) + { + readOnlyWasSet = true; + return base.SetReadOnly(readOnly); + } + + public override IDetachedQuery SetTimeout(int timeout) + { + timeoutWasSet = true; + return base.SetTimeout(timeout); + } + + public override IDetachedQuery SetFetchSize(int fetchSize) + { + fetchSizeWasSet = true; + return base.SetFetchSize(fetchSize); + } + + public override IDetachedQuery SetComment(string comment) + { + commentWasSet = true; + return base.SetComment(comment); + } + + public override IDetachedQuery SetFlushMode(FlushMode flushMode) + { + flushModeWasSet = true; + return base.SetFlushMode(flushMode); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -0,0 +1,7 @@ +namespace NHibernate.Test.NHSpecificTest.NH1741 +{ + public class A + { + public virtual string Name { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -0,0 +1,139 @@ +using System.Reflection; +using NHibernate.Engine; +using NHibernate.Impl; +using NUnit.Framework; +using NHibernate.Util; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.NHSpecificTest.NH1741 +{ + [TestFixture] + public class Fixture: BugTestCase + { + private const string QueryName = "NH1741_All"; + + public class DetachedNamedQueryCrack : DetachedNamedQuery + { + private readonly FieldInfo fiCacheable = typeof(AbstractQueryImpl).GetField("cacheable", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiCacheRegion = typeof(AbstractQueryImpl).GetField("cacheRegion", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiCacheMode = typeof(AbstractQueryImpl).GetField("cacheMode", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiReadOnly = typeof(AbstractQueryImpl).GetField("readOnly", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiSelection = typeof(AbstractQueryImpl).GetField("selection", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiComment = typeof(AbstractQueryImpl).GetField("comment", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiFlushMode = typeof(AbstractQueryImpl).GetField("flushMode", ReflectHelper.AnyVisibilityInstance); + + private QueryImpl queryExecutable; + public DetachedNamedQueryCrack(string queryName) : base(queryName) { } + public override IQuery GetExecutableQuery(ISession session) + { + var result = base.GetExecutableQuery(session); + queryExecutable = (QueryImpl)result; + return result; + } + + public bool Cacheable + { + get + { + return (bool)fiCacheable.GetValue(queryExecutable); + } + } + + public string CacheRegion + { + get + { + return (string)fiCacheRegion.GetValue(queryExecutable); + } + } + + public int Timeout + { + get + { + return ((RowSelection)fiSelection.GetValue(queryExecutable)).Timeout; + } + } + + public int FetchSize + { + get + { + return ((RowSelection)fiSelection.GetValue(queryExecutable)).FetchSize; + } + } + + public CacheMode? CacheMode + { + get + { + return (CacheMode?)fiCacheMode.GetValue(queryExecutable); + } + } + + public bool ReadOnly + { + get + { + return (bool)fiReadOnly.GetValue(queryExecutable); + } + } + + public string Comment + { + get + { + return (string)fiComment.GetValue(queryExecutable); + } + } + + public FlushMode FlushMode + { + get + { + return (FlushMode)fiFlushMode.GetValue(queryExecutable); + } + } + } + + [Test] + [Description("DetachedNamedQuery should read all mapped parameters when not explicitly set.")] + public void Bug() + { + var dq = new DetachedNamedQueryCrack(QueryName); + ISession s = sessions.OpenSession(); + dq.GetExecutableQuery(s); + s.Close(); + + Assert.That(dq.Cacheable); + Assert.That(dq.CacheRegion, Is.EqualTo("region")); + Assert.That(dq.ReadOnly); + Assert.That(dq.Timeout, Is.EqualTo(10)); + Assert.That(dq.CacheMode, Is.EqualTo(CacheMode.Normal)); + Assert.That(dq.FetchSize, Is.EqualTo(11)); + Assert.That(dq.Comment, Is.EqualTo("the comment")); + Assert.That(dq.FlushMode, Is.EqualTo(FlushMode.Auto)); + } + + [Test] + [Description("DetachedNamedQuery should override all mapped parameters when explicitly set.")] + public void Override() + { + var dq = new DetachedNamedQueryCrack(QueryName); + dq.SetCacheable(false).SetCacheRegion("another region").SetReadOnly(false).SetTimeout(20).SetCacheMode( + CacheMode.Refresh).SetFetchSize(22).SetComment("another comment").SetFlushMode(FlushMode.Commit); + ISession s = sessions.OpenSession(); + dq.GetExecutableQuery(s); + s.Close(); + + Assert.That(!dq.Cacheable); + Assert.That(dq.CacheRegion, Is.EqualTo("another region")); + Assert.That(!dq.ReadOnly); + Assert.That(dq.Timeout, Is.EqualTo(20)); + Assert.That(dq.CacheMode, Is.EqualTo(CacheMode.Refresh)); + Assert.That(dq.FetchSize, Is.EqualTo(22)); + Assert.That(dq.Comment, Is.EqualTo("another comment")); + Assert.That(dq.FlushMode, Is.EqualTo(FlushMode.Commit)); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml 2009-04-15 14:17:10 UTC (rev 4181) @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1741"> + + <class name="A"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Name"/> + </class> + + <query name="NH1741_All" + cacheable="true" + cache-region="region" + read-only="true" + timeout="10" + cache-mode="normal" + fetch-size="11" + flush-mode="auto" + comment="the comment"> + from A + </query> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-15 14:17:10 UTC (rev 4181) @@ -320,6 +320,8 @@ <Compile Include="NHSpecificTest\NH1715\ClassA.cs" /> <Compile Include="NHSpecificTest\NH1716\ClassA.cs" /> <Compile Include="NHSpecificTest\NH1716\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1741\Domain.cs" /> + <Compile Include="NHSpecificTest\NH1741\Fixture.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -1713,6 +1715,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1741\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1716\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\Dates\Mappings\TimeAsTimeSpan.hbm.xml" /> <EmbeddedResource Include="TypesTest\CurrencyClass.hbm.xml" /> Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -6,11 +6,12 @@ using NHibernate.Transform; using NHibernate.Util; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; namespace NHibernate.Test.QueryTest { [TestFixture] - public class DetachedQueryFixture:TestCase + public class DetachedQueryFixture : TestCase { protected override string MappingsAssembly { @@ -23,6 +24,8 @@ } public const int totalFoo = 15; + private const string MyComment = "My Comment"; + protected override void OnSetUp() { using (ISession s = OpenSession()) @@ -50,8 +53,8 @@ { TestDetachedQuery tdq = new TestDetachedQuery(); tdq.SetMaxResults(10).SetFirstResult(5).SetCacheable(true).SetReadOnly(true).SetTimeout(444).SetFlushMode( - FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof (NoFoo))). - SetIgnoreUknownNamedParameters(true); + FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof(NoFoo))). + SetIgnoreUknownNamedParameters(true).SetComment(MyComment); Assert.AreEqual(10, tdq.Selection.MaxRows); Assert.AreEqual(5, tdq.Selection.FirstRow); Assert.AreEqual(444, tdq.Selection.Timeout); @@ -61,6 +64,7 @@ Assert.AreEqual("A_REGION", tdq.CacheRegion); Assert.IsNotNull(tdq.ResultTransformer); Assert.IsTrue(tdq.ShouldIgnoredUnknownNamedParameters); + Assert.That(tdq.Comment, Is.EqualTo(MyComment)); tdq.SetLockMode("LM1", LockMode.Upgrade); tdq.SetLockMode("LM2", LockMode.Write); @@ -77,7 +81,7 @@ Assert.IsTrue(tdq.OptionalUntypeParams[1].Equals(new Foo("Fulano", "De Tal"))); tdq.SetAnsiString(1, ""); - tdq.SetBinary(2, new byte[] {}); + tdq.SetBinary(2, new byte[] { }); tdq.SetBoolean(3, false); tdq.SetByte(4, 255); tdq.SetCharacter(5, 'A'); @@ -158,7 +162,7 @@ Assert.AreEqual(1, tdq.NamedUntypeParams.Count); Assert.IsTrue(tdq.NamedUntypeParams.ContainsKey("Any")); - tdq.SetParameterList("UntypedList", new int[] {1, 2, 3}); + tdq.SetParameterList("UntypedList", new int[] { 1, 2, 3 }); Assert.IsTrue(tdq.NamedUntypeListParams.ContainsKey("UntypedList")); tdq.SetParameterList("TypedList", new Int64[] { 1, 2, 3 }, NHibernateUtil.Int64); @@ -171,18 +175,19 @@ { TestDetachedQuery origin = new TestDetachedQuery(); origin.SetMaxResults(10).SetFirstResult(5).SetCacheable(true).SetReadOnly(true).SetTimeout(444).SetFlushMode - (FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof (NoFoo))); + (FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof(NoFoo))); + origin.SetComment(MyComment); origin.SetLockMode("LM1", LockMode.Upgrade); origin.SetProperties(new Foo("Pallino", "Pinco")); origin.SetInt64(1, 1); - origin.SetBinary(2, new byte[] {}); + origin.SetBinary(2, new byte[] { }); origin.SetBoolean(3, false); origin.SetDateTime(6, DateTime.MaxValue); origin.SetCharacter("5", 'A'); origin.SetDateTime("6", DateTime.MaxValue); origin.SetDecimal("7", 10.15m); - origin.SetParameterList("UntypedList", new int[] {1, 2, 3}); - origin.SetParameterList("TypedList", new Int64[] {1, 2, 3}, NHibernateUtil.Int64); + origin.SetParameterList("UntypedList", new int[] { 1, 2, 3 }); + origin.SetParameterList("TypedList", new Int64[] { 1, 2, 3 }, NHibernateUtil.Int64); TestDetachedQuery tdq = new TestDetachedQuery(); tdq.SetLockMode("LM1", LockMode.Read); @@ -195,9 +200,9 @@ tdq.SetDateTime("6", DateTime.MinValue); // will be override tdq.SetDouble("8", 8.1f); tdq.SetEntity("9", new Foo("Fulano", "De Tal")); - tdq.SetParameterList("UntypedList", new int[] {5, 6, 7, 8}); // will be override - tdq.SetParameterList("TypedList", new Int64[] {5, 6, 7, 8}, NHibernateUtil.Int64); // will be override - + tdq.SetParameterList("UntypedList", new int[] { 5, 6, 7, 8 }); // will be override + tdq.SetParameterList("TypedList", new Int64[] { 5, 6, 7, 8 }, NHibernateUtil.Int64); // will be override + tdq.SetComment("other comment"); // will be override origin.CopyTo(tdq); Assert.AreEqual(5, tdq.Selection.FirstRow); @@ -207,6 +212,7 @@ Assert.AreEqual(FlushMode.Auto, tdq.FlushMode); Assert.AreEqual("A_REGION", tdq.CacheRegion); Assert.IsNotNull(tdq.ResultTransformer); + Assert.That(tdq.Comment, Is.EqualTo(MyComment)); // merge/override of LockModes Assert.AreEqual(2, tdq.LockModes.Count); @@ -235,7 +241,7 @@ Assert.IsTrue(tdq.NamedParams["6"].Value.Equals(DateTime.MaxValue)); Assert.IsTrue(tdq.NamedParams["7"].Type.Equals(NHibernateUtil.Decimal)); Assert.IsTrue(tdq.NamedParams["8"].Type.Equals(NHibernateUtil.Double)); - Assert.IsTrue(tdq.NamedParams["9"].Type.Equals(NHibernateUtil.Entity(typeof (Foo)))); + Assert.IsTrue(tdq.NamedParams["9"].Type.Equals(NHibernateUtil.Entity(typeof(Foo)))); // merge/override named parameters list int expected = 1; @@ -349,7 +355,7 @@ // With UnTyped Parameter List dq = new DetachedQuery("from Foo f where f.IntValue in (:pn)"); - dq.SetParameterList("pn", new int[] {2 ,3}); + dq.SetParameterList("pn", new int[] { 2, 3 }); using (ISession s = OpenSession()) { IQuery q = dq.GetExecutableQuery(s); @@ -454,10 +460,10 @@ Console.WriteLine("DetachedQueryCycle={0} QueryCycl={1} Diff={2}", sDQStop - sDQStart, sQStop - sQStart, - (sDQStop - sDQStart) - (sQStop - sQStart)); + (sDQStop - sDQStart) - (sQStop - sQStart)); } - private class TestDetachedQuery:AbstractDetachedQuery + private class TestDetachedQuery : AbstractDetachedQuery { public Dictionary<int, object> PosUntypeParams { @@ -548,6 +554,11 @@ { (this as IDetachedQueryImplementor).OverrideInfoFrom(origin); } + + public string Comment + { + get { return comment; } + } } } @@ -593,7 +604,7 @@ } public Foo(string name, string description, int intValue) - :this(name,description) + : this(name, description) { this.intValue = intValue; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-17 14:24:56
|
Revision: 4183 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4183&view=rev Author: fabiomaulo Date: 2009-04-17 14:24:40 +0000 (Fri, 17 Apr 2009) Log Message: ----------- Fix NH-1736 and some related issues (as the one in SessionFactoryHelper) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs trunk/nhibernate/src/NHibernate/Util/StringHelper.cs trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -11,6 +11,17 @@ { public static IQueryable FindQueryableUsingImports(ISessionFactoryImplementor sfi, string className) { + // NH : short cut + if(string.IsNullOrEmpty(className)) + { + return null; + } + + if(!char.IsLetter(className[0]) && !className[0].Equals('_')) + { + return null; + } + // NH : this method prevent unrecognized class when entityName != class.FullName // this is a patch for the TODO below var possibleResult = sfi.TryGetEntityPersister(GetEntityName(className)) as IQueryable; Modified: trunk/nhibernate/src/NHibernate/Util/StringHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -235,7 +235,7 @@ /// <returns></returns> public static string GetFullClassname(string typeName) { - return new TypeNameParser().ParseTypeName(typeName, null, null).Type; + return new TypeNameParser(null, null).ParseTypeName(typeName).Type; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -1,193 +1,230 @@ using System; +using System.Collections.Generic; using System.Diagnostics; -using System.IO; using System.Text; namespace NHibernate.Util { public class ParserException : ApplicationException { - public ParserException(string message) : base(message) {} + public ParserException(string message) : base(message) { } } public class TypeNameParser { - private TextReader input; + private readonly string defaultNamespace; + private readonly string defaultAssembly; - private void SkipSpaces() + public TypeNameParser(string defaultNamespace, string defaultAssembly) { - while (input.Peek() == ' ') - { - input.Read(); - } + this.defaultNamespace = defaultNamespace; + this.defaultAssembly = defaultAssembly; } - private char[] Characters(int count) + public static AssemblyQualifiedTypeName Parse(string type) { - var chars = new char[count]; - if (input.ReadBlock(chars, 0, count) < count) - { - throw new ParserException(count + " characters expected"); - } + return Parse(type, null, null); + } - return chars; + public static AssemblyQualifiedTypeName Parse(string type, string defaultNamespace, string defaultAssembly) + { + return new TypeNameParser(defaultNamespace, defaultAssembly).ParseTypeName(type); } - private char[] PossiblyEscapedCharacter() + public AssemblyQualifiedTypeName ParseTypeName(string type) { - if (input.Peek() == '\\') + if (type == null) { - return Characters(2); + throw new ArgumentNullException("type"); } - else + if (type.Trim('[',']','\\', ',') == string.Empty) { - return Characters(1); + throw new ArgumentException(string.Format("The type to parse is not a type name:{0}", type), "type"); } - } - private string AssemblyName() - { - var result = new StringBuilder(); - SkipSpaces(); + int genericTypeArgsStartIdx = type.IndexOf('['); + int genericTypeArgsEndIdx = type.LastIndexOf(']'); + int genericTypeCardinalityIdx = -1; + if (genericTypeArgsStartIdx >= 0) + { + genericTypeCardinalityIdx = type.IndexOf('`', 0, genericTypeArgsStartIdx); + } - int code; - while ((code = input.Peek()) != -1) + if (genericTypeArgsStartIdx == -1 || genericTypeCardinalityIdx == -1) { - var ch = (char) code; + return ParseNonGenericType(type); + } + else + { + var isArrayType = type.EndsWith("[]"); + if(genericTypeCardinalityIdx < 0) + { + throw new ParserException("Invalid generic fully-qualified type name:" + type); + } + string cardinalityString = type.Substring(genericTypeCardinalityIdx + 1, genericTypeArgsStartIdx - genericTypeCardinalityIdx - 1); + int genericTypeCardinality = int.Parse(cardinalityString); - if (ch == ']') + // get the FullName of the non-generic type + string fullName = type.Substring(0, genericTypeArgsStartIdx); + if (type.Length - genericTypeArgsEndIdx - 1 > 0) + fullName += type.Substring(genericTypeArgsEndIdx + 1, type.Length - genericTypeArgsEndIdx - 1); + + // parse the type arguments + var genericTypeArgs = new List<AssemblyQualifiedTypeName>(); + string typeArguments = type.Substring(genericTypeArgsStartIdx + 1, genericTypeArgsEndIdx - genericTypeArgsStartIdx - 1); + foreach (string item in GenericTypesArguments(typeArguments, genericTypeCardinality)) { - break; + var typeArgument = ParseTypeName(item); + genericTypeArgs.Add(typeArgument); } - result.Append(PossiblyEscapedCharacter()); + // construct the generic type definition + return MakeGenericType(ParseNonGenericType(fullName), isArrayType, genericTypeArgs.ToArray()); } - - return result.ToString(); } - private string BracketedPart(string defaultNamespace, string defaultAssembly) + public AssemblyQualifiedTypeName MakeGenericType(AssemblyQualifiedTypeName qualifiedName, bool isArrayType, + AssemblyQualifiedTypeName[] typeArguments) { - Debug.Assert(input.Peek() == '['); + Debug.Assert(typeArguments.Length > 0); - var result = new StringBuilder(); - var genericTypeName = new StringBuilder(200); - - int depth = 0; - do + var baseType = qualifiedName.Type; + var sb = new StringBuilder(typeArguments.Length * 200); + sb.Append(baseType); + sb.Append('['); + for (int i = 0; i < typeArguments.Length; i++) { - int c = input.Peek(); - if (c == '[') + if(i>0) { - depth++; - result.Append(PossiblyEscapedCharacter()); + sb.Append(","); } - else if (c == ']') - { - depth--; - if (genericTypeName.Length > 0) - { - var r = Parse(genericTypeName.ToString(), defaultNamespace, defaultAssembly); - result.Append(r.ToString()); - genericTypeName.Remove(0, genericTypeName.Length); - } - result.Append(PossiblyEscapedCharacter()); - } - else if (c == ',' || c == ' ') - { - if (genericTypeName.Length > 0) - genericTypeName.Append(PossiblyEscapedCharacter()); - else - result.Append(PossiblyEscapedCharacter()); - } - else - { - genericTypeName.Append(PossiblyEscapedCharacter()); - } + sb.Append('[').Append(typeArguments[i].ToString()).Append(']'); } - while (depth > 0 && input.Peek() != -1); - - if (depth > 0 && input.Peek() == -1) + sb.Append(']'); + if(isArrayType) { - throw new ParserException("Unmatched left bracket ('[')"); + sb.Append("[]"); } - - return result.ToString(); + return new AssemblyQualifiedTypeName(sb.ToString(), qualifiedName.Assembly); } - public AssemblyQualifiedTypeName ParseTypeName(string text, string defaultNamespace, string defaultAssembly) + private static IEnumerable<string> GenericTypesArguments(string s, int cardinality) { - text = text.Trim(); - if (IsSystemType(text)) - { - defaultNamespace = null; - defaultAssembly = null; - } - var type = new StringBuilder(text.Length); - string assembly = StringHelper.IsEmpty(defaultAssembly) ? null : defaultAssembly; + Debug.Assert(cardinality != 0); + Debug.Assert(string.IsNullOrEmpty(s) == false); + Debug.Assert(s.Length > 0); - try + int startIndex = 0; + while (cardinality > 0) { - bool seenNamespace = false; + var sb = new StringBuilder(s.Length); + int bracketCount = 0; - using (input = new StringReader(text)) + for (int i = startIndex; i < s.Length; i++) { - int code; - while ((code = input.Peek()) != -1) + switch (s[i]) { - var ch = (char) code; + case '[': + bracketCount++; + continue; - if (ch == '.') - { - seenNamespace = true; - } - - if (ch == ',') - { - input.Read(); - assembly = AssemblyName(); - if (input.Peek() != -1) + case ']': + if (--bracketCount == 0) { - throw new ParserException("Extra characters found at the end of the type name"); + string item = s.Substring(startIndex + 1, i - startIndex - 1); + yield return item; + sb = new StringBuilder(s.Length); + startIndex = i + 2; // 2 = '[' + ']' } - } - else if (ch == '[') - { - type.Append(BracketedPart(defaultNamespace, defaultAssembly)); - } - else - { - type.Append(PossiblyEscapedCharacter()); - } + break; + + default: + sb.Append(s[i]); + continue; } + } - input.Close(); + if (bracketCount != 0) + { + throw new ParserException(string.Format("The brackets are unbalanced in the type name: {0}", s)); } - if (!seenNamespace && StringHelper.IsNotEmpty(defaultNamespace)) + if (sb.Length > 0) { - type.Insert(0, '.').Insert(0, defaultNamespace); + var result = sb.ToString(); + startIndex += result.Length; + yield return result.TrimStart(' ', ','); } - return new AssemblyQualifiedTypeName(type.ToString(), assembly); + cardinality--; } - catch (Exception e) + } + + private AssemblyQualifiedTypeName ParseNonGenericType(string typeName) + { + string typeFullName; + string assembliQualifiedName; + + if (NeedDefaultAssembly(typeName)) { - throw new ArgumentException("Invalid fully-qualified type name: " + text, "text", e); + assembliQualifiedName = defaultAssembly; + typeFullName = typeName; } + else + { + int assemblyFullNameIdx = FindAssemblyQualifiedNameStartIndex(typeName); + if (assemblyFullNameIdx > 0) + { + assembliQualifiedName = + typeName.Substring(assemblyFullNameIdx + 1, typeName.Length - assemblyFullNameIdx - 1).Trim(); + typeFullName = typeName.Substring(0, assemblyFullNameIdx).Trim(); + } + else + { + assembliQualifiedName = null; + typeFullName = typeName.Trim(); + } + } + + if (NeedDefaultNamespace(typeFullName) && !string.IsNullOrEmpty(defaultNamespace)) + { + typeFullName = string.Concat(defaultNamespace, ".", typeFullName); + } + + return new AssemblyQualifiedTypeName(typeFullName, assembliQualifiedName); } - private bool IsSystemType(string tyname) + private static int FindAssemblyQualifiedNameStartIndex(string typeName) { - return tyname.StartsWith("System."); // ugly + for (int i = 0; i < typeName.Length; i++) + { + if(typeName[i] == ',' && typeName[i-1] != '\\') + { + return i; + } + } + + return -1; } - public static AssemblyQualifiedTypeName Parse(string text) + private static bool NeedDefaultNamespaceOrDefaultAssembly(string typeFullName) { - return Parse(text, null, null); + return !typeFullName.StartsWith("System."); // ugly } - public static AssemblyQualifiedTypeName Parse(string text, string defaultNamespace, string defaultAssembly) + private static bool NeedDefaultNamespace(string typeFullName) { - return new TypeNameParser().ParseTypeName(text, defaultNamespace, defaultAssembly); + if (!NeedDefaultNamespaceOrDefaultAssembly(typeFullName)) + { + return false; + } + int assemblyFullNameIndex = typeFullName.IndexOf(','); + int firstDotIndex = typeFullName.IndexOf('.'); + // does not have a dot or the dot is part of AssemblyFullName + return firstDotIndex < 0 || (firstDotIndex > assemblyFullNameIndex && assemblyFullNameIndex > 0); } + + private static bool NeedDefaultAssembly(string typeFullName) + { + return NeedDefaultNamespaceOrDefaultAssembly(typeFullName) && typeFullName.IndexOf(',') < 0; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -37,7 +37,7 @@ string expected = typeof (IDictionary<int, string>).FullName; Assert.AreEqual(expected, StringHelper.GetFullClassname(typeName)); typeName = "some.namespace.SomeType`1[[System.Int32, mscorlib], System.Int32], some.assembly"; - expected = "some.namespace.SomeType`1[[System.Int32, mscorlib], System.Int32]"; + expected = "some.namespace.SomeType`1[[System.Int32, mscorlib],[System.Int32]]"; Assert.AreEqual(expected, StringHelper.GetFullClassname(typeName)); } @@ -107,7 +107,7 @@ public void GetClassnameFromGenericType() { const string typeName = "classname`1[innerns1.innerClass]"; - const string expected = "classname`1[innerns1.innerClass]"; + const string expected = "classname`1[[innerns1.innerClass]]"; Assert.AreEqual(expected, StringHelper.GetClassname(typeName)); } @@ -116,7 +116,7 @@ public void GetClassnameFromGenericFQClass() { const string typeName = "ns1.ns2.classname`1[innerns1.innerClass]"; - const string expected = "classname`1[innerns1.innerClass]"; + const string expected = "classname`1[[innerns1.innerClass]]"; Assert.AreEqual(expected, StringHelper.GetClassname(typeName)); } Modified: trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -1,13 +1,14 @@ using System; using NHibernate.Util; using NUnit.Framework; +using System.Collections.Generic; namespace NHibernate.Test.UtilityTest { [TestFixture] public class TypeNameParserFixture { - private void CheckInput(string input, string expectedType, string expectedAssembly) + private static void CheckInput(string input, string expectedType, string expectedAssembly) { AssemblyQualifiedTypeName tn = TypeNameParser.Parse(input); Assert.AreEqual(expectedType, tn.Type, "Type name should match"); @@ -35,31 +36,33 @@ [Test] public void ParseFullAssemblyName() { - string assemblyName = "SomeAssembly, SomeCulture, SomethingElse"; + const string assemblyName = "SomeAssembly, SomeCulture, SomethingElse"; CheckInput("SomeType, " + assemblyName, "SomeType", assemblyName); } [Test] public void ParseGenericTypeName() { - string assemblyName = "SomeAssembly"; - string typeName = "SomeType`1[System.Int32]"; + const string assemblyName = "SomeAssembly"; + const string typeName = "SomeType`1[System.Int32]"; + const string expectedTypeName = "SomeType`1[[System.Int32]]"; - CheckInput(typeName + ", " + assemblyName, typeName, assemblyName); + CheckInput(typeName + ", " + assemblyName, expectedTypeName, assemblyName); } [Test] public void ParseComplexGenericTypeName() { - string typeName = "SomeType`1[[System.Int32, mscorlib], System.Int32]"; + const string typeName = "SomeType`2[[System.Int32, mscorlib], System.Int32]"; + const string expectedTypeName = "SomeType`2[[System.Int32, mscorlib],[System.Int32]]"; - CheckInput(typeName, typeName, null); + CheckInput(typeName, expectedTypeName, null); } - [Test, ExpectedException(typeof(ArgumentException))] + [Test, Ignore("Not a big problem because the next type request will throw the exception"), ExpectedException(typeof(ParserException))] public void ParseUnmatchedBracket() { - TypeNameParser.Parse("SomeName["); + TypeNameParser.Parse("SomeName["); } [Test] @@ -71,7 +74,7 @@ [Test] public void ParseWithDefaultAssemblyUnused() { - string defaultAssembly = "DefaultAssembly"; + const string defaultAssembly = "DefaultAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType, AnotherAssembly", null, defaultAssembly); Assert.AreEqual("SomeType", tn.Type); Assert.AreEqual("AnotherAssembly", tn.Assembly); @@ -80,7 +83,7 @@ [Test] public void ParseWithDefaultAssembly() { - string defaultAssembly = "SomeAssembly"; + const string defaultAssembly = "SomeAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType", null, defaultAssembly); Assert.AreEqual("SomeType", tn.Type); Assert.AreEqual(defaultAssembly, tn.Assembly); @@ -89,8 +92,8 @@ [Test] public void ParseWithDefaultNamespaceAndAssembly() { - string defaultAssembly = "DefaultAssembly"; - string defaultNamespace = "DefaultNamespace"; + const string defaultAssembly = "DefaultAssembly"; + const string defaultNamespace = "DefaultNamespace"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType", defaultNamespace, defaultAssembly); Assert.AreEqual("DefaultNamespace.SomeType", tn.Type); @@ -99,7 +102,7 @@ [Test] public void ParseWithDefaultNamespaceNoAssembly() { - string defaultNamespace = "DefaultNamespace"; + const string defaultNamespace = "DefaultNamespace"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType", defaultNamespace, null); Assert.AreEqual("DefaultNamespace.SomeType", tn.Type); @@ -109,8 +112,8 @@ [Test] public void ParseWithDefaultNamespaceUnused() { - string defaultAssembly = "DefaultAssembly"; - string defaultNamespace = "DefaultNamespace"; + const string defaultAssembly = "DefaultAssembly"; + const string defaultNamespace = "DefaultNamespace"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeNamespace.SomeType", defaultNamespace, defaultAssembly); Assert.AreEqual("SomeNamespace.SomeType", tn.Type); @@ -134,7 +137,7 @@ string fullSpec = "TName`1[PartialName]"; string defaultassembly = "SomeAssembly"; string defaultNamespace = "SomeAssembly.MyNS"; - string expectedType = "SomeAssembly.MyNS.TName`1[SomeAssembly.MyNS.PartialName, SomeAssembly]"; + string expectedType = "SomeAssembly.MyNS.TName`1[[SomeAssembly.MyNS.PartialName, SomeAssembly]]"; string expectedAssembly = "SomeAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); @@ -167,7 +170,7 @@ string fullSpec = "TName`1[SomeAssembly.MyOtherNS.PartialName]"; string defaultassembly = "SomeAssembly"; string defaultNamespace = "SomeAssembly.MyNS"; - string expectedType = "SomeAssembly.MyNS.TName`1[SomeAssembly.MyOtherNS.PartialName, SomeAssembly]"; + string expectedType = "SomeAssembly.MyNS.TName`1[[SomeAssembly.MyOtherNS.PartialName, SomeAssembly]]"; string expectedAssembly = "SomeAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); @@ -177,7 +180,7 @@ fullSpec = "SomeType`1[System.Int32]"; defaultassembly = "SomeAssembly"; defaultNamespace = null; - expectedType = "SomeType`1[System.Int32]"; + expectedType = "SomeType`1[[System.Int32]]"; expectedAssembly = "SomeAssembly"; tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); @@ -196,5 +199,57 @@ { } + + public class MyComplexClass<T1, T2, T3> + { + + } + + [Test] + public void ParseComplexGenericType() + { + var expectedType = typeof(MyComplexClass<MyGClass<int>, IDictionary<string, MyGClass<string>>, string>).AssemblyQualifiedName; + var a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString(), "Type name should match"); + } + + [Test] + [Description("Should parse arrays of System types")] + public void SystemArray() + { + var expectedType = typeof(string[]).AssemblyQualifiedName; + var a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + } + + [Test] + [Description("Should parse arrays of custom types")] + public void CustomArray() + { + var expectedType = "A[]"; + var a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + + expectedType = typeof(MyGClass<int>[]).FullName; + a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + + expectedType = typeof(MyGClass<int[]>[]).FullName; + a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + + expectedType = "MyGClass`1[[System.Int32[]]][]"; + a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + } + + [Test] + public void NH1736() + { + var typeName = + "Test.NHMapping.CustomCollection`2[[Test.Common.InvoiceDetail, Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872],[Test.ReadOnlyBusinessObjectList`1[[Test.Common.InvoiceDetail, Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872]], Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872]], Test.NHMapping, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872"; + var a = TypeNameParser.Parse(typeName); + Assert.AreEqual(typeName, a.ToString()); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-18 00:30:04
|
Revision: 4186 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4186&view=rev Author: fabiomaulo Date: 2009-04-18 00:30:01 +0000 (Sat, 18 Apr 2009) Log Message: ----------- - Fix NH-1745 - by default we are using format_sql=true in ours tests Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Cfg/Settings.cs trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs trunk/nhibernate/src/NHibernate.Test/App.config trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/AdoNet/Util/ trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Pretty/ Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,6 +1,5 @@ using System; using System.Data; -using System.Text; using Iesi.Collections.Generic; using log4net; using NHibernate.Driver; @@ -9,6 +8,7 @@ using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Util; +using NHibernate.AdoNet.Util; namespace NHibernate.AdoNet { @@ -18,7 +18,6 @@ public abstract class AbstractBatcher : IBatcher { protected static readonly ILog log = LogManager.GetLogger(typeof(AbstractBatcher)); - protected static readonly ILog logSql = LogManager.GetLogger("NHibernate.SQL"); private static int openCommandCount; private static int openReaderCount; @@ -421,50 +420,9 @@ protected void LogCommand(IDbCommand command) { - if (logSql.IsDebugEnabled || factory.Settings.IsShowSqlEnabled) - { - string outputText = GetCommandLogString(command); - logSql.Debug(outputText); - - if (factory.Settings.IsShowSqlEnabled) - { - Console.Out.Write("NHibernate: "); - Console.Out.WriteLine(outputText); - } - } + factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); } - protected string GetCommandLogString(IDbCommand command) - { - string outputText; - - if (command.Parameters.Count == 0) - { - outputText = command.CommandText; - } - else - { - StringBuilder output = new StringBuilder(); - output.Append(command.CommandText); - output.Append("; "); - - IDataParameter p; - int count = command.Parameters.Count; - for (int i = 0; i < count; i++) - { - p = (IDataParameter) command.Parameters[i]; - output.Append(string.Format("{0} = '{1}'", p.ParameterName, p.Value)); - - if (i + 1 < count) - { - output.Append(", "); - } - } - outputText = output.ToString(); - } - return outputText; - } - private void LogOpenPreparedCommand() { if (log.IsDebugEnabled) Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,5 +1,6 @@ using System.Data; using System.Text; +using NHibernate.AdoNet.Util; namespace NHibernate.AdoNet { @@ -31,9 +32,11 @@ totalExpectedRowsAffected += expectation.ExpectedRowCount; log.Debug("Adding to batch:"); IDbCommand batchUpdate = CurrentCommand; - string commandLoggedText = GetCommandLogString(batchUpdate); - currentBatchCommandsLog.Append("Batch command: "). - AppendLine(commandLoggedText); + if (log.IsDebugEnabled) + { + string commandLoggedText = Factory.Settings.SqlStatementLogger.LogCommand(batchUpdate, FormatStyle.Basic); + currentBatchCommandsLog.Append("Batch command: ").AppendLine(commandLoggedText); + } currentBatch.Append((System.Data.SqlClient.SqlCommand) batchUpdate); if (currentBatch.CountOfCommands >= batchSize) { @@ -47,7 +50,7 @@ CheckReaders(); Prepare(currentBatch.BatchCommand); - logSql.Debug(currentBatchCommandsLog.ToString()); + Factory.Settings.SqlStatementLogger.LogInfo(currentBatchCommandsLog.ToString()); currentBatchCommandsLog = new StringBuilder(); int rowsAffected = currentBatch.ExecuteNonQuery(); Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,435 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Iesi.Collections.Generic; +using NHibernate.Util; + +namespace NHibernate.AdoNet.Util +{ + public class BasicFormatter : IFormatter + { + protected const string IndentString = " "; + protected const string Initial = "\n "; + protected static readonly HashedSet<string> beginClauses = new HashedSet<string>(); + protected static readonly HashedSet<string> dml = new HashedSet<string>(); + protected static readonly HashedSet<string> endClauses = new HashedSet<string>(); + protected static readonly HashedSet<string> logical = new HashedSet<string>(); + protected static readonly HashedSet<string> misc = new HashedSet<string>(); + protected static readonly HashedSet<string> quantifiers = new HashedSet<string>(); + + static BasicFormatter() + { + beginClauses.Add("left"); + beginClauses.Add("right"); + beginClauses.Add("inner"); + beginClauses.Add("outer"); + beginClauses.Add("group"); + beginClauses.Add("order"); + + endClauses.Add("where"); + endClauses.Add("set"); + endClauses.Add("having"); + endClauses.Add("join"); + endClauses.Add("from"); + endClauses.Add("by"); + endClauses.Add("join"); + endClauses.Add("into"); + endClauses.Add("union"); + + logical.Add("and"); + logical.Add("or"); + logical.Add("when"); + logical.Add("else"); + logical.Add("end"); + + quantifiers.Add("in"); + quantifiers.Add("all"); + quantifiers.Add("exists"); + quantifiers.Add("some"); + quantifiers.Add("any"); + + dml.Add("insert"); + dml.Add("update"); + dml.Add("delete"); + + misc.Add("select"); + misc.Add("on"); + } + + #region IFormatter Members + + public virtual string Format(string source) + { + return new FormatProcess(source).Perform(); + } + + #endregion + + #region Nested type: FormatProcess + + private class FormatProcess + { + private readonly List<bool> afterByOrFromOrSelects = new List<bool>(); + private readonly List<int> parenCounts = new List<int>(); + private readonly StringBuilder result = new StringBuilder(); + private readonly IEnumerator<string> tokens; + private bool afterBeginBeforeEnd; + private bool afterBetween; + private bool afterByOrSetOrFromOrSelect; + private bool afterInsert; + private bool afterOn; + private bool beginLine = true; + + private int indent = 1; + private int inFunction; + + private string lastToken; + private string lcToken; + private int parensSinceSelect; + private string token; + + public FormatProcess(string sql) + { + // TODO : some delimiter may depend from a specific Dialect/Drive (as ';' to separate multi query) + tokens = new StringTokenizer(sql, "()+*/-=<>'`\"[],;" + StringHelper.WhiteSpace, true).GetEnumerator(); + } + + public string Perform() + { + result.Append(Initial); + + while (tokens.MoveNext()) + { + token = tokens.Current; + lcToken = token.ToLowerInvariant(); + + if ("'".Equals(token)) + { + ExtractStringEnclosedBy("'"); + } + else if ("\"".Equals(token)) + { + ExtractStringEnclosedBy("\""); + } + + if(IsMultiQueryDelimiter(token)) + { + StartingNewQuery(); + } + else if (afterByOrSetOrFromOrSelect && ",".Equals(token)) + { + CommaAfterByOrFromOrSelect(); + } + else if (afterOn && ",".Equals(token)) + { + CommaAfterOn(); + } + else if ("(".Equals(token)) + { + OpenParen(); + } + else if (")".Equals(token)) + { + CloseParen(); + } + else if (beginClauses.Contains(lcToken)) + { + BeginNewClause(); + } + else if (endClauses.Contains(lcToken)) + { + EndNewClause(); + } + else if ("select".Equals(lcToken)) + { + Select(); + } + else if (dml.Contains(lcToken)) + { + UpdateOrInsertOrDelete(); + } + else if ("values".Equals(lcToken)) + { + Values(); + } + else if ("on".Equals(lcToken)) + { + On(); + } + else if (afterBetween && lcToken.Equals("and")) + { + Misc(); + afterBetween = false; + } + else if (logical.Contains(lcToken)) + { + Logical(); + } + else if (IsWhitespace(token)) + { + White(); + } + else + { + Misc(); + } + + if (!IsWhitespace(token)) + { + lastToken = lcToken; + } + } + return result.ToString(); + } + + private void StartingNewQuery() + { + Out(); + indent = 1; + Newline(); + } + + private bool IsMultiQueryDelimiter(string delimiter) + { + return ";".Equals(delimiter); + } + + private void ExtractStringEnclosedBy(string stringDelimiter) + { + while (tokens.MoveNext()) + { + string t = tokens.Current; + token += t; + if (stringDelimiter.Equals(t)) + { + break; + } + } + } + + private void CommaAfterOn() + { + Out(); + indent--; + Newline(); + afterOn = false; + afterByOrSetOrFromOrSelect = true; + } + + private void CommaAfterByOrFromOrSelect() + { + Out(); + Newline(); + } + + private void Logical() + { + if ("end".Equals(lcToken)) + { + indent--; + } + Newline(); + Out(); + beginLine = false; + } + + private void On() + { + indent++; + afterOn = true; + Newline(); + Out(); + beginLine = false; + } + + private void Misc() + { + Out(); + if ("between".Equals(lcToken)) + { + afterBetween = true; + } + if (afterInsert) + { + Newline(); + afterInsert = false; + } + else + { + beginLine = false; + if ("case".Equals(lcToken)) + { + indent++; + } + } + } + + private void White() + { + if (!beginLine) + { + result.Append(" "); + } + } + + private void UpdateOrInsertOrDelete() + { + Out(); + indent++; + beginLine = false; + if ("update".Equals(lcToken)) + { + Newline(); + } + if ("insert".Equals(lcToken)) + { + afterInsert = true; + } + } + + private void Select() + { + Out(); + indent++; + Newline(); + parenCounts.Insert(parenCounts.Count, parensSinceSelect); + afterByOrFromOrSelects.Insert(afterByOrFromOrSelects.Count, afterByOrSetOrFromOrSelect); + parensSinceSelect = 0; + afterByOrSetOrFromOrSelect = true; + } + + private void Out() + { + result.Append(token); + } + + private void EndNewClause() + { + if (!afterBeginBeforeEnd) + { + indent--; + if (afterOn) + { + indent--; + afterOn = false; + } + Newline(); + } + Out(); + if (!"union".Equals(lcToken)) + { + indent++; + } + Newline(); + afterBeginBeforeEnd = false; + afterByOrSetOrFromOrSelect = "by".Equals(lcToken) || "set".Equals(lcToken) || "from".Equals(lcToken); + } + + private void BeginNewClause() + { + if (!afterBeginBeforeEnd) + { + if (afterOn) + { + indent--; + afterOn = false; + } + indent--; + Newline(); + } + Out(); + beginLine = false; + afterBeginBeforeEnd = true; + } + + private void Values() + { + indent--; + Newline(); + Out(); + indent++; + Newline(); + } + + private void CloseParen() + { + parensSinceSelect--; + if (parensSinceSelect < 0) + { + indent--; + int tempObject = parenCounts[parenCounts.Count - 1]; + parenCounts.RemoveAt(parenCounts.Count - 1); + parensSinceSelect = tempObject; + + bool tempObject2 = afterByOrFromOrSelects[afterByOrFromOrSelects.Count - 1]; + afterByOrFromOrSelects.RemoveAt(afterByOrFromOrSelects.Count - 1); + afterByOrSetOrFromOrSelect = tempObject2; + } + if (inFunction > 0) + { + inFunction--; + Out(); + } + else + { + if (!afterByOrSetOrFromOrSelect) + { + indent--; + Newline(); + } + Out(); + } + beginLine = false; + } + + private void OpenParen() + { + if (IsFunctionName(lastToken) || inFunction > 0) + { + inFunction++; + } + beginLine = false; + if (inFunction > 0) + { + Out(); + } + else + { + Out(); + if (!afterByOrSetOrFromOrSelect) + { + indent++; + Newline(); + beginLine = true; + } + } + parensSinceSelect++; + } + + private static bool IsFunctionName(string tok) + { + char begin = tok[0]; + bool isIdentifier = (char.IsLetter(begin) || begin.CompareTo('$') == 0 || begin.CompareTo('_') == 0) || '"' == begin; + return isIdentifier && !logical.Contains(tok) && !endClauses.Contains(tok) && !quantifiers.Contains(tok) + && !dml.Contains(tok) && !misc.Contains(tok); + } + + private static bool IsWhitespace(string token) + { + return StringHelper.WhiteSpace.IndexOf(token) >= 0; + } + + private void Newline() + { + result.Append("\n"); + for (int i = 0; i < indent; i++) + { + result.Append(IndentString); + } + beginLine = true; + } + } + + #endregion + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs (from rev 4185, trunk/nhibernate/src/NHibernate/Pretty/DdlFormatter.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,150 @@ +using System.Collections.Generic; +using System.Text; +using NHibernate.Util; + +namespace NHibernate.AdoNet.Util +{ + public class DdlFormatter: IFormatter + { + private const string Indent1 = "\n "; + private const string Indent2 = "\n "; + private const string Indent3 = "\n "; + + /// <summary> Format an SQL statement using simple rules: + /// a) Insert newline after each comma; + /// b) Indent three spaces after each inserted newline; + /// If the statement contains single/double quotes return unchanged, + /// it is too complex and could be broken by simple formatting. + /// </summary> + public virtual string Format(string sql) + { + if (sql.ToLowerInvariant().StartsWith("create table")) + { + return FormatCreateTable(sql); + } + else if (sql.ToLowerInvariant().StartsWith("alter table")) + { + return FormatAlterTable(sql); + } + else if (sql.ToLowerInvariant().StartsWith("comment on")) + { + return FormatCommentOn(sql); + } + else + { + return Indent1 + sql; + } + } + + protected virtual string FormatCommentOn(string sql) + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, " '[]\"", true)).GetEnumerator(); + + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + result.Append(token); + if (IsQuote(token)) + { + quoted = !quoted; + } + else if (!quoted) + { + if ("is".Equals(token)) + { + result.Append(Indent2); + } + } + } + + return result.ToString(); + } + + protected virtual string FormatAlterTable(string sql) + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, " (,)'[]\"", true)).GetEnumerator(); + + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + if (IsQuote(token)) + { + quoted = !quoted; + } + else if (!quoted) + { + if (IsBreak(token)) + { + result.Append(Indent3); + } + } + result.Append(token); + } + + return result.ToString(); + } + + protected virtual string FormatCreateTable(string sql) + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, "(,)'[]\"", true)).GetEnumerator(); + + int depth = 0; + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + if (IsQuote(token)) + { + quoted = !quoted; + result.Append(token); + } + else if (quoted) + { + result.Append(token); + } + else + { + if (")".Equals(token)) + { + depth--; + if (depth == 0) + { + result.Append(Indent1); + } + } + result.Append(token); + if (",".Equals(token) && depth == 1) + { + result.Append(Indent2); + } + if ("(".Equals(token)) + { + depth++; + if (depth == 1) + { + result.Append(Indent3); + } + } + } + } + + return result.ToString(); + } + + private static bool IsBreak(string token) + { + return "drop".Equals(token) || "add".Equals(token) || "references".Equals(token) || "foreign".Equals(token) + || "on".Equals(token); + } + + private static bool IsQuote(string token) + { + return "\"".Equals(token) || "`".Equals(token) || "]".Equals(token) || "[".Equals(token) || "'".Equals(token); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,59 @@ +namespace NHibernate.AdoNet.Util +{ + /// <summary> Represents the the understood types or styles of formatting. </summary> + public class FormatStyle + { + public static readonly FormatStyle Basic = new FormatStyle("basic", new BasicFormatter()); + public static readonly FormatStyle Ddl = new FormatStyle("ddl", new DdlFormatter()); + public static readonly FormatStyle None = new FormatStyle("none", new NoFormatImpl()); + + private FormatStyle(string name, IFormatter formatter) + { + Name = name; + Formatter = formatter; + } + + public string Name { get; private set; } + + public IFormatter Formatter { get; private set; } + + public override bool Equals(object obj) + { + return Equals(obj as FormatStyle); + } + + public bool Equals(FormatStyle other) + { + if (other == null) + { + return false; + } + if (ReferenceEquals(this, other)) + { + return true; + } + return Equals(other.Name, Name); + } + + public override int GetHashCode() + { + return (Name != null ? Name.GetHashCode() : 0); + } + + #region Nested type: NoFormatImpl + + private class NoFormatImpl : IFormatter + { + #region IFormatter Members + + public string Format(string source) + { + return source; + } + + #endregion + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,7 @@ +namespace NHibernate.AdoNet.Util +{ + public interface IFormatter + { + string Format(string source); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,108 @@ +using System; +using System.Data; +using System.Text; +using log4net; + +namespace NHibernate.AdoNet.Util +{ + /// <summary> Centralize logging handling for SQL statements. </summary> + public class SqlStatementLogger + { + private static readonly ILog log = LogManager.GetLogger("NHibernate.SQL"); + + /// <summary> Constructs a new SqlStatementLogger instance.</summary> + public SqlStatementLogger() : this(false, false) {} + + /// <summary> Constructs a new SqlStatementLogger instance. </summary> + /// <param name="logToStdout">Should we log to STDOUT in addition to our internal logger. </param> + /// <param name="formatSql">Should we format SQL ('prettify') prior to logging. </param> + public SqlStatementLogger(bool logToStdout, bool formatSql) + { + LogToStdout = logToStdout; + FormatSql = formatSql; + } + + public bool LogToStdout { get; set; } + + public bool FormatSql { get; set; } + + /// <summary> Log a SQL statement string. </summary> + /// <param name="statement">The SQL statement. </param> + /// <param name="style">The requested formatting style. </param> + public virtual void LogStatement(string statement, FormatStyle style) + { + if (!log.IsDebugEnabled && !LogToStdout) + { + return; + } + style = DetermineActualStyle(style); + statement = style.Formatter.Format(statement); + log.Debug(statement); + if (LogToStdout) + { + Console.Out.WriteLine("NHibernate: " + statement); + } + } + + public virtual void LogInfo(string info) + { + log.Debug(info); + } + + /// <summary> Log a IDbCommand. </summary> + /// <param name="command">The SQL statement. </param> + /// <param name="style">The requested formatting style. </param> + public virtual string LogCommand(IDbCommand command, FormatStyle style) + { + if (log.IsDebugEnabled || LogToStdout) + { + style = DetermineActualStyle(style); + string statement = style.Formatter.Format(GetCommandLineWithParameters(command)); + log.Debug(statement); + if (LogToStdout) + { + Console.Out.WriteLine("NHibernate: " + statement); + } + return statement; + } + return null; + } + + protected string GetCommandLineWithParameters(IDbCommand command) + { + string outputText; + + if (command.Parameters.Count == 0) + { + outputText = command.CommandText; + } + else + { + var output = new StringBuilder(command.CommandText.Length + (command.Parameters.Count * 20)); + output.Append(command.CommandText); + output.Append("; "); + + IDataParameter p; + int count = command.Parameters.Count; + bool appendComma = false; + for (int i = 0; i < count; i++) + { + if (appendComma) + { + output.Append(", "); + } + appendComma = true; + p = (IDataParameter)command.Parameters[i]; + output.Append(string.Format("{0} = '{1}'", p.ParameterName, p.Value)); + } + outputText = output.ToString(); + } + return outputText; + } + + private FormatStyle DetermineActualStyle(FormatStyle style) + { + return FormatSql ? style : FormatStyle.None; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1530,7 +1530,11 @@ //protected Settings BuildSettings() private Settings BuildSettings() { - return settingsFactory.BuildSettings(properties); + var result = settingsFactory.BuildSettings(properties); + // NH : Set configuration for IdGenerator SQL logging + PersistentIdGeneratorParmsNames.SqlStatementLogger.FormatSql = result.SqlStatementLogger.FormatSql; + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogToStdout = result.SqlStatementLogger.LogToStdout; + return result; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Cfg/Settings.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Settings.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Cfg/Settings.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Data; using NHibernate.AdoNet; +using NHibernate.AdoNet.Util; using NHibernate.Cache; using NHibernate.Connection; using NHibernate.Exceptions; @@ -14,7 +15,11 @@ /// </summary> public sealed class Settings { - private int maximumFetchDepth = -1; + public Settings() + { + MaximumFetchDepth = -1; + } + // not ported - private TransactionManagerLookup transactionManagerLookup; // not ported - private bool strictJPAQLCompliance; @@ -24,17 +29,10 @@ //private bool isJdbcBatchVersionedData; #endregion + public SqlStatementLogger SqlStatementLogger { get; internal set; } - public bool IsShowSqlEnabled { get; internal set; } + public int MaximumFetchDepth { get; internal set; } - public bool IsFormatSqlEnabled { get; internal set; } - - public int MaximumFetchDepth - { - get { return maximumFetchDepth; } - internal set { maximumFetchDepth = value; } - } - public IDictionary<string, string> QuerySubstitutions { get; internal set; } public Dialect.Dialect Dialect { get; internal set; } Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -4,6 +4,7 @@ using System.Data; using log4net; using NHibernate.AdoNet; +using NHibernate.AdoNet.Util; using NHibernate.Cache; using NHibernate.Connection; using NHibernate.Dialect; @@ -118,6 +119,7 @@ { log.Info("echoing all SQL to stdout"); } + bool formatSql = PropertiesHelper.GetBoolean(Environment.FormatSql, properties); bool useStatistics = PropertiesHelper.GetBoolean(Environment.GenerateStatistics, properties); log.Info("Statistics: " + EnabledDisabled(useStatistics)); @@ -232,7 +234,8 @@ // Not ported - settings.StatementFetchSize = statementFetchSize; // Not ported - ScrollableResultSetsEnabled // Not ported - GetGeneratedKeysEnabled - settings.IsShowSqlEnabled = showSql; + settings.SqlStatementLogger = new SqlStatementLogger(showSql, formatSql); + settings.ConnectionProvider = connectionProvider; settings.QuerySubstitutions = querySubstitutions; settings.TransactionFactory = transactionFactory; Modified: trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,9 +1,15 @@ using System; +using NHibernate.AdoNet.Util; namespace NHibernate.Id { public struct PersistentIdGeneratorParmsNames { + static PersistentIdGeneratorParmsNames() + { + SqlStatementLogger = new SqlStatementLogger(false, false); + } + /// <summary> The configuration parameter holding the schema name</summary> public readonly static string Schema = "schema"; @@ -27,6 +33,8 @@ /// <summary> The configuration parameter holding the catalog name</summary> public readonly static string Catalog = "catalog"; + + public readonly static SqlStatementLogger SqlStatementLogger; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -14,6 +14,7 @@ namespace NHibernate.Id { using System.Transactions; + using NHibernate.AdoNet.Util; /// <summary> /// An <see cref="IIdentifierGenerator" /> that uses a database table to store the last @@ -196,9 +197,10 @@ qps.CommandText = query; qps.CommandType = CommandType.Text; qps.Transaction = trans; + log.Debug(string.Format("Reading high value:")); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(qps, FormatStyle.Basic); try { - log.Debug(string.Format("Reading high value:{0}", qps.CommandText)); rs = qps.ExecuteReader(); if (!rs.Read()) { @@ -224,16 +226,17 @@ session.Factory.ConnectionProvider.Driver.GenerateCommand(CommandType.Text, updateSql, parameterTypes); ups.Connection = conn; ups.Transaction = trans; + log.Debug(string.Format("Updating high value:")); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(ups, FormatStyle.Basic); try { columnType.Set(ups, result + 1, 0); columnType.Set(ups, result, 1); - log.Debug(string.Format("Updating high value:{0}", ups.CommandText)); rows = ups.ExecuteNonQuery(); } - // TODO: change to SqlException + // TODO: change to SqlException catch (Exception e) { log.Error("could not update hi value in: " + tableName, e); Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-18 00:30:01 UTC (rev 4186) @@ -443,6 +443,10 @@ <Compile Include="AdoNet\ResultSetWrapper.cs" /> <Compile Include="AdoNet\SqlClientBatchingBatcherFactory.cs" /> <Compile Include="AdoNet\TooManyRowsAffectedException.cs" /> + <Compile Include="AdoNet\Util\BasicFormatter.cs" /> + <Compile Include="AdoNet\Util\FormatStyle.cs" /> + <Compile Include="AdoNet\Util\IFormatter.cs" /> + <Compile Include="AdoNet\Util\SqlStatementLogger.cs" /> <Compile Include="Bytecode\HibernateByteCodeException.cs" /> <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> @@ -479,7 +483,7 @@ <Compile Include="Impl\FutureQueryBatch.cs" /> <Compile Include="Impl\FutureCriteriaBatch.cs" /> <Compile Include="Impl\FutureValue.cs" /> - <Compile Include="Pretty\DdlFormatter.cs" /> + <Compile Include="AdoNet\Util\DdlFormatter.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> <Compile Include="Bytecode\IAccessOptimizer.cs" /> Modified: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -3,9 +3,9 @@ using System.Data; using System.IO; using log4net; +using NHibernate.AdoNet.Util; using NHibernate.Cfg; using NHibernate.Connection; -using NHibernate.Pretty; using NHibernate.Util; using Environment=NHibernate.Cfg.Environment; @@ -27,7 +27,7 @@ private readonly string[] dropSQL; private string delimiter; private string outputFile; - private readonly bool format; + private readonly IFormatter formatter; /// <summary> /// Create a schema exported for a given Configuration @@ -47,7 +47,7 @@ dialect = Dialect.Dialect.GetDialect(configProperties); dropSQL = cfg.GenerateDropSchemaScript(dialect); createSQL = cfg.GenerateSchemaCreationScript(dialect); - format = PropertiesHelper.GetBoolean(Environment.FormatSql, configProperties, true); + formatter = (PropertiesHelper.GetBoolean(Environment.FormatSql, configProperties, true) ? FormatStyle.Ddl : FormatStyle.None).Formatter; } /// <summary> @@ -110,7 +110,7 @@ { try { - string formatted = Format(sql); + string formatted = formatter.Format(sql); if (delimiter != null) { @@ -303,15 +303,5 @@ } } } - - /// <summary> - /// Format an SQL statement. - /// </summary> - /// <param name="sql">The string containing the sql to format.</param> - /// <returns>A string that contains formatted sql.</returns> - private string Format(string sql) - { - return format ? new DdlFormatter(sql).Format() : sql; - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -5,6 +5,8 @@ using log4net; using NHibernate.Cfg; using NHibernate.Util; +using Environment=NHibernate.Cfg.Environment; +using NHibernate.AdoNet.Util; namespace NHibernate.Tool.hbm2ddl { @@ -15,20 +17,22 @@ private readonly IConnectionHelper connectionHelper; private readonly Dialect.Dialect dialect; private readonly List<Exception> exceptions; + private IFormatter formatter; public SchemaUpdate(Configuration cfg) : this(cfg, cfg.Properties) {} - public SchemaUpdate(Configuration cfg, IDictionary<string, string> connectionProperties) + public SchemaUpdate(Configuration cfg, IDictionary<string, string> configProperties) { configuration = cfg; - dialect = Dialect.Dialect.GetDialect(connectionProperties); + dialect = Dialect.Dialect.GetDialect(configProperties); var props = new Dictionary<string, string>(dialect.DefaultProperties); - foreach (var prop in connectionProperties) + foreach (var prop in configProperties) { props[prop.Key] = prop.Value; } connectionHelper = new ManagedProviderConnectionHelper(props); exceptions = new List<Exception>(); + formatter = (PropertiesHelper.GetBoolean(Environment.FormatSql, configProperties, true) ? FormatStyle.Ddl : FormatStyle.None).Formatter; } public SchemaUpdate(Configuration cfg, Settings settings) @@ -37,6 +41,7 @@ dialect = settings.Dialect; connectionHelper = new SuppliedConnectionProviderConnectionHelper(settings.ConnectionProvider); exceptions = new List<Exception>(); + formatter = (settings.SqlStatementLogger.FormatSql ? FormatStyle.Ddl : FormatStyle.None).Formatter; } /// <summary> @@ -162,11 +167,13 @@ for (int j = 0; j < createSQL.Length; j++) { string sql = createSQL[j]; + string formatted = formatter.Format(sql); + try { if (scriptAction != null) { - scriptAction(sql); + scriptAction(formatted); } if (doUpdate) { Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-18 00:30:01 UTC (rev 4186) @@ -53,6 +53,7 @@ Use the member names - not the values. --> <property name="connection.isolation">ReadCommitted</property> + <property name="format_sql">true</property> <!-- This is the System.Data.dll provider for MSSQL Server --> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> Modified: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,3 +1,4 @@ +using NHibernate.Cfg; using NUnit.Framework; namespace NHibernate.Test.SqlTest.Identity @@ -9,6 +10,12 @@ get { return "NHibernate.Test"; } } + protected override void Configure(NHibernate.Cfg.Configuration configuration) + { + base.Configure(configuration); + configuration.SetProperty(Environment.FormatSql, "false"); + } + protected abstract string GetExpectedInsertOrgLogStatement(string orgName); /// <summary> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-18 03:25:25
|
Revision: 4187 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4187&view=rev Author: fabiomaulo Date: 2009-04-18 03:25:17 +0000 (Sat, 18 Apr 2009) Log Message: ----------- Minor adjustments of SQL log Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs trunk/nhibernate/src/NHibernate.Test/App.config Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 03:25:17 UTC (rev 4187) @@ -45,7 +45,7 @@ /// </summary> /// <param name="connectionManager">The <see cref="ConnectionManager"/> owning this batcher.</param> /// <param name="interceptor"></param> - public AbstractBatcher(ConnectionManager connectionManager, IInterceptor interceptor) + protected AbstractBatcher(ConnectionManager connectionManager, IInterceptor interceptor) { this.connectionManager = connectionManager; this.interceptor = interceptor; @@ -420,7 +420,10 @@ protected void LogCommand(IDbCommand command) { - factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); + if (!string.IsNullOrEmpty(command.CommandText)) + { + factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); + } } private void LogOpenPreparedCommand() Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-18 03:25:17 UTC (rev 4187) @@ -12,13 +12,17 @@ private int batchSize; private int totalExpectedRowsAffected; private SqlClientSqlCommandSet currentBatch; - private StringBuilder currentBatchCommandsLog = new StringBuilder(); + private StringBuilder currentBatchCommandsLog; public SqlClientBatchingBatcher(ConnectionManager connectionManager, IInterceptor interceptor) : base(connectionManager, interceptor) { batchSize = Factory.Settings.AdoBatchSize; currentBatch = new SqlClientSqlCommandSet(); + if(log.IsDebugEnabled) + { + currentBatchCommandsLog = new StringBuilder(); + } } public override int BatchSize @@ -30,13 +34,24 @@ public override void AddToBatch(IExpectation expectation) { totalExpectedRowsAffected += expectation.ExpectedRowCount; - log.Debug("Adding to batch:"); IDbCommand batchUpdate = CurrentCommand; if (log.IsDebugEnabled) { - string commandLoggedText = Factory.Settings.SqlStatementLogger.LogCommand(batchUpdate, FormatStyle.Basic); - currentBatchCommandsLog.Append("Batch command: ").AppendLine(commandLoggedText); + 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); + } + currentBatchCommandsLog.Append("Batch command: ").AppendLine(lineWithParameters); } + else + { + Factory.Settings.SqlStatementLogger.LogCommand(batchUpdate, FormatStyle.Basic); + } currentBatch.Append((System.Data.SqlClient.SqlCommand) batchUpdate); if (currentBatch.CountOfCommands >= batchSize) { @@ -49,9 +64,11 @@ log.Debug("Executing batch"); CheckReaders(); Prepare(currentBatch.BatchCommand); - - Factory.Settings.SqlStatementLogger.LogInfo(currentBatchCommandsLog.ToString()); - currentBatchCommandsLog = new StringBuilder(); + if (log.IsDebugEnabled) + { + log.Debug(currentBatchCommandsLog.ToString()); + currentBatchCommandsLog = new StringBuilder(); + } int rowsAffected = currentBatch.ExecuteNonQuery(); Expectations.VerifyOutcomeBatched(totalExpectedRowsAffected, rowsAffected); Modified: trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-04-18 03:25:17 UTC (rev 4187) @@ -26,49 +26,49 @@ public bool FormatSql { get; set; } - /// <summary> Log a SQL statement string. </summary> - /// <param name="statement">The SQL statement. </param> + public bool IsDebugEnabled + { + get { return log.IsDebugEnabled; } + } + + /// <summary> Log a IDbCommand. </summary> + /// <param name="message">Title</param> + /// <param name="command">The SQL statement. </param> /// <param name="style">The requested formatting style. </param> - public virtual void LogStatement(string statement, FormatStyle style) + public virtual void LogCommand(string message, IDbCommand command, FormatStyle style) { - if (!log.IsDebugEnabled && !LogToStdout) + if (!log.IsDebugEnabled && !LogToStdout || string.IsNullOrEmpty(command.CommandText)) { return; } + style = DetermineActualStyle(style); - statement = style.Formatter.Format(statement); - log.Debug(statement); + string statement = style.Formatter.Format(GetCommandLineWithParameters(command)); + string logMessage; + if (string.IsNullOrEmpty(message)) + { + logMessage= statement; + } + else + { + logMessage= message + statement; + } + log.Debug(logMessage); if (LogToStdout) { Console.Out.WriteLine("NHibernate: " + statement); } } - public virtual void LogInfo(string info) - { - log.Debug(info); - } - /// <summary> Log a IDbCommand. </summary> /// <param name="command">The SQL statement. </param> /// <param name="style">The requested formatting style. </param> - public virtual string LogCommand(IDbCommand command, FormatStyle style) + public virtual void LogCommand(IDbCommand command, FormatStyle style) { - if (log.IsDebugEnabled || LogToStdout) - { - style = DetermineActualStyle(style); - string statement = style.Formatter.Format(GetCommandLineWithParameters(command)); - log.Debug(statement); - if (LogToStdout) - { - Console.Out.WriteLine("NHibernate: " + statement); - } - return statement; - } - return null; + LogCommand(null, command, style); } - protected string GetCommandLineWithParameters(IDbCommand command) + public string GetCommandLineWithParameters(IDbCommand command) { string outputText; @@ -79,8 +79,8 @@ else { var output = new StringBuilder(command.CommandText.Length + (command.Parameters.Count * 20)); - output.Append(command.CommandText); - output.Append("; "); + output.Append(command.CommandText.TrimEnd(' ',';','\n')); + output.Append(";"); IDataParameter p; int count = command.Parameters.Count; @@ -93,13 +93,32 @@ } appendComma = true; p = (IDataParameter)command.Parameters[i]; - output.Append(string.Format("{0} = '{1}'", p.ParameterName, p.Value)); + output.Append(string.Format("{0} = {1}", p.ParameterName, GetParameterLogableValue(p))); } outputText = output.ToString(); } return outputText; } + public string GetParameterLogableValue(IDataParameter parameter) + { + if(parameter.Value == null || DBNull.Value.Equals(parameter.Value)) + { + return "null"; + } + else if (IsStringType(parameter.DbType)) + { + return string.Concat("'", parameter.Value.ToString(), "'"); + } + return parameter.Value.ToString(); + } + + private static bool IsStringType(DbType dbType) + { + return DbType.String.Equals(dbType) || DbType.AnsiString.Equals(dbType) + || DbType.AnsiStringFixedLength.Equals(dbType) || DbType.StringFixedLength.Equals(dbType); + } + private FormatStyle DetermineActualStyle(FormatStyle style) { return FormatSql ? style : FormatStyle.None; Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-18 03:25:17 UTC (rev 4187) @@ -125,6 +125,10 @@ <logger name="NHibernate.SQL"> <level value="OFF" /> </logger> + + <logger name="NHibernate.AdoNet.AbstractBatcher"> + <level value="OFF" /> + </logger> <logger name="NHibernate.Tool.hbm2ddl.SchemaExport"> <level value="ERROR" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-18 03:42:55
|
Revision: 4188 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4188&view=rev Author: fabiomaulo Date: 2009-04-18 03:42:49 +0000 (Sat, 18 Apr 2009) Log Message: ----------- Sorry... test broken Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 03:25:17 UTC (rev 4187) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 03:42:49 UTC (rev 4188) @@ -420,10 +420,7 @@ protected void LogCommand(IDbCommand command) { - if (!string.IsNullOrEmpty(command.CommandText)) - { - factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); - } + factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); } private void LogOpenPreparedCommand() Modified: trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-18 03:25:17 UTC (rev 4187) +++ trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-18 03:42:49 UTC (rev 4188) @@ -197,8 +197,7 @@ qps.CommandText = query; qps.CommandType = CommandType.Text; qps.Transaction = trans; - log.Debug(string.Format("Reading high value:")); - PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(qps, FormatStyle.Basic); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Reading high value:", qps, FormatStyle.Basic); try { rs = qps.ExecuteReader(); @@ -226,8 +225,7 @@ session.Factory.ConnectionProvider.Driver.GenerateCommand(CommandType.Text, updateSql, parameterTypes); ups.Connection = conn; ups.Transaction = trans; - log.Debug(string.Format("Updating high value:")); - PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(ups, FormatStyle.Basic); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Updating high value:", ups, FormatStyle.Basic); try { Modified: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs 2009-04-18 03:25:17 UTC (rev 4187) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs 2009-04-18 03:42:49 UTC (rev 4188) @@ -14,7 +14,7 @@ protected override string GetExpectedInsertOrgLogStatement(string orgName) { - return string.Format("exec nh_organization_native_id_insert @p0; @p0 = '{0}'", orgName); + return string.Format("exec nh_organization_native_id_insert @p0;@p0 = '{0}'", orgName); } protected override IList Mappings This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-18 14:16:03
|
Revision: 4189 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4189&view=rev Author: davybrion Date: 2009-04-18 14:15:48 +0000 (Sat, 18 Apr 2009) Log Message: ----------- applying (updated) patch from James Lanng for NH-1670 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/IMultiCriteria.cs trunk/nhibernate/src/NHibernate/IMultiQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs Modified: trunk/nhibernate/src/NHibernate/IMultiCriteria.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IMultiCriteria.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/IMultiCriteria.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -10,11 +10,49 @@ public interface IMultiCriteria { /// <summary> - /// Get all the + /// Get all the results /// </summary> IList List(); /// <summary> + /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="resultGenericListType">Return results in a <see cref="System.Collections.Generic.List{resultGenericListType}"/></param> + /// <param name="criteria">The criteria.</param> + /// <returns></returns> + IMultiCriteria Add(System.Type resultGenericListType, ICriteria criteria); + + /// <summary> + /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="criteria">The criteria.</param> + /// <returns></returns> + IMultiCriteria Add<T>(ICriteria criteria); + + /// <summary> + /// Adds the specified criteria to the query, and associates it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key">The key</param> + /// <param name="criteria">The criteria</param> + /// <returns></returns> + IMultiCriteria Add<T>(string key, ICriteria criteria); + + /// <summary> + /// Adds the specified detached criteria. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="detachedCriteria">The detached criteria.</param> + /// <returns></returns> + IMultiCriteria Add<T>(DetachedCriteria detachedCriteria); + + /// <summary> + /// Adds the specified detached criteria, and associates it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key">The key</param> + /// <param name="detachedCriteria">The detached criteria</param> + /// <returns></returns> + IMultiCriteria Add<T>(string key, DetachedCriteria detachedCriteria); + + /// <summary> /// Adds the specified criteria to the query /// </summary> /// <param name="criteria">The criteria.</param> Modified: trunk/nhibernate/src/NHibernate/IMultiQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -11,11 +11,58 @@ public interface IMultiQuery { /// <summary> - /// Get all the + /// Get all the results /// </summary> IList List(); /// <summary> + /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="resultGenericListType">Return results in a <see cref="System.Collections.Generic.List{resultGenericListType}"/></param> + /// <param name="criteria">The criteria.</param> + /// <returns></returns> + IMultiQuery Add(System.Type resultGenericListType, IQuery criteria); + + /// <summary> + /// Add the specified HQL query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + IMultiQuery Add<T>(IQuery query); + + /// <summary> + /// Add the specified HQL query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key"></param> + /// <param name="query"></param> + /// <returns></returns> + IMultiQuery Add<T>(string key, IQuery query); + + /// <summary> + /// Add the specified HQL Query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key"></param> + /// <param name="hql"></param> + /// <returns></returns> + IMultiQuery Add<T>(string key, string hql); + + /// <summary> + /// Add the specified HQL query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + IMultiQuery Add<T>(string hql); + + /// <summary> + /// Add a named query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + IMultiQuery AddNamedQuery<T>(string namedQuery); + + /// <summary> + /// Add a named query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key"></param> + /// <param name="namedKey"></param> + /// <returns></returns> + IMultiQuery AddNamedQuery<T>(string key, string namedKey); + + /// <summary> /// Add the specified HQL query to the multi query, and associate it with the given key /// </summary> /// <param name="key"></param> Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -833,7 +833,7 @@ return List<T>(); } - session.FutureQueryBatch.Add(this); + session.FutureQueryBatch.Add<T>(this); return session.FutureQueryBatch.GetEnumerator<T>(); } @@ -841,10 +841,10 @@ { if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) { - return new FutureValue<T>(List); + return new FutureValue<T>(List<T>); } - session.FutureQueryBatch.Add(this); + session.FutureQueryBatch.Add<T>(this); return session.FutureQueryBatch.GetFutureValue<T>(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -375,25 +375,25 @@ { if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) { - return new FutureValue<T>(List); + return new FutureValue<T>(List<T>); } - session.FutureCriteriaBatch.Add(this); + session.FutureCriteriaBatch.Add<T>(this); return session.FutureCriteriaBatch.GetFutureValue<T>(); } - public IEnumerable<T> Future<T>() - { - if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) - { + public IEnumerable<T> Future<T>() + { + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { return List<T>(); - } + } - session.FutureCriteriaBatch.Add(this); - return session.FutureCriteriaBatch.GetEnumerator<T>(); - } + session.FutureCriteriaBatch.Add<T>(this); + return session.FutureCriteriaBatch.GetEnumerator<T>(); + } - public object UniqueResult() + public object UniqueResult() { return AbstractQueryImpl.UniqueElement(List()); } Modified: trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -5,7 +5,7 @@ { internal class DelayedEnumerator<T> : IEnumerable<T> { - public delegate IList GetResult(); + public delegate IList<T> GetResult(); private readonly GetResult result; Modified: trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -6,6 +6,8 @@ public class FutureCriteriaBatch { private readonly List<ICriteria> criterias = new List<ICriteria>(); + private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + private int index; private IList results; private readonly ISession session; @@ -22,9 +24,9 @@ if (results == null) { var multiCriteria = session.CreateMultiCriteria(); - foreach (var crit in criterias) + for (int i = 0; i < criterias.Count; i++) { - multiCriteria.Add(crit); + multiCriteria.Add(resultCollectionGenericType[i], criterias[i]); } results = multiCriteria.List(); ((SessionImpl)session).FutureCriteriaBatch = null; @@ -33,22 +35,28 @@ } } - public void Add(ICriteria criteria) + public void Add<T>(ICriteria criteria) { criterias.Add(criteria); + resultCollectionGenericType.Add(typeof(T)); index = criterias.Count - 1; } + public void Add(ICriteria criteria) + { + Add<object>(criteria); + } + public IFutureValue<T> GetFutureValue<T>() { int currentIndex = index; - return new FutureValue<T>(() => (IList)Results[currentIndex]); + return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); } public IEnumerable<T> GetEnumerator<T>() { int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList)Results[currentIndex]); + return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); } } } Modified: trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -6,6 +6,8 @@ public class FutureQueryBatch { private readonly List<IQuery> queries = new List<IQuery>(); + private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + private int index; private IList results; private readonly ISession session; @@ -22,33 +24,39 @@ if (results == null) { var multiQuery = session.CreateMultiQuery(); - foreach (var crit in queries) - { - multiQuery.Add(crit); - } - results = multiQuery.List(); + for (int i = 0; i < queries.Count; i++) + { + multiQuery.Add(resultCollectionGenericType[i], queries[i]); + } + results = multiQuery.List(); ((SessionImpl)session).FutureQueryBatch = null; } return results; } } - public void Add(IQuery query) + public void Add<T>(IQuery query) + { + queries.Add(query); + resultCollectionGenericType.Add(typeof(T)); + index = queries.Count - 1; + } + + public void Add(IQuery query) { - queries.Add(query); - index = queries.Count - 1; + Add<object>(query); } public IFutureValue<T> GetFutureValue<T>() { int currentIndex = index; - return new FutureValue<T>(() => (IList)Results[currentIndex]); + return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); } public IEnumerable<T> GetEnumerator<T>() { int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList)Results[currentIndex]); + return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); } } } Modified: trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -1,10 +1,11 @@ using System.Collections; +using System.Collections.Generic; namespace NHibernate.Impl { internal class FutureValue<T> : IFutureValue<T> { - public delegate IList GetResult(); + public delegate IList<T> GetResult(); private readonly GetResult getResult; @@ -24,7 +25,7 @@ return default(T); } - return (T)result[0]; + return result[0]; } } } Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -19,8 +19,9 @@ { public class MultiCriteriaImpl : IMultiCriteria { - private static readonly ILog log = LogManager.GetLogger(typeof(MultiCriteriaImpl)); - private readonly IList<ICriteria> criteriaQueries = new List<ICriteria>(); + private static readonly ILog log = LogManager.GetLogger(typeof(MultiCriteriaImpl)); + private readonly IList<ICriteria> criteriaQueries = new List<ICriteria>(); + private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); private readonly SessionImpl session; private readonly ISessionFactoryImplementor factory; @@ -90,6 +91,7 @@ return criteriaResults; } + private IList ListUsingQueryCache() { IQueryCache queryCache = session.Factory.GetQueryCache(cacheRegion); @@ -202,7 +204,16 @@ hydratedObjects[i] = entitySpan == 0 ? null : new ArrayList(entitySpan); EntityKey[] keys = new EntityKey[entitySpan]; QueryParameters queryParameters = parameters[i]; - IList tmpResults = new ArrayList(); + IList tmpResults; + if (resultCollectionGenericType[i] == typeof(object)) + { + tmpResults = new ArrayList(); + } + else + { + tmpResults = (IList) Activator.CreateInstance(typeof (List<>).MakeGenericType(resultCollectionGenericType[i])); + } + RowSelection selection = parameters[i].RowSelection; createSubselects[i] = loader.IsSubselectLoadingEnabled; subselectResultKeys[i] = createSubselects[i] ? new List<EntityKey[]>() : null; @@ -327,37 +338,73 @@ } return colIndex; } + + public IMultiCriteria Add(System.Type resultGenericListType, ICriteria criteria) + { + criteriaQueries.Add(criteria); + resultCollectionGenericType.Add(resultGenericListType); - public IMultiCriteria Add(ICriteria criteria) + return this; + } + + public IMultiCriteria Add(ICriteria criteria) { + return Add<object>(criteria); + } + + public IMultiCriteria Add(string key, ICriteria criteria) + { + return Add<object>(key, criteria); + } + + public IMultiCriteria Add(DetachedCriteria detachedCriteria) + { + return Add<object>(detachedCriteria); + } + + public IMultiCriteria Add(string key, DetachedCriteria detachedCriteria) + { + return Add<object>(key, detachedCriteria); + } + + public IMultiCriteria Add<T>(ICriteria criteria) + { criteriaQueries.Add(criteria); + resultCollectionGenericType.Add(typeof(T)); + return this; } - public IMultiCriteria Add(string key, ICriteria criteria) + public IMultiCriteria Add<T>(string key, ICriteria criteria) { ThrowIfKeyAlreadyExists(key); criteriaQueries.Add(criteria); criteriaResultPositions.Add(key, criteriaQueries.Count - 1); + resultCollectionGenericType.Add(typeof(T)); + return this; } - public IMultiCriteria Add(DetachedCriteria detachedCriteria) + public IMultiCriteria Add<T>(DetachedCriteria detachedCriteria) { criteriaQueries.Add( detachedCriteria.GetExecutableCriteria(session) ); - return this; - } + resultCollectionGenericType.Add(typeof (T)); - public IMultiCriteria Add(string key, DetachedCriteria detachedCriteria) - { - ThrowIfKeyAlreadyExists(key); - criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session)); - criteriaResultPositions.Add(key, criteriaQueries.Count-1); return this; } + + public IMultiCriteria Add<T>(string key, DetachedCriteria detachedCriteria) + { + ThrowIfKeyAlreadyExists(key); + criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session)); + criteriaResultPositions.Add(key, criteriaQueries.Count - 1); + resultCollectionGenericType.Add(typeof(T)); + return this; + } + public IMultiCriteria SetCacheable(bool cachable) { isCacheable = cachable; Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -22,9 +22,7 @@ private static readonly ILog log = LogManager.GetLogger(typeof(MultiQueryImpl)); private readonly List<IQuery> queries = new List<IQuery>(); - private readonly List<IQueryTranslator> translators = new List<IQueryTranslator>(); - private readonly List<QueryParameters> parameters = new List<QueryParameters>(); - private IList queryResults; + private readonly List<IQueryTranslator> translators = new List<IQueryTranslator>(); private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); private readonly List<QueryParameters> parameters = new List<QueryParameters>(); private IList queryResults; private readonly Dictionary<string, int> criteriaResultPositions = new Dictionary<string, int>(); private string cacheRegion; private int commandTimeout = RowSelection.NoValue; @@ -290,44 +288,80 @@ } return this; } + + public IMultiQuery AddNamedQuery<T>(string key, string namedQuery) + { + ThrowIfKeyAlreadyExists(key); + return Add<T>(key, session.GetNamedQuery(namedQuery)); + } - public IMultiQuery Add(IQuery query) + public IMultiQuery Add(System.Type resultGenericListType, IQuery query) { - AddQueryForLaterExecutionAndReturnIndexOfQuery(query); - return this; - } + AddQueryForLaterExecutionAndReturnIndexOfQuery(resultGenericListType, query); - public IMultiQuery Add(string key, IQuery query) - { - ThrowIfKeyAlreadyExists(key); - criteriaResultPositions.Add(key, AddQueryForLaterExecutionAndReturnIndexOfQuery(query)); return this; } - public IMultiQuery Add(string hql) - { - return Add(((ISession)session).CreateQuery(hql)); - } + public IMultiQuery Add(string key, IQuery query) + { + return Add<object>(key, query); + } - public IMultiQuery Add(string key, string hql) - { - ThrowIfKeyAlreadyExists(key); - return Add(key, ((ISession)session).CreateQuery(hql)); - } + public IMultiQuery Add(IQuery query) + { + return Add<object>(query); + } - public IMultiQuery AddNamedQuery(string namedQuery) - { - return Add(session.GetNamedQuery(namedQuery)); - } + public IMultiQuery Add(string key, string hql) + { + return Add<object>(key, hql); + } + public IMultiQuery Add(string hql) + { + return Add<object>(hql); + } - public IMultiQuery AddNamedQuery(string key, string namedQuery) - { - ThrowIfKeyAlreadyExists(key); - return Add(key, session.GetNamedQuery(namedQuery)); - } + public IMultiQuery AddNamedQuery(string namedQuery) + { + return AddNamedQuery<object>(namedQuery); + } - public IMultiQuery SetCacheable(bool cacheable) + public IMultiQuery AddNamedQuery(string key, string namedQuery) + { + return AddNamedQuery<object>(key, namedQuery); + } + + public IMultiQuery Add<T>(IQuery query) + { + AddQueryForLaterExecutionAndReturnIndexOfQuery(typeof(T), query); + return this; + } + + public IMultiQuery Add<T>(string key, IQuery query) + { + ThrowIfKeyAlreadyExists(key); + criteriaResultPositions.Add(key, AddQueryForLaterExecutionAndReturnIndexOfQuery(typeof(T), query)); + return this; + } + + public IMultiQuery Add<T>(string hql) + { + return Add<T>(((ISession)session).CreateQuery(hql)); + } + + public IMultiQuery Add<T>(string key, string hql) + { + ThrowIfKeyAlreadyExists(key); + return Add<T>(key, ((ISession)session).CreateQuery(hql)); + } + + public IMultiQuery AddNamedQuery<T>(string namedQuery) + { + return Add<T>(session.GetNamedQuery(namedQuery)); + } + + public IMultiQuery SetCacheable(bool cacheable) { isCacheable = cacheable; return this; @@ -455,7 +489,15 @@ { IQueryTranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; - ArrayList tempResults = new ArrayList(); + IList tempResults; + if (resultCollectionGenericType[i] == typeof(object)) + { + tempResults = new ArrayList(); + } + else + { + tempResults = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(resultCollectionGenericType[i])); + } int entitySpan = translator.Loader.EntityPersisters.Length; hydratedObjects[i] = entitySpan > 0 ? new ArrayList() : null; RowSelection selection = parameter.RowSelection; @@ -496,8 +538,9 @@ hydratedObjects[i], keys, false); - tempResults.Add(result); + tempResults.Add(result); + if (createSubselects[i]) { subselectResultKeys[i].Add(keys); @@ -792,11 +835,12 @@ } } - private int AddQueryForLaterExecutionAndReturnIndexOfQuery(IQuery query) + private int AddQueryForLaterExecutionAndReturnIndexOfQuery(System.Type resultGenericListType, IQuery query) { ThrowNotSupportedIfSqlQuery(query); ((AbstractQueryImpl)query).SetIgnoreUknownNamedParameters(true); queries.Add(query); + resultCollectionGenericType.Add(resultGenericListType); return queries.Count - 1; } protected void ThrowNotSupportedIfSqlQuery(IQuery query) Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Reflection; using NHibernate.Cache; using NHibernate.Criterion; @@ -504,5 +505,24 @@ s.Flush(); } } + + [Test] + public void CanGetResultInAGenericList() + { + using (ISession s = OpenSession()) + { + ICriteria getItems = s.CreateCriteria(typeof(Item)); + ICriteria countItems = s.CreateCriteria(typeof(Item)) + .SetProjection(Projections.RowCount()); + + IMultiCriteria multiCriteria = s.CreateMultiCriteria() + .Add(getItems) // we expect a non-generic result from this (ArrayList) + .Add<int>(countItems); // we expect a generic result from this (List<int>) + IList results = multiCriteria.List(); + + Assert.IsInstanceOfType(typeof(ArrayList), results[0]); + Assert.IsInstanceOfType(typeof(List<int>), results[1]); + } + } } } Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -1,4 +1,5 @@ using System.Collections; +using System.Collections.Generic; using System.Reflection; using NHibernate.Cache; using NHibernate.Driver; @@ -484,6 +485,24 @@ RemoveAllItems(); } + [Test] + public void CanGetResultsInAGenericList() + { + using (ISession s = OpenSession()) + { + IQuery getItems = s.CreateQuery("from Item"); + IQuery countItems = s.CreateQuery("select count(*) from Item"); + + IList results = s.CreateMultiQuery() + .Add(getItems) + .Add<long>(countItems) + .List(); + + Assert.IsInstanceOfType(typeof(ArrayList), results[0]); + Assert.IsInstanceOfType(typeof(List<long>), results[1]); + } + } + public class ResultTransformerStub : IResultTransformer { private bool _wasTransformTupleCalled; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-19 15:06:54
|
Revision: 4190 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4190&view=rev Author: davybrion Date: 2009-04-19 15:06:48 +0000 (Sun, 19 Apr 2009) Log Message: ----------- refactored duplicate code from FutureQueryBatch and FutureCriteriaBatch into a new FutureBatch base class Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs Added: trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Impl/FutureBatch.cs 2009-04-19 15:06:48 UTC (rev 4190) @@ -0,0 +1,77 @@ +using System.Collections; +using System.Collections.Generic; + +namespace NHibernate.Impl +{ + public abstract class FutureBatch<TQueryApproach, TMultiApproach> + { + private readonly List<TQueryApproach> queries = new List<TQueryApproach>(); + private readonly IList<System.Type> resultTypes = new List<System.Type>(); + private int index; + private IList results; + + protected readonly SessionImpl session; + + protected FutureBatch(ISession session) + { + this.session = (SessionImpl)session; + } + + public IList Results + { + get + { + if (results == null) + { + GetResults(); + } + return results; + } + } + + public void Add<TResult>(TQueryApproach query) + { + queries.Add(query); + resultTypes.Add(typeof(TResult)); + index = queries.Count - 1; + } + + public void Add(TQueryApproach query) + { + Add<object>(query); + } + + public IFutureValue<TResult> GetFutureValue<TResult>() + { + int currentIndex = index; + return new FutureValue<TResult>(() => GetCurrentResult<TResult>(currentIndex)); + } + + public IEnumerable<TResult> GetEnumerator<TResult>() + { + int currentIndex = index; + return new DelayedEnumerator<TResult>(() => GetCurrentResult<TResult>(currentIndex)); + } + + private void GetResults() + { + var multiApproach = CreateMultiApproach(); + for (int i = 0; i < queries.Count; i++) + { + AddTo(multiApproach, queries[i], resultTypes[i]); + } + results = GetResultsFrom(multiApproach); + ClearCurrentFutureBatch(); + } + + private IList<TResult> GetCurrentResult<TResult>(int currentIndex) + { + return (IList<TResult>)Results[currentIndex]; + } + + protected abstract TMultiApproach CreateMultiApproach(); + protected abstract void AddTo(TMultiApproach multiApproach, TQueryApproach query, System.Type resultType); + protected abstract IList GetResultsFrom(TMultiApproach multiApproach); + protected abstract void ClearCurrentFutureBatch(); + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) +++ trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-19 15:06:48 UTC (rev 4190) @@ -1,62 +1,29 @@ using System.Collections; -using System.Collections.Generic; namespace NHibernate.Impl { - public class FutureCriteriaBatch + public class FutureCriteriaBatch : FutureBatch<ICriteria, IMultiCriteria> { - private readonly List<ICriteria> criterias = new List<ICriteria>(); - private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + public FutureCriteriaBatch(ISession session) : base(session) {} - private int index; - private IList results; - private readonly ISession session; - - public FutureCriteriaBatch(ISession session) + protected override IMultiCriteria CreateMultiApproach() { - this.session = session; + return session.CreateMultiCriteria(); } - public IList Results + protected override void AddTo(IMultiCriteria multiApproach, ICriteria query, System.Type resultType) { - get - { - if (results == null) - { - var multiCriteria = session.CreateMultiCriteria(); - for (int i = 0; i < criterias.Count; i++) - { - multiCriteria.Add(resultCollectionGenericType[i], criterias[i]); - } - results = multiCriteria.List(); - ((SessionImpl)session).FutureCriteriaBatch = null; - } - return results; - } + multiApproach.Add(resultType, query); } - public void Add<T>(ICriteria criteria) + protected override IList GetResultsFrom(IMultiCriteria multiApproach) { - criterias.Add(criteria); - resultCollectionGenericType.Add(typeof(T)); - index = criterias.Count - 1; + return multiApproach.List(); } - public void Add(ICriteria criteria) + protected override void ClearCurrentFutureBatch() { - Add<object>(criteria); + session.FutureCriteriaBatch = null; } - - public IFutureValue<T> GetFutureValue<T>() - { - int currentIndex = index; - return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); - } - - public IEnumerable<T> GetEnumerator<T>() - { - int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); - } } } Modified: trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) +++ trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-19 15:06:48 UTC (rev 4190) @@ -1,62 +1,29 @@ using System.Collections; -using System.Collections.Generic; namespace NHibernate.Impl { - public class FutureQueryBatch + public class FutureQueryBatch : FutureBatch<IQuery, IMultiQuery> { - private readonly List<IQuery> queries = new List<IQuery>(); - private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + public FutureQueryBatch(ISession session) : base(session) {} - private int index; - private IList results; - private readonly ISession session; + protected override IMultiQuery CreateMultiApproach() + { + return session.CreateMultiQuery(); + } - public FutureQueryBatch(ISession session) - { - this.session = session; - } + protected override void AddTo(IMultiQuery multiApproach, IQuery query, System.Type resultType) + { + multiApproach.Add(resultType, query); + } - public IList Results - { - get - { - if (results == null) - { - var multiQuery = session.CreateMultiQuery(); - for (int i = 0; i < queries.Count; i++) - { - multiQuery.Add(resultCollectionGenericType[i], queries[i]); - } - results = multiQuery.List(); - ((SessionImpl)session).FutureQueryBatch = null; - } - return results; - } - } + protected override IList GetResultsFrom(IMultiQuery multiApproach) + { + return multiApproach.List(); + } - public void Add<T>(IQuery query) - { - queries.Add(query); - resultCollectionGenericType.Add(typeof(T)); - index = queries.Count - 1; + protected override void ClearCurrentFutureBatch() + { + session.FutureQueryBatch = null; } - - public void Add(IQuery query) - { - Add<object>(query); - } - - public IFutureValue<T> GetFutureValue<T>() - { - int currentIndex = index; - return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); - } - - public IEnumerable<T> GetEnumerator<T>() - { - int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); - } } } Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-18 14:15:48 UTC (rev 4189) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-19 15:06:48 UTC (rev 4190) @@ -480,6 +480,7 @@ <Compile Include="Id\SequenceIdentityGenerator.cs" /> <Compile Include="IFutureValue.cs" /> <Compile Include="Impl\DelayedEnumerator.cs" /> + <Compile Include="Impl\FutureBatch.cs" /> <Compile Include="Impl\FutureQueryBatch.cs" /> <Compile Include="Impl\FutureCriteriaBatch.cs" /> <Compile Include="Impl\FutureValue.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-21 19:06:56
|
Revision: 4193 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4193&view=rev Author: davybrion Date: 2009-04-21 19:06:39 +0000 (Tue, 21 Apr 2009) Log Message: ----------- made WeakHashtable and WeakRefWrapper serializable (NH-1750) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Util/WeakHashtable.cs trunk/nhibernate/src/NHibernate.Test/UtilityTest/WeakHashtableFixture.cs Modified: trunk/nhibernate/src/NHibernate/Util/WeakHashtable.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/WeakHashtable.cs 2009-04-21 18:47:14 UTC (rev 4192) +++ trunk/nhibernate/src/NHibernate/Util/WeakHashtable.cs 2009-04-21 19:06:39 UTC (rev 4193) @@ -8,6 +8,7 @@ // This class does not inherit from WeakReference but uses composition // instead to avoid requiring UnmanagedCode permission. [DebuggerTypeProxy(typeof(DictionaryProxy))] + [Serializable] public class WeakRefWrapper { private WeakReference reference; @@ -139,6 +140,7 @@ } } + [Serializable] public class WeakHashtable : IDictionary { private Hashtable innerHashtable = new Hashtable(); Modified: trunk/nhibernate/src/NHibernate.Test/UtilityTest/WeakHashtableFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/WeakHashtableFixture.cs 2009-04-21 18:47:14 UTC (rev 4192) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/WeakHashtableFixture.cs 2009-04-21 19:06:39 UTC (rev 4193) @@ -1,5 +1,8 @@ using System; using System.Collections; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + using NHibernate.Util; using NUnit.Framework; @@ -102,5 +105,13 @@ Assert.IsFalse(new WeakRefWrapper(obj).Equals(null)); Assert.IsFalse(new WeakRefWrapper(obj).Equals(10)); } + + [Test] + public void IsSerializable() + { + WeakHashtable weakHashtable = new WeakHashtable(); + weakHashtable.Add("key", new object()); + NHAssert.IsSerializable(weakHashtable); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |