From: <fab...@us...> - 2008-10-09 16:41:58
|
Revision: 3817 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3817&view=rev Author: fabiomaulo Date: 2008-10-09 16:41:52 +0000 (Thu, 09 Oct 2008) Log Message: ----------- Fix NH-1493 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Properties/BackFieldStrategy.cs trunk/nhibernate/src/NHibernate.Test/PropertyTest/BackFieldAccessorFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-10-08 15:16:52 UTC (rev 3816) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-10-09 16:41:52 UTC (rev 3817) @@ -450,6 +450,7 @@ <Compile Include="AdoNet\ResultSetWrapper.cs" /> <Compile Include="AdoNet\SqlClientBatchingBatcherFactory.cs" /> <Compile Include="AdoNet\TooManyRowsAffectedException.cs" /> + <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> <Compile Include="Bytecode\DefaultProxyFactoryFactory.cs" /> <Compile Include="Bytecode\IAccessOptimizer.cs" /> Added: trunk/nhibernate/src/NHibernate/Properties/BackFieldStrategy.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/BackFieldStrategy.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Properties/BackFieldStrategy.cs 2008-10-09 16:41:52 UTC (rev 3817) @@ -0,0 +1,14 @@ +namespace NHibernate.Properties +{ + public class BackFieldStrategy : IFieldNamingStrategy + { + #region Implementation of IFieldNamingStrategy + + public string GetFieldName(string propertyName) + { + return string.Concat("<",propertyName.Trim(),">k__BackingField"); + } + + #endregion + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate/Properties/BackFieldStrategy.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2008-10-08 15:16:52 UTC (rev 3816) +++ trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2008-10-09 16:41:52 UTC (rev 3817) @@ -20,6 +20,7 @@ accessors = new Dictionary<string, IPropertyAccessor>(19); accessors["property"] = new BasicPropertyAccessor(); accessors["field"] = new FieldAccessor(); + accessors["backfield"] = new FieldAccessor(new BackFieldStrategy()); accessors["field.camelcase"] = new FieldAccessor(new CamelCaseStrategy()); accessors["field.camelcase-underscore"] = new FieldAccessor(new CamelCaseUnderscoreStrategy()); accessors["field.lowercase"] = new FieldAccessor(new LowerCaseStrategy()); Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-08 15:16:52 UTC (rev 3816) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-09 16:41:52 UTC (rev 3817) @@ -747,6 +747,7 @@ <Compile Include="PropertyRef\A.cs" /> <Compile Include="PropertyRef\B.cs" /> <Compile Include="PropertyRef\KeyPropertyRefFixture.cs" /> + <Compile Include="PropertyTest\BackFieldAccessorFixture.cs" /> <Compile Include="PropertyTest\BasicSetterExceptionFixture.cs" /> <Compile Include="PropertyTest\FieldAccessorFixture.cs" /> <Compile Include="PropertyTest\FieldCamelCaseFixture.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/PropertyTest/BackFieldAccessorFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/PropertyTest/BackFieldAccessorFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/PropertyTest/BackFieldAccessorFixture.cs 2008-10-09 16:41:52 UTC (rev 3817) @@ -0,0 +1,57 @@ +using NHibernate.Properties; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.PropertyTest +{ + [TestFixture] + public class BackFieldAccessorFixture + { + [Test] + public void GetValue() + { + var accessor = PropertyAccessorFactory.GetPropertyAccessor("backfield"); + var getter = accessor.GetGetter(typeof(MyAutoProp), "AutoProp"); + var rogetter = accessor.GetGetter(typeof(MyAutoProp), "ReadOnlyAutoProp"); + + Assert.That(getter.Get(new MyAutoProp { AutoProp = -1 }), Is.EqualTo(-1)); + Assert.That(getter.Get(new MyAutoProp { AutoProp = 1 }), Is.EqualTo(1)); + + Assert.That(rogetter.Get(new MyAutoProp()), Is.EqualTo(0)); + Assert.That(rogetter.Get(new MyAutoProp(5)), Is.EqualTo(5)); + } + + [Test] + public void SetValue() + { + var accessor = PropertyAccessorFactory.GetPropertyAccessor("backfield"); + var getter = accessor.GetGetter(typeof(MyAutoProp), "AutoProp"); + var setter = accessor.GetSetter(typeof(MyAutoProp), "AutoProp"); + + var rogetter = accessor.GetGetter(typeof(MyAutoProp), "ReadOnlyAutoProp"); + var rosetter = accessor.GetSetter(typeof(MyAutoProp), "ReadOnlyAutoProp"); + + var i = new MyAutoProp { AutoProp = -1 }; + Assert.That(getter.Get(i), Is.EqualTo(-1)); + setter.Set(i, 5); + Assert.That(getter.Get(i), Is.EqualTo(5)); + + Assert.That(rogetter.Get(new MyAutoProp()), Is.EqualTo(0)); + rosetter.Set(i, 123); + Assert.That(rogetter.Get(i), Is.EqualTo(123)); + } + } + + public class MyAutoProp + { + public MyAutoProp() {} + + public MyAutoProp(int readOnlyAutoProp) + { + ReadOnlyAutoProp = readOnlyAutoProp; + } + + public int AutoProp { get; set; } + public int ReadOnlyAutoProp { get; private set; } + } +} \ 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...> - 2008-10-09 18:19:10
|
Revision: 3818 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3818&view=rev Author: fabiomaulo Date: 2008-10-09 18:19:03 +0000 (Thu, 09 Oct 2008) Log Message: ----------- Fix NH-727 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcs.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcsTest.cs Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2008-10-09 16:41:52 UTC (rev 3817) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2008-10-09 18:19:03 UTC (rev 3818) @@ -3300,10 +3300,10 @@ if (IsIdentifierAssignedByInsert) { identityDelegate = ((IPostInsertIdentifierGenerator)IdentifierGenerator).GetInsertGeneratedIdentifierDelegate(this, Factory, UseGetGeneratedKeys()); - SqlCommandInfo defaultInsert = GenerateInsertString(PropertyInsertability, 0); + SqlCommandInfo defaultInsert = GenerateIdentityInsertString(PropertyInsertability); sqlIdentityInsertString = customSQLInsert[0] != null ? new SqlCommandInfo(customSQLInsert[0], defaultInsert.ParameterTypes) - : GenerateIdentityInsertString(PropertyInsertability); + : defaultInsert; } else { Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-09 16:41:52 UTC (rev 3817) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-09 18:19:03 UTC (rev 3818) @@ -804,9 +804,11 @@ <Compile Include="SqlTest\FireBirdTest.cs" /> <Compile Include="SqlTest\GeneralTest.cs" /> <Compile Include="SqlTest\HandSQLTest.cs" /> + <Compile Include="SqlTest\IdentityInsertWithStoredProcsTest.cs" /> <Compile Include="SqlTest\Item.cs" /> <Compile Include="SqlTest\MonetaryAmount.cs" /> <Compile Include="SqlTest\MonetaryAmountUserType.cs" /> + <Compile Include="SqlTest\MSSQLIdentityInsertWithStoredProcsTest.cs" /> <Compile Include="SqlTest\MSSQLTest.cs" /> <Compile Include="SqlTest\NullDateUserType.cs" /> <Compile Include="SqlTest\Order.cs" /> @@ -1485,6 +1487,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="SqlTest\MSSQLIdentityInsertWithStoredProcs.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1508\Mappings.hbm.xml" /> <EmbeddedResource Include="GenericTest\OrderedSetGeneric\OrderedSetFixture.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1293\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs 2008-10-09 18:19:03 UTC (rev 3818) @@ -0,0 +1,68 @@ +using NHibernate.Cfg; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest +{ + public abstract class IdentityInsertWithStoredProcsTest : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected abstract string GetExpectedInsertOrgLogStatement(string orgName); + + /// <summary> + /// Organization should be mappend with "identity" id strategy AND custom sql-insert (a stored proc). + /// The insert stored proc will return the new primary key and NH should recognize it and apply it + /// just like a normal insert. + /// </summary> + [Test] + public void InsertUsesStoredProc() + { + using (var spy = new SqlLogSpy()) + { + Organization ifa; + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + ifa = new Organization("IFA"); + s.Save(ifa); + t.Commit(); + } + + Assert.AreEqual(1, spy.Appender.GetEvents().Length, "Num loggedEvents"); + Assert.AreEqual(1, ifa.Id, "ifa.Id"); + Assert.AreEqual(GetExpectedInsertOrgLogStatement("IFA"), spy.Appender.GetEvents()[0].MessageObject, "Message 1"); + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + s.Delete(ifa); + t.Commit(); + } + } + + using (var spy = new SqlLogSpy()) + { + Organization efa; + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + efa = new Organization("EFA"); + s.Save(efa); + t.Commit(); + } + + Assert.AreEqual(1, spy.Appender.GetEvents().Length, "Num loggedEvents"); + Assert.AreEqual(2, efa.Id, "efa.Id"); + Assert.AreEqual(GetExpectedInsertOrgLogStatement("EFA"), spy.Appender.GetEvents()[0].MessageObject, "Message 2"); + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + s.Delete(efa); + t.Commit(); + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcs.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcs.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcs.hbm.xml 2008-10-09 18:19:03 UTC (rev 3818) @@ -0,0 +1,201 @@ +<?xml version="1.0"?> +<!-- + + This mapping demonstrates the use of Hibernate with + all-handwritten SQL! + + This version is for Sybase/mssql +--> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.SqlTest" + default-access="field.camelcase"> + + <class name="Organization" table="ORGANIZATION"> + <id name="Id" unsaved-value="0" column="ORGID"> + <generator class="identity"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <set name="Employments" + inverse="true" + order-by="DUMMY"> + <key column="EMPLOYER"/> + <!-- only needed for DDL generation --> + <one-to-many class="Employment"/> + <loader query-ref="organizationEmployments"/> + </set> + <!-- query-list name="currentEmployments" + query-ref="organizationCurrentEmployments"--> + <loader query-ref="organization"/> + <sql-insert>exec nh_organization_native_id_insert ?</sql-insert> + <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update> + <sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete> + </class> + + <class name="Person" table="PERSON"> + <id name="Id" unsaved-value="0" column="PERID"> + <generator class="increment"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <loader query-ref="person"/> + <sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert> + <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> + <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> + </class> + + <class name="Employment" table="EMPLOYMENT"> + <id name="employmentId" unsaved-value="0" column="EMPID"> + <generator class="increment"/> + </id> + <many-to-one name="Employee" column="EMPLOYEE" not-null="true" update="false"/> + <many-to-one name="Employer" column="EMPLOYER" not-null="true" update="false"/> + <property name="StartDate" column="STARTDATE" not-null="true" update="false" insert="false"/> + <property name="EndDate" column="ENDDATE" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test"/> + <property name="RegionCode" column="REGIONCODE" update="false"/> + <property name="Salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test"> + <column name="VALUE" sql-type="float"/> + <column name="CURRENCY"/> + </property> + <loader query-ref="employment"/> + <sql-insert> + INSERT INTO EMPLOYMENT + (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) + VALUES (?, ?, getdate(), UPPER(?), ?, ?, ?) + </sql-insert> + <sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> + <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> + </class> + + <resultset name="org-emp-regionCode"> + <return-scalar column="regionCode" type="string"/> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + </resultset> + + <resultset name="org-emp-person"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + <return-join alias="pers" property="emp.Employee"/> + </resultset> + + <sql-query name="person"> + <return alias="p" class="Person" lock-mode="upgrade"/> + SELECT NAME AS {p.Name}, PERID AS {p.Id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/ + </sql-query> + + <sql-query name="organization"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + SELECT {org.*}, {emp.*} + FROM ORGANIZATION org + LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER + WHERE org.ORGID=? + </sql-query> + + + <!--sql-query name="organization"> + <return alias="org" class="Organization"/> + SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION + WHERE ORGID=? + </sql-query--> + + <sql-query name="allOrganizationsWithEmployees" flush-mode="never"> + <return alias="org" class="Organization"/> + SELECT DISTINCT org.NAME AS {org.Name}, org.ORGID AS {org.Id} + FROM ORGANIZATION org + INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID + </sql-query> + + <sql-query name="employment"> + <return alias="emp" class="Employment"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id} + FROM EMPLOYMENT + WHERE EMPID = ? + </sql-query> + + <sql-query name="organizationEmployments"> + <load-collection alias="empcol" role="Organization.Employments"/> + SELECT {empcol.*} + FROM EMPLOYMENT empcol + WHERE EMPLOYER = :id + ORDER BY STARTDATE ASC, EMPLOYEE ASC + </sql-query> + + + <sql-query name="organizationCurrentEmployments"> + <return alias="emp" class="Employment"> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + <!-- Here we are remapping endDate. Notice that we can still use {emp.EndDate} in the SQL. --> + <return-property name="EndDate" column="myEndDate"/> + </return> + <synchronize table="EMPLOYMENT"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id}, VALUE, CURRENCY + FROM EMPLOYMENT + WHERE EMPLOYER = :id AND ENDDATE IS NULL + ORDER BY STARTDATE ASC + </sql-query> + + <sql-query name="simpleScalar"> + <return-scalar column="name" type="string"/> + <return-scalar column="value" type="long"/> + exec simpleScalar :number + </sql-query> + + <sql-query name="paramhandling"> + <return-scalar column="value" type="long"/> + <return-scalar column="value2" type="long"/> + exec paramHandling ?, ? + </sql-query> + + <sql-query name="paramhandling_mixed"> + <return-scalar column="value" type="long" /> + <return-scalar column="value2" type="long" /> + exec paramHandling ?, :second + </sql-query> + + <sql-query name="selectAllEmployments"> + <return class="Employment"> + <return-property name="Employee" column="EMPLOYEE"/> + <return-property name="Employer" column="EMPLOYER"/> + <return-property name="StartDate" column="STARTDATE"/> + <return-property name="EndDate" column="ENDDATE"/> + <return-property name="RegionCode" column="REGIONCODE"/> + <return-property name="id" column="EMPID"/> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + </return> + exec selectAllEmployments + </sql-query> + + <database-object> + <create> + CREATE PROCEDURE nh_organization_native_id_insert + ( + @NAME as varchar + ) + AS + BEGIN + INSERT INTO organization(NAME) VALUES(@NAME) + SELECT SCOPE_IDENTITY() + END + </create> + <drop> + IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'dbo.nh_organization_native_id_insert') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) + DROP PROCEDURE dbo.nh_organization_native_id_insert + </drop> + </database-object> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcsTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcsTest.cs 2008-10-09 18:19:03 UTC (rev 3818) @@ -0,0 +1,25 @@ +using System.Collections; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest +{ + [TestFixture] + public class MSSQLIdentityInsertWithStoredProcsTest : IdentityInsertWithStoredProcsTest + { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect || dialect is MsSql2005Dialect; + } + + protected override string GetExpectedInsertOrgLogStatement(string orgName) + { + return string.Format("exec nh_organization_native_id_insert @p0; @p0 = '{0}'", orgName); + } + + protected override IList Mappings + { + get { return new[] {"SqlTest.MSSQLIdentityInsertWithStoredProcs.hbm.xml"}; } + } + } +} \ 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...> - 2008-10-10 19:19:47
|
Revision: 3835 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3835&view=rev Author: fabiomaulo Date: 2008-10-10 19:19:40 +0000 (Fri, 10 Oct 2008) Log Message: ----------- Few test passed Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/Property.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs trunk/nhibernate/src/NHibernate/Type/NullableType.cs trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Accessors/XmlAccessorFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Properties/XmlAccessor.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/Property.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/Property.cs 2008-10-10 16:29:37 UTC (rev 3834) +++ trunk/nhibernate/src/NHibernate/Mapping/Property.cs 2008-10-10 19:19:40 UTC (rev 3835) @@ -187,6 +187,11 @@ get { return PropertyAccessorFactory.GetPropertyAccessor(PropertyAccessorName); } } + public virtual string GetAccessorPropertyName(EntityMode mode) + { + return mode == EntityMode.Xml ? nodeName : Name; + } + public virtual bool IsBasicPropertyAccessor { // NH Different behavior : see IPropertyAccessor.CanAccessThroughReflectionOptimizer (ref. NH-1304) Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-10-10 16:29:37 UTC (rev 3834) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-10-10 19:19:40 UTC (rev 3835) @@ -1109,6 +1109,7 @@ <SubType>Code</SubType> </Compile> <Compile Include="Util\XmlHelper.cs" /> + <Compile Include="Properties\XmlAccessor.cs" /> <EmbeddedResource Include="nhibernate-configuration.xsd"> <SubType>Designer</SubType> </EmbeddedResource> Modified: trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2008-10-10 16:29:37 UTC (rev 3834) +++ trunk/nhibernate/src/NHibernate/Properties/PropertyAccessorFactory.cs 2008-10-10 19:19:40 UTC (rev 3835) @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using NHibernate.Type; using NHibernate.Util; +using NHibernate.Engine; namespace NHibernate.Properties { @@ -213,11 +215,20 @@ return GetPocoPropertyAccessor(property.PropertyAccessorName); case EntityMode.Map: return DynamicMapPropertyAccessor; + case EntityMode.Xml: + return GetXmlPropertyAccessor(property.GetAccessorPropertyName(modeToUse), property.Type, null); default: throw new MappingException("Unknown entity mode [" + mode + "]"); } } + private static IPropertyAccessor GetXmlPropertyAccessor(string nodeName, IType type, ISessionFactoryImplementor factory) + { + //TODO: need some caching scheme? really comes down to decision + // regarding amount of state (if any) kept on PropertyAccessors + return new XmlAccessor(nodeName, type, factory); + } + private static IPropertyAccessor GetPocoPropertyAccessor(string accessorName) { string accName = string.IsNullOrEmpty(accessorName) ? DefaultAccessorName : accessorName; Added: trunk/nhibernate/src/NHibernate/Properties/XmlAccessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/XmlAccessor.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Properties/XmlAccessor.cs 2008-10-10 19:19:40 UTC (rev 3835) @@ -0,0 +1,425 @@ +using System; +using System.Collections; +using System.Reflection; +using System.Xml; +using NHibernate.Engine; +using NHibernate.Type; + +namespace NHibernate.Properties +{ + /// <summary> + /// Responsible for accessing property values represented as a XmlElement + /// or XmlAttribute. + /// </summary> + public class XmlAccessor : IPropertyAccessor + { + private readonly ISessionFactoryImplementor factory; + private readonly string nodeName; + private readonly IType propertyType; + + public XmlAccessor(string nodeName, IType propertyType, ISessionFactoryImplementor factory) + { + this.factory = factory; + this.nodeName = nodeName; + this.propertyType = propertyType; + } + + #region Implementation of IPropertyAccessor + + public IGetter GetGetter(System.Type theClass, string propertyName) + { + if (nodeName == null) + { + throw new MappingException("no node name for property: " + propertyName); + } + if (".".Equals(nodeName)) + { + return new TextGetter(propertyType, factory); + } + else if (nodeName.IndexOf('/') > -1) + { + return new ElementAttributeGetter(nodeName, propertyType, factory); + } + else if (nodeName.IndexOf('@') > -1) + { + return new AttributeGetter(nodeName, propertyType, factory); + } + else + { + return new ElementGetter(nodeName, propertyType, factory); + } + } + + public ISetter GetSetter(System.Type theClass, string propertyName) + { + if (nodeName == null) + { + throw new MappingException("no node name for property: " + propertyName); + } + if (".".Equals(nodeName)) + { + return new TextSetter(propertyType); + } + else if (nodeName.IndexOf('/') > -1) + { + return new ElementAttributeSetter(nodeName, propertyType); + } + else if (nodeName.IndexOf('@') > -1) + { + return new AttributeSetter(nodeName, propertyType); + } + else + { + return new ElementSetter(nodeName, propertyType); + } + } + + public bool CanAccessThroughReflectionOptimizer + { + get { return true; } + } + + #endregion + + #region Nested type: AttributeGetter + + /// <summary> For nodes like <tt>"@bar"</tt></summary> + [Serializable] + public class AttributeGetter : XmlGetter + { + private readonly string attributeName; + + public AttributeGetter(string name, IType propertyType, ISessionFactoryImplementor factory) + : base(propertyType, factory) + { + attributeName = name.Substring(1); + } + + public override object Get(object owner) + { + var ownerElement = (XmlNode) owner; + XmlNode attribute = ownerElement.Attributes[attributeName]; + return attribute == null ? null : propertyType.FromXMLNode(attribute, factory); + } + } + + #endregion + + #region Nested type: AttributeSetter + + /// <summary> For nodes like <tt>"@bar"</tt></summary> + [Serializable] + public class AttributeSetter : XmlSetter + { + private readonly string attributeName; + + public AttributeSetter(string name, IType propertyType) : base(propertyType) + { + attributeName = name.Substring(1); + } + + public override void Set(object target, object value) + { + var owner = (XmlElement) target; + XmlAttribute attribute = owner.Attributes[attributeName]; + if (value == null) + { + if (attribute != null) + { + owner.Attributes.Remove(attribute); + } + } + else + { + if (attribute == null) + { + owner.SetAttribute(attributeName, "null"); + attribute = owner.Attributes[attributeName]; + } + propertyType.SetToXMLNode(attribute, value, null); + } + } + } + + #endregion + + #region Nested type: ElementAttributeGetter + + /// <summary> For nodes like <tt>"foo/@bar"</tt></summary> + [Serializable] + public class ElementAttributeGetter : XmlGetter + { + private readonly string attributeName; + private readonly string elementName; + + public ElementAttributeGetter(string name, IType propertyType, ISessionFactoryImplementor factory) + : base(propertyType, factory) + { + elementName = name.Substring(0, (name.IndexOf('/'))); + attributeName = name.Substring(name.IndexOf('/') + 2); + } + + public override object Get(object owner) + { + var ownerElement = (XmlNode) owner; + + XmlNode element = ownerElement[elementName]; + + if (element == null) + { + return null; + } + else + { + XmlAttribute attribute = element.Attributes[attributeName]; + if (attribute == null) + { + return null; + } + else + { + return propertyType.FromXMLNode(attribute, factory); + } + } + } + } + + #endregion + + #region Nested type: ElementAttributeSetter + + /// <summary> For nodes like <tt>"foo/@bar"</tt></summary> + [Serializable] + public class ElementAttributeSetter : XmlSetter + { + private readonly string attributeName; + private readonly string elementName; + + public ElementAttributeSetter(string name, IType propertyType) : base(propertyType) + { + elementName = name.Substring(0, name.IndexOf('/')); + attributeName = name.Substring(name.IndexOf('/') + 2); + } + + public override void Set(object target, object value) + { + var owner = (XmlElement) target; + XmlElement element = owner[elementName]; + if (value == null) + { + if (element != null) + { + owner.RemoveChild(element); + } + } + else + { + XmlAttribute attribute; + if (element == null) + { + element = owner.OwnerDocument.CreateElement(elementName); + owner.AppendChild(element); + attribute = null; + } + else + { + attribute = element.Attributes[attributeName]; + } + + if (attribute == null) + { + element.SetAttribute(attributeName, "null"); + attribute = element.Attributes[attributeName]; + } + propertyType.SetToXMLNode(attribute, value, null); + } + } + } + + #endregion + + #region Nested type: ElementGetter + + /// <summary> For nodes like <tt>"foo"</tt></summary> + [Serializable] + public class ElementGetter : XmlGetter + { + private readonly string elementName; + + public ElementGetter(string name, IType propertyType, ISessionFactoryImplementor factory) + : base(propertyType, factory) + { + elementName = name; + } + + public override object Get(object owner) + { + var ownerElement = (XmlNode) owner; + XmlNode element = ownerElement[elementName]; + return element == null ? null : propertyType.FromXMLNode(element, factory); + } + } + + #endregion + + #region Nested type: ElementSetter + + /// <summary> For nodes like <tt>"foo"</tt></summary> + [Serializable] + public class ElementSetter : XmlSetter + { + private readonly string elementName; + + public ElementSetter(string name, IType propertyType) : base(propertyType) + { + elementName = name; + } + + public override void Set(object target, object value) + { + if (value != CollectionType.UnfetchedCollection) + { + var owner = (XmlElement) target; + XmlElement existing = owner[elementName]; + if (existing != null) + { + owner.RemoveChild(existing); + } + if (value != null) + { + XmlElement element = owner.OwnerDocument.CreateElement(elementName); + owner.AppendChild(element); + propertyType.SetToXMLNode(element, value, null); + } + } + } + } + + #endregion + + #region Nested type: TextGetter + + /// <summary> For nodes like <tt>"."</tt></summary> + [Serializable] + public class TextGetter : XmlGetter + { + public TextGetter(IType propertyType, ISessionFactoryImplementor factory) : base(propertyType, factory) {} + + public override object Get(object owner) + { + var ownerElement = (XmlNode) owner; + return propertyType.FromXMLNode(ownerElement, factory); + } + } + + #endregion + + #region Nested type: TextSetter + + /// <summary> For nodes like <tt>"."</tt></summary> + [Serializable] + public class TextSetter : XmlSetter + { + public TextSetter(IType propertyType) : base(propertyType) {} + + public override void Set(object target, object value) + { + var owner = (XmlNode) target; + if (!propertyType.IsXMLElement) + { + //kinda ugly, but needed for collections with a "." node mapping + if (value == null) + { + owner.InnerText = ""; //is this ok? + } + else + { + propertyType.SetToXMLNode(owner, value, null); + } + } + } + } + + #endregion + + #region Nested type: XmlGetter + + /// <summary> Defines the strategy for getting property values out of a dom4j Node.</summary> + [Serializable] + public abstract class XmlGetter : IGetter + { + protected ISessionFactoryImplementor factory; + protected IType propertyType; + + internal XmlGetter(IType propertyType, ISessionFactoryImplementor factory) + { + this.propertyType = propertyType; + this.factory = factory; + } + + #region IGetter Members + + /// <summary> Get the declared type</summary> + public virtual System.Type ReturnType + { + get { return typeof (object); } + } + + /// <summary> Optional operation (return null)</summary> + public virtual string PropertyName + { + get { return null; } + } + + /// <summary> Optional operation (return null)</summary> + public virtual MethodInfo Method + { + get { return null; } + } + + public virtual object GetForInsert(object owner, IDictionary mergeMap, ISessionImplementor session) + { + return Get(owner); + } + + public abstract object Get(object target); + + #endregion + } + + #endregion + + #region Nested type: XmlSetter + + [Serializable] + public abstract class XmlSetter : ISetter + { + protected internal IType propertyType; + + internal XmlSetter(IType propertyType) + { + this.propertyType = propertyType; + } + + #region ISetter Members + + /// <summary> Optional operation (return null)</summary> + public virtual string PropertyName + { + get { return null; } + } + + /// <summary> Optional operation (return null)</summary> + public virtual MethodInfo Method + { + get { return null; } + } + + public abstract void Set(object target, object value); + + #endregion + } + + #endregion + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate/Properties/XmlAccessor.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate/Type/NullableType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/NullableType.cs 2008-10-10 16:29:37 UTC (rev 3834) +++ trunk/nhibernate/src/NHibernate/Type/NullableType.cs 2008-10-10 19:19:40 UTC (rev 3835) @@ -345,12 +345,12 @@ public override object FromXMLNode(XmlNode xml, IMapping factory) { - return FromXMLString(xml.Value, factory); + return FromXMLString(xml.InnerText, factory); } public override void SetToXMLNode(XmlNode xml, object value, ISessionFactoryImplementor factory) { - xml.Value = ToXMLString(value, factory); + xml.InnerText = ToXMLString(value, factory); } public string ToXMLString(object value, ISessionFactoryImplementor pc) Modified: trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Accessors/XmlAccessorFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Accessors/XmlAccessorFixture.cs 2008-10-10 16:29:37 UTC (rev 3834) +++ trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Accessors/XmlAccessorFixture.cs 2008-10-10 19:19:40 UTC (rev 3835) @@ -1,3 +1,4 @@ +using System; using System.Xml; using NHibernate.Mapping; using NHibernate.Properties; @@ -6,7 +7,7 @@ namespace NHibernate.Test.EntityModeTest.Xml.Accessors { - [TestFixture, Ignore("Not supported yet.")] + [TestFixture] public class XmlAccessorFixture { public static XmlElement dom = GenerateTestElement(); @@ -77,6 +78,7 @@ nameSetter.Set(root, "NHForge"); accountIdSetter.Set(root, 456L); + Console.WriteLine(dom.OuterXml); //Assert.That(new NodeComparator().Compare(dom, root) == 0); } @@ -107,7 +109,7 @@ Assert.That(name, Is.EqualTo("NHForge")); } - [Test] + [Test, Ignore("Not supported yet.")] public void StringTextExtraction() { Property property = GenerateTextProperty(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-10-10 21:36:37
|
Revision: 3836 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3836&view=rev Author: fabiomaulo Date: 2008-10-10 21:36:28 +0000 (Fri, 10 Oct 2008) Log Message: ----------- Some changes in binders (walking to xml entitymode) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/Account.hbm.xml trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/XmlFixture.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs 2008-10-10 19:19:40 UTC (rev 3835) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs 2008-10-10 21:36:28 UTC (rev 3836) @@ -141,5 +141,11 @@ { return "false".Equals(xmlNodeValue) || "0".Equals(xmlNodeValue); } + + protected static string GetAttributeValue(XmlNode node, string attributeName) + { + XmlAttribute att = node.Attributes[attributeName]; + return att != null ? att.Value : null; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2008-10-10 19:19:40 UTC (rev 3835) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2008-10-10 21:36:28 UTC (rev 3836) @@ -82,10 +82,11 @@ } else if ("component".Equals(name) || "dynamic-component".Equals(name)) { + string subpath = StringHelper.Qualify(entityName, propertyName); // NH: Modified from H2.1 to allow specifying the type explicitly using class attribute System.Type reflectedClass = GetPropertyType(subnode, model.MappedClass, propertyName); value = new Component(model); - BindComponent(subnode, (Component)value, reflectedClass, entityName, propertyName, true); + BindComponent(subnode, (Component)value, reflectedClass, entityName, propertyName, subpath, true); } else if ("join".Equals(name)) { @@ -124,7 +125,7 @@ if (value != null) { - Property property = CreateProperty(value, propertyName, model.MappedClass, subnode); + Property property = CreateProperty(value, propertyName, model.ClassName, subnode); if (!mutable) property.IsUpdateable = false; if (naturalId) @@ -362,19 +363,13 @@ case "dynamic-component": string subpath = StringHelper.Qualify(path, propertyName); value = new Component(join); - BindComponent( - subnode, - (Component) value, - join.PersistentClass.MappedClass, - propertyName, - subpath, - true); + 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, subnode); + Mapping.Property prop = CreateProperty(value, propertyName, persistentClass.MappedClass.AssemblyQualifiedName, subnode); prop.IsOptional = join.IsOptional; join.AddProperty(prop); } @@ -533,23 +528,27 @@ } protected void BindComponent(XmlNode node, Component model, System.Type reflectedClass, - string className, string path, bool isNullable) + string className, string parentProperty, string path, bool isNullable) { + bool isIdentifierMapper = false; + + model.RoleName = path; + XmlAttribute classNode = node.Attributes["class"]; - if ("dynamic-component".Equals(node.Name)) + if (classNode != null) { - model.IsEmbedded = false; - model.IsDynamic = true; - } - else if (classNode != null) - { model.ComponentClass = ClassForNameChecked( classNode.Value, mappings, "component class not found: {0}"); model.ComponentClassName = FullQualifiedClassName(classNode.Value, mappings); model.IsEmbedded = false; } + else if ("dynamic-component".Equals(node.Name)) + { + model.IsEmbedded = false; + model.IsDynamic = true; + } else if (reflectedClass != null) { model.ComponentClass = reflectedClass; @@ -562,6 +561,9 @@ model.IsEmbedded = true; } + string nodeName = (GetAttributeValue(node, "node") ?? GetAttributeValue(node, "name")) ?? model.Owner.NodeName; + model.NodeName = nodeName; + foreach (XmlNode subnode in node.ChildNodes) { //I am only concerned with elements that are from the nhibernate namespace @@ -612,22 +614,35 @@ : GetPropertyType(subnode, model.ComponentClass, propertyName); value = new Component(model); - BindComponent(subnode, (Component) value, subreflectedClass, className, subpath, isNullable); + BindComponent(subnode, (Component) value, subreflectedClass, className, propertyName, subpath, isNullable); } else if ("parent".Equals(name)) model.ParentProperty = propertyName; if (value != null) - model.AddProperty(CreateProperty(value, propertyName, model.ComponentClass, subnode)); + { + Property property = CreateProperty(value, propertyName, model.ComponentClassName, subnode); + if (isIdentifierMapper) + { + property.IsInsertable = false; + property.IsUpdateable = false; + } + model.AddProperty(property); + } } } - protected Mapping.Property CreateProperty(IValue value, string propertyName, System.Type parentClass, + protected Property CreateProperty(IValue value, string propertyName, string className, XmlNode subnode) { - if (parentClass != null && value.IsSimpleValue) - value.SetTypeUsingReflection(parentClass.AssemblyQualifiedName, propertyName, PropertyAccess(subnode)); + if (string.IsNullOrEmpty(propertyName)) + { + throw new MappingException(subnode.LocalName + " mapping must defined a name attribute [" + className + "]"); + } + if (!string.IsNullOrEmpty(className) && value.IsSimpleValue) + value.SetTypeUsingReflection(className, propertyName, PropertyAccess(subnode)); + // This is done here 'cos we might only know the type here (ugly!) if (value is ToOne) { @@ -638,7 +653,7 @@ } value.CreateForeignKey(); - Mapping.Property prop = new Mapping.Property(); + Property prop = new Property(); prop.Value = value; BindProperty(subnode, prop); Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2008-10-10 19:19:40 UTC (rev 3835) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2008-10-10 21:36:28 UTC (rev 3836) @@ -529,7 +529,7 @@ else if ("composite-index".Equals(name) || "composite-map-key".Equals(name)) { Component component = new Component(model); - BindComponent(subnode, component, null, model.Role, "index", model.IsOneToMany); + BindComponent(subnode, component, null, null, null, model.Role + ".index", model.IsOneToMany); model.Index = component; } else if ("index-many-to-any".Equals(name)) @@ -618,7 +618,7 @@ { Component element = new Component(model); model.Element = element; - BindComponent(subnode, element, null, model.Role, "element", true); + BindComponent(subnode, element, null, null, null, model.Role+ ".element", true); } else if ("many-to-any".Equals(name)) { Modified: trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/Account.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/Account.hbm.xml 2008-10-10 19:19:40 UTC (rev 3835) +++ trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/Account.hbm.xml 2008-10-10 21:36:28 UTC (rev 3836) @@ -34,7 +34,7 @@ <id name="accountId" type="string" node="@id"/> <many-to-one name="customer" column="customerId" entity-name="Customer" cascade="all" embed-xml="true" /> <!--not-null="true"--> - <property name="balance" type="big_decimal" node="balance" precision="10" scale="0" /> + <property name="balance" type="big_decimal" node="balance" precision="10" scale="2" /> </class> <class entity-name="Location" node="location"> Modified: trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/XmlFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/XmlFixture.cs 2008-10-10 19:19:40 UTC (rev 3835) +++ trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Xml/Basic/XmlFixture.cs 2008-10-10 21:36:28 UTC (rev 3836) @@ -43,8 +43,10 @@ <b bId='1' aId='1>foo foo</b> <b bId='2' aId='1>bar bar</b> </a>"; + var baseXml = new XmlDocument(); + baseXml.LoadXml(xml); - XmlElement a=null; + XmlElement a = baseXml.DocumentElement; ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); s.Persist("A", a); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2008-10-11 00:01:43
|
Revision: 3839 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3839&view=rev Author: ayenderahien Date: 2008-10-11 00:01:33 +0000 (Sat, 11 Oct 2008) Log Message: ----------- NH-1520 SQLite Dialect does not properly escape names surrounded by backticks (should learn to commit to the right branch) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-10-10 23:34:34 UTC (rev 3838) +++ trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-10-11 00:01:33 UTC (rev 3839) @@ -113,24 +113,52 @@ public override string Qualify(string catalog, string schema, string table) { StringBuilder qualifiedName = new StringBuilder(); + bool quoted = false; if (!string.IsNullOrEmpty(catalog)) { - if (catalog.EndsWith(CloseQuote.ToString())) - catalog = catalog.Substring(0, catalog.Length - 1); + if (catalog.StartsWith(OpenQuote.ToString())) + { + catalog = catalog.Substring(1, catalog.Length - 1); + quoted = true; + } + if (catalog.EndsWith(CloseQuote.ToString())) + { + catalog = catalog.Substring(0, catalog.Length - 1); + quoted = true; + } qualifiedName.Append(catalog).Append(StringHelper.Underscore); } if (!string.IsNullOrEmpty(schema)) { if (schema.StartsWith(OpenQuote.ToString())) - schema = schema.Substring(0, schema.Length - 1); - qualifiedName.Append(schema).Append(StringHelper.Underscore); + { + schema = schema.Substring(0, schema.Length - 1); + quoted = true; + } + if (schema.EndsWith(OpenQuote.ToString())) + { + schema = schema.Substring(1, schema.Length - 1); + quoted = true; + } + qualifiedName.Append(schema).Append(StringHelper.Underscore); } if (table.StartsWith(OpenQuote.ToString())) - table = table.Substring(1, table.Length - 1); + { + table = table.Substring(1, table.Length - 1); + quoted = true; + } + if (table.EndsWith(OpenQuote.ToString())) + { + table = table.Substring(0, table.Length - 1); + quoted = true; + } - return qualifiedName.Append(table).ToString(); + string name = qualifiedName.Append(table).ToString(); + if (quoted) + return OpenQuote + name + CloseQuote; + return name; } Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-10 23:34:34 UTC (rev 3838) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-11 00:01:33 UTC (rev 3839) @@ -43,6 +43,48 @@ } [Test] + public void QuotedTableNameWithoutSchemaWithSqlLite() + { + Table tbl = new Table(); + tbl.Name = "`name`"; + + Assert.AreEqual("\"name\"", tbl.GetQualifiedName(dialect)); + } + + [Test] + public void QuotedSchemaNameWithUnqoutedTableInSqlLite() + { + Table tbl = new Table(); + tbl.Schema = "`schema`"; + tbl.Name = "name"; + + Assert.AreEqual("\"schema_name\"", tbl.GetQualifiedName(dialect)); + Assert.AreEqual("\"schema_table\"", dialect.Qualify("", "\"schema\"", "table")); + } + + [Test] + public void QuotedCatalogSchemaNameWithSqlLite() + { + Table tbl = new Table(); + tbl.Catalog = "dbo"; + tbl.Schema = "`schema`"; + tbl.Name = "`name`"; + + Assert.AreEqual("\"dbo_schema_name\"", tbl.GetQualifiedName(dialect)); + Assert.AreEqual("\"dbo_schema_table\"", dialect.Qualify("dbo", "\"schema\"", "\"table\"")); + } + + [Test] + public void QuotedTableNameWithSqlLite() + { + Table tbl = new Table(); + tbl.Name = "`Group`"; + + Assert.AreEqual("\"Group\"", tbl.GetQualifiedName(dialect)); + } + + + [Test] public void SchemaNameWithSqlLite() { Table tbl = new Table(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-10-11 04:46:11
|
Revision: 3840 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3840&view=rev Author: fabiomaulo Date: 2008-10-11 04:46:05 +0000 (Sat, 11 Oct 2008) Log Message: ----------- - Moved ProxyFactoryFactory to a more appropriate namespace - Removed dependency from Castle/DefaultProxyFactoryFactory in actual Bytecode providers - Changed to ignore some broken test (SQLiteDialectFixture was broken in r3839) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs trunk/nhibernate/src/NHibernate/Cfg/Environment.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Bytecode/Castle/ trunk/nhibernate/src/NHibernate/Bytecode/Castle/DefaultProxyFactoryFactory.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Bytecode/DefaultProxyFactoryFactory.cs Copied: trunk/nhibernate/src/NHibernate/Bytecode/Castle/DefaultProxyFactoryFactory.cs (from rev 3839, trunk/nhibernate/src/NHibernate/Bytecode/DefaultProxyFactoryFactory.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/Castle/DefaultProxyFactoryFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Bytecode/Castle/DefaultProxyFactoryFactory.cs 2008-10-11 04:46:05 UTC (rev 3840) @@ -0,0 +1,17 @@ +using NHibernate.Proxy; +using NHibernate.Proxy.Poco.Castle; + +namespace NHibernate.Bytecode.Castle +{ + public class DefaultProxyFactoryFactory : IProxyFactoryFactory + { + #region IProxyFactoryFactory Members + + public IProxyFactory BuildProxyFactory() + { + return new CastleProxyFactory(); + } + + #endregion + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate/Bytecode/Castle/DefaultProxyFactoryFactory.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2008-10-11 00:01:33 UTC (rev 3839) +++ trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2008-10-11 04:46:05 UTC (rev 3840) @@ -5,24 +5,40 @@ using log4net; using Microsoft.CSharp; using NHibernate.Properties; +using NHibernate.Util; namespace NHibernate.Bytecode.CodeDom { /// <summary> /// CodeDOM-based bytecode provider. /// </summary> - public class BytecodeProviderImpl : IBytecodeProvider + public class BytecodeProviderImpl : IBytecodeProvider, IInjectableProxyFactoryFactory { - private static readonly ILog log = LogManager.GetLogger(typeof(BytecodeProviderImpl)); + private static readonly ILog log = LogManager.GetLogger(typeof (BytecodeProviderImpl)); + private System.Type proxyFactoryFactory; #region IBytecodeProvider Members public IProxyFactoryFactory ProxyFactoryFactory { - get { return new DefaultProxyFactoryFactory(); } + get + { + if (proxyFactoryFactory != null) + { + try + { + return (IProxyFactoryFactory) Activator.CreateInstance(proxyFactoryFactory); + } + catch (Exception e) + { + throw new HibernateException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); + } + } + + throw new HibernateException("The ProxyFactoryFactory was not configured. Initialize the 'proxyfactory.factory_class' property of the session-factory section."); + } } - public IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) { if (clazz.IsValueType) @@ -36,13 +52,72 @@ #endregion + #region Implementation of IInjectableProxyFactoryFactory + + public void SetProxyFactoryFactory(string typeName) + { + System.Type pffc; + try + { + pffc = ReflectHelper.ClassForName(typeName); + } + catch (HibernateException he) + { + throw new HibernateException("Unable to load type '" + typeName + "' during configuration of proxy factory class.", + he); + } + + if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) + { + var he = new HibernateException(pffc.FullName + " does not implement " + typeof (IProxyFactoryFactory).FullName); + throw he; + } + proxyFactoryFactory = pffc; + } + + #endregion + + #region Nested type: Generator + public class Generator { - private CompilerParameters cp = new CompilerParameters(); - private System.Type mappedClass; - private IGetter[] getters; - private ISetter[] setters; + private const string classDef = + @"public class GetSetHelper_{0} : IReflectionOptimizer, IAccessOptimizer {{ + ISetter[] setters; + IGetter[] getters; + + public GetSetHelper_{0}(ISetter[] setters, IGetter[] getters) {{ + this.setters = setters; + this.getters = getters; + }} + public IInstantiationOptimizer InstantiationOptimizer {{ + get {{ return null; }} + }} + + public IAccessOptimizer AccessOptimizer {{ + get {{ return this; }} + }} + "; + + private const string closeGetMethod = " return ret;\n" + "}\n"; + private const string closeSetMethod = "}\n"; + + private const string header = + "using System;\n" + "using NHibernate.Property;\n" + "namespace NHibernate.Bytecode.CodeDom {\n"; + + private const string startGetMethod = + "public object[] GetPropertyValues(object obj) {{\n" + " {0} t = ({0})obj;\n" + + " object[] ret = new object[{1}];\n"; + + private const string startSetMethod = + "public void SetPropertyValues(object obj, object[] values) {{\n" + " {0} t = ({0})obj;\n"; + + private readonly CompilerParameters cp = new CompilerParameters(); + private readonly IGetter[] getters; + private readonly System.Type mappedClass; + private readonly ISetter[] setters; + /// <summary> /// ctor /// </summary> @@ -106,7 +181,10 @@ /// <param name="name"></param> private void AddAssembly(string name) { - if (name.StartsWith("System.")) return; + if (name.StartsWith("System.")) + { + return; + } if (!cp.ReferencedAssemblies.Contains(name)) { @@ -126,17 +204,14 @@ private IReflectionOptimizer Build(string code) { CodeDomProvider provider = new CSharpCodeProvider(); - CompilerResults res = provider.CompileAssemblyFromSource(cp, new string[] {code}); + CompilerResults res = provider.CompileAssemblyFromSource(cp, new[] {code}); if (res.Errors.HasErrors) { log.Debug("Compiled with error:\n" + code); foreach (CompilerError e in res.Errors) { - log.Debug( - String.Format("Line:{0}, Column:{1} Message:{2}", - e.Line, e.Column, e.ErrorText) - ); + log.Debug(String.Format("Line:{0}, Column:{1} Message:{2}", e.Line, e.Column, e.ErrorText)); } throw new InvalidOperationException(res.Errors[0].ErrorText); } @@ -150,54 +225,14 @@ Assembly assembly = res.CompiledAssembly; System.Type[] types = assembly.GetTypes(); - IReflectionOptimizer optimizer = (IReflectionOptimizer) assembly.CreateInstance(types[0].FullName, false, - BindingFlags.CreateInstance, null, - new object[] {setters, getters}, - null, null); + var optimizer = + (IReflectionOptimizer) + assembly.CreateInstance(types[0].FullName, false, BindingFlags.CreateInstance, null, + new object[] {setters, getters}, null, null); return optimizer; } - private const string header = - "using System;\n" + - "using NHibernate.Property;\n" + - "namespace NHibernate.Bytecode.CodeDom {\n"; - - private const string classDef = - @"public class GetSetHelper_{0} : IReflectionOptimizer, IAccessOptimizer {{ - ISetter[] setters; - IGetter[] getters; - - public GetSetHelper_{0}(ISetter[] setters, IGetter[] getters) {{ - this.setters = setters; - this.getters = getters; - }} - - public IInstantiationOptimizer InstantiationOptimizer {{ - get {{ return null; }} - }} - - public IAccessOptimizer AccessOptimizer {{ - get {{ return this; }} - }} - "; - - private const string startSetMethod = - "public void SetPropertyValues(object obj, object[] values) {{\n" + - " {0} t = ({0})obj;\n"; - - private const string closeSetMethod = - "}\n"; - - private const string startGetMethod = - "public object[] GetPropertyValues(object obj) {{\n" + - " {0} t = ({0})obj;\n" + - " object[] ret = new object[{1}];\n"; - - private const string closeGetMethod = - " return ret;\n" + - "}\n"; - /// <summary> /// Check if the property is public /// </summary> @@ -218,7 +253,7 @@ /// <returns>C# code</returns> private string GenerateCode() { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); sb.Append(header); sb.AppendFormat(classDef, mappedClass.FullName.Replace('.', '_').Replace("+", "__")); @@ -234,18 +269,12 @@ if (type.IsValueType) { - sb.AppendFormat( - " t.{0} = values[{2}] == null ? new {1}() : ({1})values[{2}];\n", - setter.PropertyName, - type.FullName.Replace('+', '.'), - i); + sb.AppendFormat(" t.{0} = values[{2}] == null ? new {1}() : ({1})values[{2}];\n", setter.PropertyName, + type.FullName.Replace('+', '.'), i); } else { - sb.AppendFormat(" t.{0} = ({1})values[{2}];\n", - setter.PropertyName, - type.FullName.Replace('+', '.'), - i); + sb.AppendFormat(" t.{0} = ({1})values[{2}];\n", setter.PropertyName, type.FullName.Replace('+', '.'), i); } } else @@ -276,5 +305,7 @@ return sb.ToString(); } } + + #endregion } -} +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate/Bytecode/DefaultProxyFactoryFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/DefaultProxyFactoryFactory.cs 2008-10-11 00:01:33 UTC (rev 3839) +++ trunk/nhibernate/src/NHibernate/Bytecode/DefaultProxyFactoryFactory.cs 2008-10-11 04:46:05 UTC (rev 3840) @@ -1,17 +0,0 @@ -using NHibernate.Proxy; -using NHibernate.Proxy.Poco.Castle; - -namespace NHibernate.Bytecode -{ - public class DefaultProxyFactoryFactory : IProxyFactoryFactory - { - #region IProxyFactoryFactory Members - - public IProxyFactory BuildProxyFactory() - { - return new CastleProxyFactory(); - } - - #endregion - } -} Modified: trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs 2008-10-11 00:01:33 UTC (rev 3839) +++ trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs 2008-10-11 04:46:05 UTC (rev 3840) @@ -33,7 +33,7 @@ throw new HibernateException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); } } - return new DefaultProxyFactoryFactory(); + throw new HibernateException("The ProxyFactoryFactory was not configured. Initialize the 'proxyfactory.factory_class' property of the session-factory section."); } } Modified: trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs 2008-10-11 00:01:33 UTC (rev 3839) +++ trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs 2008-10-11 04:46:05 UTC (rev 3840) @@ -1,4 +1,6 @@ +using System; using NHibernate.Properties; +using NHibernate.Util; namespace NHibernate.Bytecode { @@ -6,20 +8,61 @@ /// A <see cref="IBytecodeProvider" /> implementation that returns /// <see langword="null" />, disabling reflection optimization. /// </summary> - public class NullBytecodeProvider : IBytecodeProvider + public class NullBytecodeProvider : IBytecodeProvider, IInjectableProxyFactoryFactory { + private System.Type proxyFactoryFactory; + #region IBytecodeProvider Members public IProxyFactoryFactory ProxyFactoryFactory { - get { return new DefaultProxyFactoryFactory(); } + get + { + if (proxyFactoryFactory != null) + { + try + { + return (IProxyFactoryFactory) Activator.CreateInstance(proxyFactoryFactory); + } + catch (Exception e) + { + throw new HibernateException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); + } + } + throw new HibernateException("The ProxyFactoryFactory was not configured. Initialize the 'proxyfactory.factory_class' property of the session-factory section."); + } } - #endregion - public IReflectionOptimizer GetReflectionOptimizer(System.Type clazz, IGetter[] getters, ISetter[] setters) { return null; } + + #endregion + + #region Implementation of IInjectableProxyFactoryFactory + + public void SetProxyFactoryFactory(string typeName) + { + System.Type pffc; + try + { + pffc = ReflectHelper.ClassForName(typeName); + } + catch (HibernateException he) + { + throw new HibernateException("Unable to load type '" + typeName + "' during configuration of proxy factory class.", + he); + } + + if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) + { + var he = new HibernateException(pffc.FullName + " does not implement " + typeof (IProxyFactoryFactory).FullName); + throw he; + } + proxyFactoryFactory = pffc; + } + + #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-10-11 00:01:33 UTC (rev 3839) +++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-10-11 04:46:05 UTC (rev 3840) @@ -4,8 +4,9 @@ using System.Reflection; using log4net; using NHibernate.Bytecode; +using NHibernate.Bytecode.CodeDom; +using NHibernate.Cfg.ConfigurationSchema; using NHibernate.Util; -using NHibernate.Cfg.ConfigurationSchema; namespace NHibernate.Cfg { @@ -34,7 +35,7 @@ /// Properties in hibernate.cfg.xml override/merge properties in application configuration file where same /// property is found. For others configuration a merge is applied. /// </remarks> - public sealed class Environment + public static class Environment { private static string cachedVersion; @@ -48,9 +49,9 @@ if (cachedVersion == null) { Assembly thisAssembly = Assembly.GetExecutingAssembly(); - AssemblyInformationalVersionAttribute[] attrs = (AssemblyInformationalVersionAttribute[]) - thisAssembly.GetCustomAttributes( - typeof(AssemblyInformationalVersionAttribute), false); + var attrs = + (AssemblyInformationalVersionAttribute[]) + thisAssembly.GetCustomAttributes(typeof (AssemblyInformationalVersionAttribute), false); if (attrs != null && attrs.Length > 0) { @@ -80,8 +81,10 @@ public const string SessionFactoryName = "session_factory_name"; public const string Dialect = "dialect"; + /// <summary> A default database schema (owner) name to use for unqualified tablenames</summary> public const string DefaultSchema = "default_schema"; + /// <summary> A default database catalog name to use for unqualified tablenames</summary> public const string DefaultCatalog = "default_catalog"; @@ -156,16 +159,14 @@ private static IBytecodeProvider BytecodeProviderInstance; private static bool EnableReflectionOptimizer; - private static readonly ILog log = LogManager.GetLogger(typeof(Environment)); + private static readonly ILog log = LogManager.GetLogger(typeof (Environment)); /// <summary> /// Issue warnings to user when any obsolete property names are used. /// </summary> /// <param name="props"></param> /// <returns></returns> - public static void VerifyProperties(IDictionary<string, string> props) - { - } + public static void VerifyProperties(IDictionary<string, string> props) {} static Environment() { @@ -177,6 +178,7 @@ GlobalProperties = new Dictionary<string, string>(); GlobalProperties[PropertyUseReflectionOptimizer] = bool.TrueString; + SetDefaultProxyFactoryFactory(); LoadGlobalPropertiesFromAppConfig(); VerifyProperties(GlobalProperties); @@ -189,6 +191,12 @@ } } + private static void SetDefaultProxyFactoryFactory() + { + // maitaining the optionality of set the proxyfactory.factory_class property + GlobalProperties[ProxyFactoryFactoryClass] = "NHibernate.Bytecode.Castle.DefaultProxyFactoryFactory, NHibernate"; + } + private static void LoadGlobalPropertiesFromAppConfig() { object config = ConfigurationManager.GetSection(CfgXmlHelper.CfgSectionName); @@ -199,16 +207,19 @@ return; } - IHibernateConfiguration NHconfig = config as IHibernateConfiguration; - if (NHconfig == null) + var nhConfig = config as IHibernateConfiguration; + if (nhConfig == null) { - log.Info(string.Format("{0} section handler, in application configuration file, is not IHibernateConfiguration, section ignored", CfgXmlHelper.CfgSectionName)); + log.Info( + string.Format( + "{0} section handler, in application configuration file, is not IHibernateConfiguration, section ignored", + CfgXmlHelper.CfgSectionName)); return; } - GlobalProperties[PropertyBytecodeProvider] = CfgXmlHelper.ByteCodeProviderToString(NHconfig.ByteCodeProviderType); - GlobalProperties[PropertyUseReflectionOptimizer] = NHconfig.UseReflectionOptimizer.ToString(); - foreach (KeyValuePair<string, string> kvp in NHconfig.SessionFactory.Properties) + GlobalProperties[PropertyBytecodeProvider] = CfgXmlHelper.ByteCodeProviderToString(nhConfig.ByteCodeProviderType); + GlobalProperties[PropertyUseReflectionOptimizer] = nhConfig.UseReflectionOptimizer.ToString(); + foreach (KeyValuePair<string, string> kvp in nhConfig.SessionFactory.Properties) { GlobalProperties[kvp.Key] = kvp.Value; } @@ -221,23 +232,28 @@ // Save values loaded and used in static constructor if (GlobalProperties.ContainsKey(PropertyBytecodeProvider)) + { savedBytecodeProvider = GlobalProperties[PropertyBytecodeProvider]; + } if (GlobalProperties.ContainsKey(PropertyUseReflectionOptimizer)) + { savedUseReflectionOptimizer = GlobalProperties[PropertyUseReflectionOptimizer]; + } // Clean all property loaded from app.config GlobalProperties.Clear(); // Restore values loaded and used in static constructor if (savedBytecodeProvider != null) + { GlobalProperties[PropertyBytecodeProvider] = savedBytecodeProvider; + } if (savedUseReflectionOptimizer != null) + { GlobalProperties[PropertyUseReflectionOptimizer] = savedUseReflectionOptimizer; - } + } - private Environment() - { - // should not be created. + SetDefaultProxyFactoryFactory(); } /// <summary> @@ -252,12 +268,6 @@ get { return new Dictionary<string, string>(GlobalProperties); } } - [Obsolete] - public static bool UseStreamsForBinary - { - get { return true; } - } - /// <summary> /// The bytecode provider to use. /// </summary> @@ -294,9 +304,8 @@ public static IBytecodeProvider BuildBytecodeProvider(IDictionary<string, string> properties) { - string defaultBytecodeProvider = "lcg"; - string provider = PropertiesHelper.GetString(PropertyBytecodeProvider, properties, - defaultBytecodeProvider); + const string defaultBytecodeProvider = "lcg"; + string provider = PropertiesHelper.GetString(PropertyBytecodeProvider, properties, defaultBytecodeProvider); log.Info("Bytecode provider name : " + provider); return BuildBytecodeProvider(provider); } @@ -306,7 +315,7 @@ switch (providerName) { case "codedom": - return new Bytecode.CodeDom.BytecodeProviderImpl(); + return new BytecodeProviderImpl(); case "lcg": return new Bytecode.Lightweight.BytecodeProviderImpl(); case "null": @@ -317,4 +326,4 @@ } } } -} +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-10-11 00:01:33 UTC (rev 3839) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-10-11 04:46:05 UTC (rev 3840) @@ -452,7 +452,7 @@ <Compile Include="AdoNet\TooManyRowsAffectedException.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> - <Compile Include="Bytecode\DefaultProxyFactoryFactory.cs" /> + <Compile Include="Bytecode\Castle\DefaultProxyFactoryFactory.cs" /> <Compile Include="Bytecode\IAccessOptimizer.cs" /> <Compile Include="Bytecode\IBytecodeProvider.cs" /> <Compile Include="Bytecode\IInjectableProxyFactoryFactory.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-11 00:01:33 UTC (rev 3839) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-11 04:46:05 UTC (rev 3840) @@ -31,7 +31,7 @@ Assert.AreEqual("SELECT id, name, email FROM Users limit 10, 5", s.ToString()); } - [Test] + [Test, Ignore("was broken in r3839")] public void QuotedSchemaNameWithSqlLite() { Table tbl = new Table(); @@ -51,8 +51,8 @@ Assert.AreEqual("\"name\"", tbl.GetQualifiedName(dialect)); } - [Test] - public void QuotedSchemaNameWithUnqoutedTableInSqlLite() + [Test, Ignore("was broken in r3839")] + public void QuotedSchemaNameWithUnqoutedTableInSqlLite() { Table tbl = new Table(); tbl.Schema = "`schema`"; @@ -62,8 +62,8 @@ Assert.AreEqual("\"schema_table\"", dialect.Qualify("", "\"schema\"", "table")); } - [Test] - public void QuotedCatalogSchemaNameWithSqlLite() + [Test, Ignore("was broken in r3839")] + public void QuotedCatalogSchemaNameWithSqlLite() { Table tbl = new Table(); tbl.Catalog = "dbo"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2008-10-11 05:54:45
|
Revision: 3841 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3841&view=rev Author: ayenderahien Date: 2008-10-11 05:54:37 +0000 (Sat, 11 Oct 2008) Log Message: ----------- fixing broken build Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-10-11 04:46:05 UTC (rev 3840) +++ trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-10-11 05:54:37 UTC (rev 3841) @@ -114,8 +114,8 @@ { StringBuilder qualifiedName = new StringBuilder(); bool quoted = false; - - if (!string.IsNullOrEmpty(catalog)) + + if (!string.IsNullOrEmpty(catalog)) { if (catalog.StartsWith(OpenQuote.ToString())) { @@ -133,12 +133,12 @@ { if (schema.StartsWith(OpenQuote.ToString())) { - schema = schema.Substring(0, schema.Length - 1); + schema = schema.Substring(1, schema.Length - 1); quoted = true; } - if (schema.EndsWith(OpenQuote.ToString())) + if (schema.EndsWith(CloseQuote.ToString())) { - schema = schema.Substring(1, schema.Length - 1); + schema = schema.Substring(0, schema.Length - 1); quoted = true; } qualifiedName.Append(schema).Append(StringHelper.Underscore); @@ -149,7 +149,7 @@ table = table.Substring(1, table.Length - 1); quoted = true; } - if (table.EndsWith(OpenQuote.ToString())) + if (table.EndsWith(CloseQuote.ToString())) { table = table.Substring(0, table.Length - 1); quoted = true; Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-11 04:46:05 UTC (rev 3840) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-11 05:54:37 UTC (rev 3841) @@ -31,7 +31,7 @@ Assert.AreEqual("SELECT id, name, email FROM Users limit 10, 5", s.ToString()); } - [Test, Ignore("was broken in r3839")] + [Test] public void QuotedSchemaNameWithSqlLite() { Table tbl = new Table(); @@ -39,7 +39,7 @@ tbl.Name = "`name`"; Assert.AreEqual("\"schema_name\"", tbl.GetQualifiedName(dialect)); - Assert.AreEqual("\"schema_table\"", dialect.Qualify("","\"schema\"", "\"table\"")); + Assert.AreEqual("\"schema_table\"", dialect.Qualify("", "\"schema\"", "\"table\"")); } [Test] @@ -51,8 +51,8 @@ Assert.AreEqual("\"name\"", tbl.GetQualifiedName(dialect)); } - [Test, Ignore("was broken in r3839")] - public void QuotedSchemaNameWithUnqoutedTableInSqlLite() + [Test] + public void QuotedSchemaNameWithUnqoutedTableInSqlLite() { Table tbl = new Table(); tbl.Schema = "`schema`"; @@ -62,8 +62,8 @@ Assert.AreEqual("\"schema_table\"", dialect.Qualify("", "\"schema\"", "table")); } - [Test, Ignore("was broken in r3839")] - public void QuotedCatalogSchemaNameWithSqlLite() + [Test] + public void QuotedCatalogSchemaNameWithSqlLite() { Table tbl = new Table(); tbl.Catalog = "dbo"; @@ -92,7 +92,7 @@ tbl.Name = "name"; Assert.AreEqual("schema_name", tbl.GetQualifiedName(dialect)); - Assert.AreEqual("schema_table", dialect.Qualify("","schema","table")); + Assert.AreEqual("schema_table", dialect.Qualify("", "schema", "table")); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-10-11 21:22:31
|
Revision: 3848 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3848&view=rev Author: tehlike Date: 2008-10-11 21:22:21 +0000 (Sat, 11 Oct 2008) Log Message: ----------- Adding overload for SetParameter using System.Type(No Test)(fix 1047) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/IQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs Modified: trunk/nhibernate/src/NHibernate/IQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQuery.cs 2008-10-11 20:25:14 UTC (rev 3847) +++ trunk/nhibernate/src/NHibernate/IQuery.cs 2008-10-11 21:22:21 UTC (rev 3848) @@ -189,7 +189,26 @@ /// <param name="type">The NHibernate <see cref="IType"/>.</param> IQuery SetParameter(string name, object val, IType type); + /// <summary> + /// Bind a value to an indexed parameter. + /// </summary> + /// <param name="position">Position of the parameter in the query, numbered from <c>0</c></param> + /// <param name="val">The possibly null parameter value</param> + /// <param name="type">The System.Type</param> + IQuery SetParameter(int position, object val, System.Type type); + + /// <summary> + /// Bind a value to a named query parameter + /// </summary> + /// <param name="name">The name of the parameter</param> + /// <param name="val">The possibly null parameter value</param> + /// <param name="type">The System.Type.</param> + IQuery SetParameter(string name, object val, System.Type type); + + + + /// <summary> /// Bind a value to an indexed parameter, guessing the Hibernate type from /// the class of the given object. /// </summary> Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2008-10-11 20:25:14 UTC (rev 3847) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2008-10-11 21:22:21 UTC (rev 3848) @@ -322,6 +322,17 @@ } } + public IQuery SetParameter(int position, object val, System.Type type) + { + return SetParameter(position, val, GuessType(type)); + } + + public IQuery SetParameter(string name,object val,System.Type type) + { + return SetParameter(name, val, GuessType(type)); + } + + public IQuery SetParameter(string name, object val) { if (!parameterMetadata.NamedParameterNames.Contains(name)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-10-11 23:15:25
|
Revision: 3852 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3852&view=rev Author: fabiomaulo Date: 2008-10-11 23:15:18 +0000 (Sat, 11 Oct 2008) Log Message: ----------- Minor (changed ignore list) Property Changed: ---------------- trunk/nhibernate/src/NHibernate/ trunk/nhibernate/src/NHibernate.ProxyGenerators.CastleDynamicProxy/ trunk/nhibernate/src/NHibernate.ProxyGenerators.CastleDynamicProxy.Tests/ Property changes on: trunk/nhibernate/src/NHibernate ___________________________________________________________________ Modified: svn:ignore - bin obj .#* *.user *.xsx AssemblyInfo.cs Debug Release *.aps *.eto [Bb]in [Dd]ebug [Rr]elease + obj .#* *.user *.xsx AssemblyInfo.cs *.aps *.eto [Bb]in [Dd]ebug [Rr]elease Property changes on: trunk/nhibernate/src/NHibernate.ProxyGenerators.CastleDynamicProxy ___________________________________________________________________ Modified: svn:ignore - [Bb]in obj [Dd]ebug [Rr]elease *.user *.aps *.eto *resharper* + [Bb]in obj [Dd]ebug [Rr]elease *.user *.aps *.eto *resharper* AssemblyInfo.cs Property changes on: trunk/nhibernate/src/NHibernate.ProxyGenerators.CastleDynamicProxy.Tests ___________________________________________________________________ Modified: svn:ignore - [Bb]in obj [Dd]ebug [Rr]elease *.user *.aps *.eto *resharper* hibernate.cfg.xml + [Bb]in obj [Dd]ebug [Rr]elease *.user *.aps *.eto *resharper* hibernate.cfg.xml AssemblyInfo.cs This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-10-11 23:38:21
|
Revision: 3853 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3853&view=rev Author: fabiomaulo Date: 2008-10-11 23:38:11 +0000 (Sat, 11 Oct 2008) Log Message: ----------- Retouch Fix of NH-1047 in order to use generics. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/IQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs Modified: trunk/nhibernate/src/NHibernate/IQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQuery.cs 2008-10-11 23:15:18 UTC (rev 3852) +++ trunk/nhibernate/src/NHibernate/IQuery.cs 2008-10-11 23:38:11 UTC (rev 3853) @@ -189,25 +189,22 @@ /// <param name="type">The NHibernate <see cref="IType"/>.</param> IQuery SetParameter(string name, object val, IType type); - /// <summary> /// Bind a value to an indexed parameter. /// </summary> /// <param name="position">Position of the parameter in the query, numbered from <c>0</c></param> /// <param name="val">The possibly null parameter value</param> - /// <param name="type">The System.Type</param> - IQuery SetParameter(int position, object val, System.Type type); + /// <typeparam name="T">The parameter's <see cref="Type"/> </typeparam> + IQuery SetParameter<T>(int position, T val); /// <summary> /// Bind a value to a named query parameter /// </summary> /// <param name="name">The name of the parameter</param> /// <param name="val">The possibly null parameter value</param> - /// <param name="type">The System.Type.</param> - IQuery SetParameter(string name, object val, System.Type type); + /// <typeparam name="T">The parameter's <see cref="Type"/> </typeparam> + IQuery SetParameter<T>(string name, T val); - - /// <summary> /// Bind a value to an indexed parameter, guessing the Hibernate type from /// the class of the given object. Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2008-10-11 23:15:18 UTC (rev 3852) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2008-10-11 23:38:11 UTC (rev 3853) @@ -322,17 +322,16 @@ } } - public IQuery SetParameter(int position, object val, System.Type type) + public IQuery SetParameter<T>(int position, T val) { - return SetParameter(position, val, GuessType(type)); + return SetParameter(position, val, GuessType(typeof (T))); } - public IQuery SetParameter(string name,object val,System.Type type) + public IQuery SetParameter<T>(string name, T val) { - return SetParameter(name, val, GuessType(type)); + return SetParameter(name, val, GuessType(typeof (T))); } - public IQuery SetParameter(string name, object val) { if (!parameterMetadata.NamedParameterNames.Contains(name)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2008-10-15 13:59:33
|
Revision: 3858 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3858&view=rev Author: ayenderahien Date: 2008-10-15 13:58:32 +0000 (Wed, 15 Oct 2008) Log Message: ----------- Fixing NH-1526 - Cannot use projection for Count in OrderBy Fixing NH-1029 - Misleading SQL Query on exception Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/Criterion/CountProjection.cs trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Key.cs trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/NodeType.cs trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2008-10-15 12:03:06 UTC (rev 3857) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2008-10-15 13:58:32 UTC (rev 3858) @@ -193,7 +193,15 @@ { CheckReaders(); Prepare(cmd); - return cmd.ExecuteNonQuery(); + try + { + return cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + e.Data["actual-sql-query"] = cmd.CommandText; + throw; + } } public IDataReader ExecuteReader(IDbCommand cmd) @@ -201,9 +209,18 @@ CheckReaders(); Prepare(cmd); - IDataReader reader = cmd.ExecuteReader(); + IDataReader reader; + try + { + reader = cmd.ExecuteReader(); + } + catch (Exception e) + { + e.Data["actual-sql-query"] = cmd.CommandText; + throw; + } - if (!factory.ConnectionProvider.Driver.SupportsMultipleOpenReaders) + if (!factory.ConnectionProvider.Driver.SupportsMultipleOpenReaders) { reader = new NHybridDataReader(reader); } Modified: trunk/nhibernate/src/NHibernate/Criterion/CountProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/CountProjection.cs 2008-10-15 12:03:06 UTC (rev 3857) +++ trunk/nhibernate/src/NHibernate/Criterion/CountProjection.cs 2008-10-15 13:58:32 UTC (rev 3858) @@ -2,6 +2,7 @@ using System.Collections.Generic; using NHibernate.SqlCommand; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Criterion { @@ -34,7 +35,19 @@ { buf.Add("distinct "); } - buf.Add(criteriaQuery.GetColumn(criteria, propertyName)).Add(") as y").Add(position.ToString()).Add("_"); + string column; + if(projection!=null) + { + column = + StringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, position, criteriaQuery, + enabledFilters)).ToString(); + } + else + { + column = criteriaQuery.GetColumn(criteria, propertyName); + } + + buf.Add(column).Add(") as y").Add(position.ToString()).Add("_"); return buf.ToSqlString(); } Modified: trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2008-10-15 12:03:06 UTC (rev 3857) +++ trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2008-10-15 13:58:32 UTC (rev 3858) @@ -8,15 +8,11 @@ namespace NHibernate.Exceptions { - public sealed class ADOExceptionHelper + public static class ADOExceptionHelper { public const string SQLNotAvailable = "SQL not available"; - private ADOExceptionHelper() - { - } - - /// <summary> + /// <summary> /// Converts the given SQLException into NHibernate's ADOException hierarchy, as well as performing /// appropriate logging. /// </summary> @@ -27,6 +23,7 @@ /// <returns> The converted <see cref="ADOException"/>.</returns> public static ADOException Convert(ISQLExceptionConverter converter, Exception sqlException, string message, SqlString sql) { + sql = TryGetActualSqlQuery(sqlException, sql); ADOExceptionReporter.LogExceptions(sqlException, ExtendMessage(message, sql, null, null)); return converter.Convert(sqlException, message, sql); } @@ -41,13 +38,16 @@ /// <returns> The converted <see cref="ADOException"/>.</returns> public static ADOException Convert(ISQLExceptionConverter converter, Exception sqlException, string message) { - return Convert(converter, sqlException, message, new SqlString(SQLNotAvailable)); + SqlString sql = new SqlString(SQLNotAvailable); + sql = TryGetActualSqlQuery(sqlException, sql); + return Convert(converter, sqlException, message, sql); } public static ADOException Convert(ISQLExceptionConverter converter, Exception sqle, string message, SqlString sql, object[] parameterValues, IDictionary<string, TypedValue> namedParameters) { - string extendMessage = ExtendMessage(message, sql, parameterValues, namedParameters); + sql = TryGetActualSqlQuery(sqle, sql); + string extendMessage = ExtendMessage(message, sql, parameterValues, namedParameters); ADOExceptionReporter.LogExceptions(sqle, extendMessage); return new ADOException(extendMessage, sqle, sql); } @@ -100,5 +100,13 @@ sb.Append(Environment.NewLine); return sb.ToString(); } + + public static SqlString TryGetActualSqlQuery(Exception sqle, SqlString sql) + { + string query = (string)sqle.Data["actual-sql-query"]; + if(query!=null) + sql = new SqlString(query); + return sql; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-15 12:03:06 UTC (rev 3857) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-15 13:58:32 UTC (rev 3858) @@ -757,6 +757,10 @@ <Compile Include="Ondelete\ParentChildFixture.cs" /> <Compile Include="Ondelete\Person.cs" /> <Compile Include="Ondelete\Salesperson.cs" /> + <Compile Include="ProjectionFixtures\Key.cs" /> + <Compile Include="ProjectionFixtures\Fixture.cs" /> + <Compile Include="ProjectionFixtures\NodeType.cs" /> + <Compile Include="ProjectionFixtures\TreeNode.cs" /> <Compile Include="PropertyRef\A.cs" /> <Compile Include="PropertyRef\B.cs" /> <Compile Include="PropertyRef\KeyPropertyRefFixture.cs" /> @@ -1499,6 +1503,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="ProjectionFixtures\Mapping.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1033\Mappings.hbm.xml" /> <EmbeddedResource Include="EntityModeTest\Multi\Stock.hbm.xml" /> <EmbeddedResource Include="EntityModeTest\Multi\Valuation.hbm.xml" /> Property changes on: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs 2008-10-15 13:58:32 UTC (rev 3858) @@ -0,0 +1,123 @@ +using System; +using NHibernate; +using NHibernate.Criterion; +using NHibernate.Test.PropertyRef; +using NUnit.Framework; + +namespace NHibernate.Test.ProjectionFixtures +{ + [TestFixture] + public class Fixture : TestCase + { + protected override System.Collections.IList Mappings + { + get { return new string[] { "ProjectionFixtures.Mapping.hbm.xml" }; } + } + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override void OnSetUp() + { + using(var s = sessions.OpenSession()) + using(var tx = s.BeginTransaction()) + { + var root = new TreeNode + { + Key = new Key {Id = 1, Area = 2}, + Type = NodeType.Plain + }; + var child = new TreeNode + { + Key = new Key { Id = 11, Area = 2 }, + Type = NodeType.Blue + }; + var grandchild = new TreeNode + { + Key = new Key {Id = 111, Area = 2}, + Type = NodeType.Smart + }; + root.DirectChildren.Add(child); + child.Parent = root; + grandchild.Parent = child; + child.DirectChildren.Add(grandchild); + + s.Save(root); + s.Save(child); + s.Save(grandchild); + + tx.Commit(); + } + } + + protected override void OnTearDown() + { + using(var s = sessions.OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Delete("from TreeNode"); + + tx.Commit(); + } + } + + + [Test] + [ExpectedException(typeof(ADOException), ExpectedMessage = @"could not execute query +[ SELECT this_.Id as y0_, count(this_.Area) as y1_ FROM TreeNode this_ WHERE this_.Id = @p0 ] +Positional parameters: #0>2 +[SQL: SELECT this_.Id as y0_, count(this_.Area) as y1_ FROM TreeNode this_ WHERE this_.Id = @p0]")] + public void ErrorFromDBWillGiveTheActualSQLExecuted() + { + DetachedCriteria projection = DetachedCriteria.For<TreeNode>("child") + .Add(Restrictions.Eq("child.Key.Id", 2)) + .SetProjection( + Projections.ProjectionList() + .Add(Projections.Property("child.Key.Id")) + .Add(Projections.Count("child.Key.Area")) + ); + + using (var s = sessions.OpenSession()) + using (var tx = s.BeginTransaction()) + { + var criteria = projection.GetExecutableCriteria(s); + criteria.List(); + + tx.Commit(); + } + } + + [Test] + public void AggregatingHirearchyWithCount() + { + var root = new Key {Id = 1, Area = 2}; + + DetachedCriteria projection = DetachedCriteria.For<TreeNode>("child") + .Add(Restrictions.Eq("Parent.id", root)) + .Add(Restrictions.Gt("Key.Id", 0)) + .Add(Restrictions.Eq("Type", NodeType.Blue)) + .CreateAlias("DirectChildren", "grandchild") + .SetProjection( + Projections.ProjectionList() + .Add(Projections.GroupProperty("child.Key.Id")) + .Add(Projections.GroupProperty("child.Key.Area")) + .Add(Projections.Count(Projections.Property("grandchild.Key.Id"))) + ); + + using(var s = sessions.OpenSession()) + using(var tx = s.BeginTransaction()) + { + var criteria = projection.GetExecutableCriteria(s); + var list = criteria.List(); + Assert.AreEqual(1, list.Count); + var tuple = (object[]) list[0]; + Assert.AreEqual(11, tuple[0]); + Assert.AreEqual(2, tuple[1]); + Assert.AreEqual(1, tuple[2]); + tx.Commit(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Key.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Key.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Key.cs 2008-10-15 13:58:32 UTC (rev 3858) @@ -0,0 +1,31 @@ +namespace NHibernate.Test.ProjectionFixtures +{ + public class Key + { + public virtual int Id { get; set; } + public virtual int Area { get; set; } + + public virtual bool Equals(Key obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + return obj.Id == Id && obj.Area == Area; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (Key)) return false; + return Equals((Key) obj); + } + + public override int GetHashCode() + { + unchecked + { + return (Id*397) ^ Area; + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml 2008-10-15 13:58:32 UTC (rev 3858) @@ -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.ProjectionFixtures"> + + <class name="TreeNode"> + <composite-id name="Key"> + <key-property name="Id" /> + <key-property name="Area" /> + </composite-id> + <many-to-one name="Parent"> + <column name="Parent"/> + <column name="ParentArea"/> + </many-to-one> + <set name="DirectChildren"> + <key> + <column name="Parent"/> + <column name="ParentArea"/> + </key> + <one-to-many class="TreeNode"/> + </set> + <property name="Type"/> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/NodeType.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/NodeType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/NodeType.cs 2008-10-15 13:58:32 UTC (rev 3858) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.ProjectionFixtures +{ + public enum NodeType + { + Smart, + Plain, + Blue + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs 2008-10-15 13:58:32 UTC (rev 3858) @@ -0,0 +1,18 @@ +using Iesi.Collections.Generic; +using NHibernate.Test.ProjectionFixtures; + +namespace NHibernate.Test.ProjectionFixtures +{ + public class TreeNode + { + public virtual Key Key { get; set; } + public virtual TreeNode Parent { get; set; } + public virtual NodeType Type { get; set; } + public virtual ISet<TreeNode> DirectChildren { get; set; } + + public TreeNode() + { + DirectChildren = new HashedSet<TreeNode>(); + } + } +} \ 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: <aye...@us...> - 2008-10-15 17:01:59
|
Revision: 3859 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3859&view=rev Author: ayenderahien Date: 2008-10-15 16:59:19 +0000 (Wed, 15 Oct 2008) Log Message: ----------- Fixed NH-1527 - order by with parameters in conjunction with SetMaxResults on sql 2005. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 13:58:32 UTC (rev 3858) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 16:59:19 UTC (rev 3859) @@ -46,24 +46,24 @@ { int fromIndex = GetFromIndex(querySqlString); SqlString select = querySqlString.Substring(0, fromIndex); - List<string> columnsOrAliases; - Dictionary<string, string> aliasToColumn; + List<SqlString> columnsOrAliases; + Dictionary<SqlString, SqlString> aliasToColumn; ExtractColumnOrAliasNames(select, out columnsOrAliases, out aliasToColumn); int orderIndex = querySqlString.LastIndexOfCaseInsensitive(" order by "); SqlString from; - string[] sortExpressions; + SqlString[] sortExpressions; if (orderIndex > 0) { from = querySqlString.Substring(fromIndex, orderIndex - fromIndex).Trim(); - string orderBy = querySqlString.Substring(orderIndex).ToString().Trim(); - sortExpressions = orderBy.Substring(9).Split(','); + SqlString orderBy = querySqlString.Substring(orderIndex).Trim(); + sortExpressions = orderBy.Substring(9).Split(","); } else { from = querySqlString.Substring(fromIndex).Trim(); // Use dummy sort to avoid errors - sortExpressions = new string[] { "CURRENT_TIMESTAMP" }; + sortExpressions = new SqlString[] { new SqlString("CURRENT_TIMESTAMP"), }; } SqlStringBuilder result = @@ -85,7 +85,7 @@ } for (int i = 0; i < sortExpressions.Length; i++) { - string sortExpression = RemoveSortOrderDirection(sortExpressions[i]); + SqlString sortExpression = RemoveSortOrderDirection(sortExpressions[i]); if (!columnsOrAliases.Contains(sortExpression)) { result.Add(", query.__hibernate_sort_expr_").Add(i.ToString()).Add("__"); @@ -96,7 +96,7 @@ for (int i = 0; i < sortExpressions.Length; i++) { - string sortExpression = RemoveSortOrderDirection(sortExpressions[i]); + SqlString sortExpression = RemoveSortOrderDirection(sortExpressions[i]); if (columnsOrAliases.Contains(sortExpression)) { @@ -118,13 +118,16 @@ return result.ToSqlString(); } - private static string RemoveSortOrderDirection(string sortExpression) + private static SqlString RemoveSortOrderDirection(SqlString sortExpression) { - // Drop the ASC/DESC at the end of the sort expression which might look like "count(distinct frog.Id)desc" or "frog.Name asc". - return Regex.Replace(sortExpression.Trim(), @"(\)|\s)(?i:asc|desc)$", "$1").Trim(); + if (sortExpression.EndsWithCaseInsensitive("asc")) + return sortExpression.Substring(0, sortExpression.Length - 3).Trim(); + if (sortExpression.EndsWithCaseInsensitive("desc")) + return sortExpression.Substring(0, sortExpression.Length - 4).Trim(); + return sortExpression.Trim(); } - private static void AppendSortExpressions(ICollection<string> columnsOrAliases, string[] sortExpressions, + private static void AppendSortExpressions(ICollection<SqlString> columnsOrAliases, SqlString[] sortExpressions, SqlStringBuilder result) { for (int i = 0; i < sortExpressions.Length; i++) @@ -134,7 +137,7 @@ result.Add(", "); } - string sortExpression = RemoveSortOrderDirection(sortExpressions[i]); + SqlString sortExpression = RemoveSortOrderDirection(sortExpressions[i]); if (columnsOrAliases.Contains(sortExpression)) { result.Add(sortExpression); @@ -143,7 +146,7 @@ { result.Add("__hibernate_sort_expr_").Add(i.ToString()).Add("__"); } - if (sortExpressions[i].Trim().ToLower().EndsWith("desc")) + if (sortExpressions[i].Trim().EndsWithCaseInsensitive("desc")) { result.Add(" DESC"); } @@ -161,11 +164,11 @@ return fromIndex; } - private static void ExtractColumnOrAliasNames(SqlString select, out List<string> columnsOrAliases, - out Dictionary<string, string> aliasToColumn) + private static void ExtractColumnOrAliasNames(SqlString select, out List<SqlString> columnsOrAliases, + out Dictionary<SqlString, SqlString> aliasToColumn) { - columnsOrAliases = new List<string>(); - aliasToColumn = new Dictionary<string, string>(); + columnsOrAliases = new List<SqlString>(); + aliasToColumn = new Dictionary<SqlString, SqlString>(); IList<string> tokens = new QuotedAndParenthesisStringTokenizer(select.ToString()).GetTokens(); int index = 0; @@ -222,8 +225,8 @@ index += 2; //skip the "as" and the alias \ } - columnsOrAliases.Add(alias); - aliasToColumn[alias] = token; + columnsOrAliases.Add(new SqlString(alias)); + aliasToColumn[new SqlString(alias)] = new SqlString(token); } } Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs =================================================================== --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 13:58:32 UTC (rev 3858) +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 16:59:19 UTC (rev 3859) @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Diagnostics; using System.Text; using NHibernate.Util; @@ -734,5 +735,40 @@ { return new SubselectClauseExtractor(Compact().sqlParts).GetSqlString(); } + + public bool EndsWithCaseInsensitive(string value) + { + SqlString tempSql = Compact(); + if (tempSql.Count == 0) + { + return false; + } + + string lastPart = tempSql.sqlParts[tempSql.Count - 1] as string; + + return lastPart != null && lastPart.EndsWith(value,StringComparison.InvariantCultureIgnoreCase); + + } + + public SqlString[] Split(string splitter) + { + int iterations = 0; + SqlString temp = Compact(); + List<SqlString> results = new List<SqlString>(); + int index; + do + { + index = temp.IndexOfCaseInsensitive(splitter); + int locationOfComma = index == -1 ? + temp.Length : + index; + if (iterations++ > 100) + Debugger.Break(); + + results.Add(temp.Substring(0, locationOfComma)); + temp = temp.Substring(locationOfComma+1); + } while (index != -1); + return results.ToArray(); + } } } Modified: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs 2008-10-15 13:58:32 UTC (rev 3858) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs 2008-10-15 16:59:19 UTC (rev 3859) @@ -119,5 +119,26 @@ tx.Commit(); } } + + [Test] + public void LimitingResultSetOnQueryThatIsOrderedByProjection() + { + using(var s = OpenSession()) + { + ICriteria criteria = s.CreateCriteria(typeof(TreeNode), "parent") + .Add(Restrictions.Gt("Key.Id", 0)); + + var currentAssessment = DetachedCriteria.For<TreeNode>("child") + .Add(Restrictions.EqProperty("Key.Id", "parent.Key.Id")) + .Add(Restrictions.EqProperty("Key.Area", "parent.Key.Area")) + .Add(Restrictions.Eq("Type", NodeType.Smart)) + .SetProjection(Projections.Property("Type")); + + criteria.AddOrder(Order.Asc(Projections.SubQuery(currentAssessment))) + .SetMaxResults(1000); + + criteria.List(); + } + } } } \ 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: <aye...@us...> - 2008-10-15 18:32:24
|
Revision: 3860 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3860&view=rev Author: ayenderahien Date: 2008-10-15 18:32:16 +0000 (Wed, 15 Oct 2008) Log Message: ----------- NH-1528 - fixing problem with limit clauses with order by clauses that has parameters on sql 2005. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -44,6 +44,20 @@ /// </remarks> public override SqlString GetLimitString(SqlString querySqlString, int offset, int last) { + // we have to do this in order to support parameters in order clause, the foramt + // that sql 2005 uses for paging means that we move the parameters around, which means, + // that positions are lost, so we record them before making any changes. + // NH-1528 + int parameterPositon = 0; + foreach (var part in querySqlString.Parts) + { + Parameter param = part as Parameter; + if (param == null) + continue; + param.OriginalPositionInQuery = parameterPositon; + parameterPositon += 1; + } + int fromIndex = GetFromIndex(querySqlString); SqlString select = querySqlString.Substring(0, fromIndex); List<SqlString> columnsOrAliases; Modified: trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -35,9 +35,10 @@ result.Append(sqlString.ToString()); } - void ISqlStringVisitor.Parameter() + void ISqlStringVisitor.Parameter(Parameter parameter) { - string name = formatter.GetParameterName(parameterIndex); + string name = formatter.GetParameterName( + parameter.OriginalPositionInQuery ?? parameterIndex); parameterIndex++; result.Append(name); } Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -445,6 +445,11 @@ log.Debug(string.Format("done processing result set ({0} rows)", count)); } } + catch(Exception e) + { + e.Data["actual-sql-query"] = st.CommandText; + throw; + } finally { session.Batcher.CloseCommand(st, rs); Modified: trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -6,6 +6,6 @@ { void String(string text); void String(SqlString sqlString); - void Parameter(); + void Parameter(Parameter parameter); } } Modified: trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -10,11 +10,25 @@ [Serializable] public class Parameter { - /// <summary> - /// Used as a placeholder when parsing HQL or SQL queries. - /// </summary> - public static readonly Parameter Placeholder = new Parameter(); + /// <summary> + /// We need to know what the position of the parameter was in a query + /// before we rearranged the query. + /// This is used only by dialects that rearrange the query, unforantely, + /// the MS SQL 2005 dialect have to re shuffle the query (and ruin positional parameter + /// support) because the SQL 2005 and 2008 SQL dialects have a completely broken + /// support for paging, which is just a tad less important than SELECT. + /// See NH-1528 + /// </summary> + public int? OriginalPositionInQuery; + /// <summary> + /// Used as a placeholder when parsing HQL or SQL queries. + /// </summary> + public static Parameter Placeholder + { + get { return new Parameter(); } + } + private Parameter() { } @@ -44,8 +58,9 @@ /// </returns> public override bool Equals(object obj) { - // All parameters are equal - return obj == this || obj is Parameter; + // All parameters are equal, this check that + // the other one is not null and a parameter + return obj is Parameter; } /// <summary> @@ -64,5 +79,35 @@ { return StringHelper.SqlParameter; } + + public static bool operator ==(Parameter a, Parameter b) + { + return Equals(a, b); + } + + public static bool operator ==(object a, Parameter b) + { + return Equals(a, b); + } + + public static bool operator ==(Parameter a, object b) + { + return Equals(a, b); + } + + public static bool operator !=(Parameter a, object b) + { + return !(a == b); + } + + public static bool operator !=(object a, Parameter b) + { + return !(a == b); + } + + public static bool operator !=(Parameter a, Parameter b) + { + return !(a == b); + } } } Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs =================================================================== --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -664,7 +664,7 @@ } else { - visitor.Parameter(); + visitor.Parameter((Parameter)part); } } } Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -338,9 +338,9 @@ parent.Add(sqlString); } - public void Parameter() + public void Parameter(Parameter parameter) { - parent.AddParameter(); + parent.Add(parameter); } } Modified: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -140,5 +140,25 @@ criteria.List(); } } + + [Test] + public void QueryingWithParemetersAndParaemtersInOrderBy() + { + using (var s = OpenSession()) + { + ICriteria criteria = s.CreateCriteria(typeof(TreeNode), "parent") + .Add(Restrictions.Like("Name","ayende")) + .Add(Restrictions.Gt("Key.Id", 0)); + + var currentAssessment = DetachedCriteria.For<TreeNode>("child") + .Add(Restrictions.Eq("Type", NodeType.Smart)) + .SetProjection(Projections.Property("Type")); + + criteria.AddOrder(Order.Asc(Projections.SubQuery(currentAssessment))) + .SetMaxResults(1000); + + criteria.List(); + } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml 2008-10-15 18:32:16 UTC (rev 3860) @@ -20,6 +20,7 @@ <one-to-many class="TreeNode"/> </set> <property name="Type"/> + <property name="Name"/> </class> </hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs 2008-10-15 16:59:19 UTC (rev 3859) +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs 2008-10-15 18:32:16 UTC (rev 3860) @@ -5,6 +5,7 @@ { public class TreeNode { + public virtual string Name { get; set; } public virtual Key Key { get; set; } public virtual TreeNode Parent { get; set; } public virtual NodeType Type { get; set; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: T. T. <te...@gm...> - 2008-10-15 22:24:51
|
I think this commit will resolve several other issues related to paging such as http://jira.nhibernate.org/browse/NH-1424 i need some free time to check those, maybe on friday. On Wed, Oct 15, 2008 at 9:32 PM, <aye...@us...> wrote: > Revision: 3860 > > http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3860&view=rev > Author: ayenderahien > Date: 2008-10-15 18:32:16 +0000 (Wed, 15 Oct 2008) > > Log Message: > ----------- > NH-1528 - fixing problem with limit clauses with order by clauses that has > parameters on sql 2005. > > Modified Paths: > -------------- > trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs > trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > trunk/nhibernate/src/NHibernate/Loader/Loader.cs > trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs > trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs > trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > > Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 > 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-10-15 > 18:32:16 UTC (rev 3860) > @@ -44,6 +44,20 @@ > /// </remarks> > public override SqlString GetLimitString(SqlString > querySqlString, int offset, int last) > { > + // we have to do this in order to support parameters in order > clause, the foramt > + // that sql 2005 uses for paging means that we move the > parameters around, which means, > + // that positions are lost, so we record them before making > any changes. > + // NH-1528 > + int parameterPositon = 0; > + foreach (var part in querySqlString.Parts) > + { > + Parameter param = part as Parameter; > + if (param == null) > + continue; > + param.OriginalPositionInQuery = parameterPositon; > + parameterPositon += 1; > + } > + > int fromIndex = GetFromIndex(querySqlString); > SqlString select = querySqlString.Substring(0, > fromIndex); > List<SqlString> columnsOrAliases; > > Modified: trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/Driver/SqlStringFormatter.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -35,9 +35,10 @@ > result.Append(sqlString.ToString()); > } > > - void ISqlStringVisitor.Parameter() > + void ISqlStringVisitor.Parameter(Parameter parameter) > { > - string name = > formatter.GetParameterName(parameterIndex); > + string name = formatter.GetParameterName( > + parameter.OriginalPositionInQuery ?? parameterIndex); > parameterIndex++; > result.Append(name); > } > > Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-10-15 16:59:19 > UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-10-15 18:32:16 > UTC (rev 3860) > @@ -445,6 +445,11 @@ > log.Debug(string.Format("done > processing result set ({0} rows)", count)); > } > } > + catch(Exception e) > + { > + e.Data["actual-sql-query"] = st.CommandText; > + throw; > + } > finally > { > session.Batcher.CloseCommand(st, rs); > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/ISqlStringVisitor.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -6,6 +6,6 @@ > { > void String(string text); > void String(SqlString sqlString); > - void Parameter(); > + void Parameter(Parameter parameter); > } > } > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs 2008-10-15 > 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/Parameter.cs 2008-10-15 > 18:32:16 UTC (rev 3860) > @@ -10,11 +10,25 @@ > [Serializable] > public class Parameter > { > - /// <summary> > - /// Used as a placeholder when parsing HQL or SQL queries. > - /// </summary> > - public static readonly Parameter Placeholder = new > Parameter(); > + /// <summary> > + /// We need to know what the position of the parameter was in a > query > + /// before we rearranged the query. > + /// This is used only by dialects that rearrange the query, > unforantely, > + /// the MS SQL 2005 dialect have to re shuffle the query (and ruin > positional parameter > + /// support) because the SQL 2005 and 2008 SQL dialects have a > completely broken > + /// support for paging, which is just a tad less important than > SELECT. > + /// See NH-1528 > + /// </summary> > + public int? OriginalPositionInQuery; > > + /// <summary> > + /// Used as a placeholder when parsing HQL or SQL queries. > + /// </summary> > + public static Parameter Placeholder > + { > + get { return new Parameter(); } > + } > + > private Parameter() > { > } > @@ -44,8 +58,9 @@ > /// </returns> > public override bool Equals(object obj) > { > - // All parameters are equal > - return obj == this || obj is Parameter; > + // All parameters are equal, this check that > + // the other one is not null and a parameter > + return obj is Parameter; > } > > /// <summary> > @@ -64,5 +79,35 @@ > { > return StringHelper.SqlParameter; > } > + > + public static bool operator ==(Parameter a, Parameter b) > + { > + return Equals(a, b); > + } > + > + public static bool operator ==(object a, Parameter b) > + { > + return Equals(a, b); > + } > + > + public static bool operator ==(Parameter a, object b) > + { > + return Equals(a, b); > + } > + > + public static bool operator !=(Parameter a, object b) > + { > + return !(a == b); > + } > + > + public static bool operator !=(object a, Parameter b) > + { > + return !(a == b); > + } > + > + public static bool operator !=(Parameter a, Parameter b) > + { > + return !(a == b); > + } > } > } > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 > 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlString.cs 2008-10-15 > 18:32:16 UTC (rev 3860) > @@ -664,7 +664,7 @@ > } > else > { > - visitor.Parameter(); > + visitor.Parameter((Parameter)part); > } > } > } > > Modified: trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate/SqlCommand/SqlStringBuilder.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -338,9 +338,9 @@ > parent.Add(sqlString); > } > > - public void Parameter() > + public void Parameter(Parameter parameter) > { > - parent.AddParameter(); > + parent.Add(parameter); > } > } > > > Modified: > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Fixture.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -140,5 +140,25 @@ > criteria.List(); > } > } > + > + [Test] > + public void QueryingWithParemetersAndParaemtersInOrderBy() > + { > + using (var s = OpenSession()) > + { > + ICriteria criteria = s.CreateCriteria(typeof(TreeNode), > "parent") > + .Add(Restrictions.Like("Name","ayende")) > + .Add(Restrictions.Gt("Key.Id", 0)); > + > + var currentAssessment = > DetachedCriteria.For<TreeNode>("child") > + .Add(Restrictions.Eq("Type", NodeType.Smart)) > + .SetProjection(Projections.Property("Type")); > + > + > criteria.AddOrder(Order.Asc(Projections.SubQuery(currentAssessment))) > + .SetMaxResults(1000); > + > + criteria.List(); > + } > + } > } > } > \ No newline at end of file > > Modified: > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > =================================================================== > --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/Mapping.hbm.xml > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -20,6 +20,7 @@ > <one-to-many class="TreeNode"/> > </set> > <property name="Type"/> > + <property name="Name"/> > </class> > > </hibernate-mapping> > \ No newline at end of file > > Modified: > trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > =================================================================== > --- trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > 2008-10-15 16:59:19 UTC (rev 3859) > +++ trunk/nhibernate/src/NHibernate.Test/ProjectionFixtures/TreeNode.cs > 2008-10-15 18:32:16 UTC (rev 3860) > @@ -5,6 +5,7 @@ > { > public class TreeNode > { > + public virtual string Name { get; set; } > public virtual Key Key { get; set; } > public virtual TreeNode Parent { get; set; } > public virtual NodeType Type { get; set; } > > > This was sent by the SourceForge.net collaborative development platform, > the world's largest Open Source development site. > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's > challenge > Build the coolest Linux based applications with Moblin SDK & win great > prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Nhibernate-commit mailing list > Nhi...@li... > https://lists.sourceforge.net/lists/listinfo/nhibernate-commit > -- Tuna Toksöz Typos included to enhance the readers attention! |
From: <fab...@us...> - 2008-10-16 03:32:27
|
Revision: 3862 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3862&view=rev Author: fabiomaulo Date: 2008-10-16 03:32:17 +0000 (Thu, 16 Oct 2008) Log Message: ----------- - Generic entities support trough entity-name - Improve of TypeNameParser Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/A.cs trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Mappings.hbm.xml 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 2008-10-15 21:43:03 UTC (rev 3861) +++ trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs 2008-10-16 03:32:17 UTC (rev 3862) @@ -11,6 +11,14 @@ { public static IQueryable FindQueryableUsingImports(ISessionFactoryImplementor sfi, string className) { + // 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; + if(possibleResult != null) + { + return possibleResult; + } + string importedClassName = sfi.GetImportedClassName(className); if (importedClassName == null) Modified: trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs 2008-10-15 21:43:03 UTC (rev 3861) +++ trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs 2008-10-16 03:32:17 UTC (rev 3862) @@ -7,10 +7,7 @@ { public class ParserException : ApplicationException { - public ParserException(string message) - : base(message) - { - } + public ParserException(string message) : base(message) {} } public class TypeNameParser @@ -27,7 +24,7 @@ private char[] Characters(int count) { - char[] chars = new char[count]; + var chars = new char[count]; if (input.ReadBlock(chars, 0, count) < count) { throw new ParserException(count + " characters expected"); @@ -50,13 +47,13 @@ private string AssemblyName() { - StringBuilder result = new StringBuilder(); + var result = new StringBuilder(); SkipSpaces(); int code; while ((code = input.Peek()) != -1) { - char ch = (char) code; + var ch = (char) code; if (ch == ']') { @@ -69,27 +66,47 @@ return result.ToString(); } - private string BracketedPart() + private string BracketedPart(string defaultNamespace, string defaultAssembly) { Debug.Assert(input.Peek() == '['); - StringBuilder result = new StringBuilder(); + var result = new StringBuilder(); + var genericTypeName = new StringBuilder(200); int depth = 0; do { - if (input.Peek() == '[') + int c = input.Peek(); + if (c == '[') { depth++; + result.Append(PossiblyEscapedCharacter()); } - else if (input.Peek() == ']') + 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()); + } + } + while (depth > 0 && input.Peek() != -1); - result.Append(PossiblyEscapedCharacter()); - } while (depth > 0 && input.Peek() != -1); - if (depth > 0 && input.Peek() == -1) { throw new ParserException("Unmatched left bracket ('[')"); @@ -101,51 +118,54 @@ public AssemblyQualifiedTypeName ParseTypeName(string text, string defaultNamespace, string defaultAssembly) { text = text.Trim(); - - StringBuilder type = new StringBuilder(text.Length); + if (IsSystemType(text)) + { + defaultNamespace = null; + defaultAssembly = null; + } + var type = new StringBuilder(text.Length); string assembly = StringHelper.IsEmpty(defaultAssembly) ? null : defaultAssembly; try { bool seenNamespace = false; - input = new StringReader(text); - - int code; - while ((code = input.Peek()) != -1) + using (input = new StringReader(text)) { - char ch = (char) code; - - if (ch == '.') + int code; + while ((code = input.Peek()) != -1) { - seenNamespace = true; - } + var ch = (char) code; - if (ch == ',') - { - input.Read(); - assembly = AssemblyName(); - if (input.Peek() != -1) + if (ch == '.') { - throw new ParserException("Extra characters found at the end of the type name"); + seenNamespace = true; } + + if (ch == ',') + { + input.Read(); + assembly = AssemblyName(); + if (input.Peek() != -1) + { + throw new ParserException("Extra characters found at the end of the type name"); + } + } + else if (ch == '[') + { + type.Append(BracketedPart(defaultNamespace, defaultAssembly)); + } + else + { + type.Append(PossiblyEscapedCharacter()); + } } - else if (ch == '[') - { - type.Append(BracketedPart()); - } - else - { - type.Append(PossiblyEscapedCharacter()); - } + + input.Close(); } - - input.Close(); - if (!seenNamespace && StringHelper.IsNotEmpty(defaultNamespace)) { - type.Insert(0, '.') - .Insert(0, defaultNamespace); + type.Insert(0, '.').Insert(0, defaultNamespace); } return new AssemblyQualifiedTypeName(type.ToString(), assembly); } @@ -155,6 +175,11 @@ } } + private bool IsSystemType(string tyname) + { + return tyname.StartsWith("System"); // ugly + } + public static AssemblyQualifiedTypeName Parse(string text) { return Parse(text, null, null); Modified: trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/A.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/A.cs 2008-10-15 21:43:03 UTC (rev 3861) +++ trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/A.cs 2008-10-16 03:32:17 UTC (rev 3862) @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; namespace NHibernate.Test.GenericTest.Overall @@ -9,26 +8,10 @@ /// </summary> public class A<T> { - private int? id; - private IList<T> collection; - private T property; + public virtual int? Id { get; set; } - public virtual int? Id - { - get { return id; } - set { id = value; } - } + public virtual T Property { get; set; } - public virtual T Property - { - get { return property; } - set { property = value; } - } - - public virtual IList<T> Collection - { - get { return collection; } - set { collection = value; } - } + public virtual IList<T> Collection { get; set; } } } Modified: trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs 2008-10-15 21:43:03 UTC (rev 3861) +++ trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs 2008-10-16 03:32:17 UTC (rev 3862) @@ -1,4 +1,3 @@ -using System; using System.Collections; using System.Collections.Generic; @@ -7,12 +6,11 @@ namespace NHibernate.Test.GenericTest.Overall { [TestFixture] - [Ignore( "Generic entities not supported" )] public class Fixture : TestCase { protected override IList Mappings { - get { return new string[] { "GenericTest.Overall.Mappings.hbm.xml" }; } + get { return new[] { "GenericTest.Overall.Mappings.hbm.xml" }; } } protected override string MappingsAssembly @@ -23,22 +21,19 @@ [Test] public void CRUD() { - A<int> entity = new A<int>(); - entity.Property = 10; - entity.Collection = new List<int>(); - entity.Collection.Add( 20 ); + var entity = new A<int> {Property = 10, Collection = new List<int> {20}}; using( ISession session = OpenSession() ) using( ITransaction transaction = session.BeginTransaction() ) { - session.Save( entity ); + session.Save("AInt", entity); transaction.Commit(); } using( ISession session = OpenSession() ) using( ITransaction transaction = session.BeginTransaction() ) { - session.Delete( entity ); + session.Delete("AInt", entity); transaction.Commit(); } } Modified: trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Mappings.hbm.xml 2008-10-15 21:43:03 UTC (rev 3861) +++ trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Mappings.hbm.xml 2008-10-16 03:32:17 UTC (rev 3862) @@ -4,7 +4,7 @@ assembly="NHibernate.Test" namespace="NHibernate.Test.GenericTest.Overall"> - <class name="A`1[System.Int32]" table="A"> + <class name="A`1[System.Int32]" table="AInt" entity-name="AInt"> <id name="Id"> <generator class="native" /> Modified: trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs 2008-10-15 21:43:03 UTC (rev 3861) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs 2008-10-16 03:32:17 UTC (rev 3862) @@ -127,5 +127,74 @@ { TypeNameParser.Parse("\\"); } + + [Test] + public void ParseGenericTypeNameWithDefaults() + { + string fullSpec = "TName`1[PartialName]"; + string defaultassembly = "SomeAssembly"; + string defaultNamespace = "SomeAssembly.MyNS"; + string expectedType = "SomeAssembly.MyNS.TName`1[SomeAssembly.MyNS.PartialName, SomeAssembly]"; + string expectedAssembly = "SomeAssembly"; + + AssemblyQualifiedTypeName tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); + Assert.AreEqual(expectedType, tn.Type, "Type name should match"); + Assert.AreEqual(expectedAssembly, tn.Assembly, "Assembly name should match"); + + fullSpec = "TName`1[[PartialName]]"; + defaultassembly = "SomeAssembly"; + defaultNamespace = "SomeAssembly.MyNS"; + expectedType = "SomeAssembly.MyNS.TName`1[[SomeAssembly.MyNS.PartialName, SomeAssembly]]"; + expectedAssembly = "SomeAssembly"; + + tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); + Assert.AreEqual(expectedType, tn.Type, "Type name should match"); + Assert.AreEqual(expectedAssembly, tn.Assembly, "Assembly name should match"); + + fullSpec = "TName`2[[PartialName],[OtherPartialName]]"; + defaultassembly = "SomeAssembly"; + defaultNamespace = "SomeAssembly.MyNS"; + expectedType = "SomeAssembly.MyNS.TName`2[[SomeAssembly.MyNS.PartialName, SomeAssembly],[SomeAssembly.MyNS.OtherPartialName, SomeAssembly]]"; + expectedAssembly = "SomeAssembly"; + tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); + Assert.AreEqual(expectedType, tn.Type, "Type name should match"); + Assert.AreEqual(expectedAssembly, tn.Assembly, "Assembly name should match"); + } + + [Test] + public void ParseGenericTypeNameWithDefaultNamespaceUnused() + { + 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 expectedAssembly = "SomeAssembly"; + + AssemblyQualifiedTypeName tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); + Assert.AreEqual(expectedType, tn.Type, "Type name should match"); + Assert.AreEqual(expectedAssembly, tn.Assembly, "Assembly name should match"); + + fullSpec = "SomeType`1[System.Int32]"; + defaultassembly = "SomeAssembly"; + defaultNamespace = null; + expectedType = "SomeType`1[System.Int32]"; + expectedAssembly = "SomeAssembly"; + + tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); + Assert.AreEqual(expectedType, tn.Type, "Type name should match"); + Assert.AreEqual(expectedAssembly, tn.Assembly, "Assembly name should match"); + + fullSpec = typeof(MyGClass<int>).AssemblyQualifiedName; + defaultassembly = "SomeAssembly"; + defaultNamespace = "SomeAssembly.MyNS"; + expectedType = typeof(MyGClass<int>).AssemblyQualifiedName; + tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); + Assert.AreEqual(expectedType, tn.Type + ", " + tn.Assembly, "Type name should match"); + } + + public class MyGClass<T> + { + + } } } \ 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...> - 2008-10-18 22:18:25
|
Revision: 3865 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3865&view=rev Author: fabiomaulo Date: 2008-10-18 22:18:15 +0000 (Sat, 18 Oct 2008) Log Message: ----------- - Fix NH-1495 and NH-1083 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Tuple/Entity/AbstractEntityTuplizer.cs trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/UtilityTest/ReflectHelperFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Person.cs Modified: trunk/nhibernate/src/NHibernate/Tuple/Entity/AbstractEntityTuplizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tuple/Entity/AbstractEntityTuplizer.cs 2008-10-18 04:06:39 UTC (rev 3864) +++ trunk/nhibernate/src/NHibernate/Tuple/Entity/AbstractEntityTuplizer.cs 2008-10-18 22:18:15 UTC (rev 3865) @@ -71,20 +71,7 @@ if (entityMetamodel.IsLazy) { - /* NH Different implementation - * When we are using an interface we need to use the interface itself to have - * the getter and setter of the identifier to prevent proxy initialization. - * The BasicLazyInitializer use method.Equals to recognize the the identifier setter. - */ - IGetter pidGetter = idGetter; - ISetter pidSetter = idSetter; - if (mappingInfo.HasIdentifierProperty && mappingInfo.ProxyInterface != null) - { - pidGetter = mappingInfo.IdentifierProperty.GetGetter(mappingInfo.ProxyInterface); - pidSetter = mappingInfo.IdentifierProperty.GetSetter(mappingInfo.ProxyInterface); - } - proxyFactory = BuildProxyFactory(mappingInfo, pidGetter, pidSetter); - /*******************************************************************************/ + proxyFactory = BuildProxyFactory(mappingInfo, idGetter, idSetter); if (proxyFactory == null) { entityMetamodel.IsLazy = false; Modified: trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs 2008-10-18 04:06:39 UTC (rev 3864) +++ trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs 2008-10-18 22:18:15 UTC (rev 3865) @@ -10,6 +10,7 @@ using NHibernate.Properties; using NHibernate.Proxy; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Tuple.Entity { @@ -144,13 +145,11 @@ MethodInfo idGetterMethod = idGetter == null ? null : idGetter.Method; MethodInfo idSetterMethod = idSetter == null ? null : idSetter.Method; - MethodInfo proxyGetIdentifierMethod = idGetterMethod == null || _proxyInterface == null ? null : - idGetterMethod; - // TODO H3.2 different behaviour ReflectHelper.GetMethod(_proxyInterface, idGetterMethod); + MethodInfo proxyGetIdentifierMethod = idGetterMethod == null || _proxyInterface == null ? null : + ReflectHelper.TryGetMethod(_proxyInterface, idGetterMethod); - MethodInfo proxySetIdentifierMethod = idSetterMethod == null || _proxyInterface == null ? null : - idSetterMethod; - // TODO H3.2 different behaviour ReflectHelper.GetMethod(_proxyInterface, idSetterMethod); + MethodInfo proxySetIdentifierMethod = idSetterMethod == null || _proxyInterface == null ? null : + ReflectHelper.TryGetMethod(_proxyInterface, idSetterMethod); IProxyFactory pf = BuildProxyFactoryInternal(persistentClass, idGetter, idSetter); try Modified: trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2008-10-18 04:06:39 UTC (rev 3864) +++ trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2008-10-18 22:18:15 UTC (rev 3865) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Reflection; using System.Text; using log4net; @@ -12,6 +13,9 @@ /// </summary> public sealed class ReflectHelper { + private const BindingFlags defaultBindingFlags = + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; + private static readonly ILog log = LogManager.GetLogger(typeof(ReflectHelper)); public static BindingFlags AnyVisibilityInstance = BindingFlags.Instance | BindingFlags.Public | @@ -445,5 +449,89 @@ Exception_InternalPreserveStackTrace.Invoke(ex.InnerException, new Object[] {}); return ex.InnerException; } + + /// <summary> + /// Try to find a method in a given type. + /// </summary> + /// <param name="type">The given type.</param> + /// <param name="method">The method info.</param> + /// <returns>The found method or null.</returns> + /// <remarks> + /// The <paramref name="method"/>, in general, become from another <see cref="Type"/>. + /// </remarks> + public static MethodInfo TryGetMethod(System.Type type, MethodInfo method) + { + if (type == null) + { + throw new ArgumentNullException("type"); + } + + if (method == null) + { + return null; + } + + System.Type[] tps = GetMethodSignature(method); + try + { + return type.GetMethod(method.Name, defaultBindingFlags, null, tps, null); + } + catch (Exception) + { + return null; + } + } + + /// <summary> + /// Try to find a method in a serie of given types. + /// </summary> + /// <param name="types">The serie of types where find.</param> + /// <param name="method">The method info.</param> + /// <returns>The found method or null.</returns> + /// <remarks> + /// The <paramref name="method"/>, in general, become from another <see cref="Type"/>. + /// </remarks> + public static MethodInfo TryGetMethod(IEnumerable<System.Type> types, MethodInfo method) + { + // This method will be used when we support multiple proxy interfaces. + if (types == null) + { + throw new ArgumentNullException("types"); + } + if (method == null) + { + return null; + } + + System.Type[] tps = GetMethodSignature(method); + MethodInfo result = null; + foreach (var type in types) + { + try + { + result = type.GetMethod(method.Name, defaultBindingFlags, null, tps, null); + if (result != null) + { + return result; + } + } + catch (Exception) + { + return null; + } + } + return result; + } + + private static System.Type[] GetMethodSignature(MethodInfo method) + { + var pi = method.GetParameters(); + var tps = new System.Type[pi.Length]; + for (int i = 0; i < pi.Length; i++) + { + tps[i] = pi[i].ParameterType; + } + return tps; + } } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Fixture.cs 2008-10-18 22:18:15 UTC (rev 3865) @@ -0,0 +1,42 @@ +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1495 +{ + [TestFixture] + public class Fixture : BugTestCase + { + [Test] + public void CreateTest() + { + object id; + + using (ISession session = OpenSession()) + { + var person = new Person {Name = "Nelo"}; + + using (ITransaction trans = session.BeginTransaction()) + { + session.Save(person); + trans.Commit(); + } + + id = person.Id; + } + + using (ISession session = OpenSession()) + { + var person = (IPerson)session.Load(typeof(Person), id); //to work with the proxy + + Assert.IsNotNull(person); + Assert.AreEqual("Nelo", person.Name); + + using (ITransaction trans = session.BeginTransaction()) + { + session.Delete(person); + trans.Commit(); + } + } + } + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Mappings.hbm.xml 2008-10-18 22:18:15 UTC (rev 3865) @@ -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.NH1495"> + + <class name="Person" proxy="IPerson"> + <id name="Id" type="Int64" access="backfield"> + <generator class="hilo" /> + </id> + <property name="Name" /> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Person.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1495/Person.cs 2008-10-18 22:18:15 UTC (rev 3865) @@ -0,0 +1,15 @@ +namespace NHibernate.Test.NHSpecificTest.NH1495 +{ + public interface IPerson + { + object Id { get;} + string Name { get; set; } + } + + public class Person : IPerson + { + public object Id { get; private set; } + + public string Name { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-18 04:06:39 UTC (rev 3864) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-18 22:18:15 UTC (rev 3865) @@ -502,6 +502,8 @@ <Compile Include="NHSpecificTest\NH1492\ChildEntity.cs" /> <Compile Include="NHSpecificTest\NH1492\Entity.cs" /> <Compile Include="NHSpecificTest\NH1492\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1495\Person.cs" /> + <Compile Include="NHSpecificTest\NH1495\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1499\Document.cs" /> <Compile Include="NHSpecificTest\NH1499\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1499\Person.cs" /> @@ -1503,6 +1505,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1495\Mappings.hbm.xml" /> <EmbeddedResource Include="ProjectionFixtures\Mapping.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1033\Mappings.hbm.xml" /> <EmbeddedResource Include="EntityModeTest\Multi\Stock.hbm.xml" /> Modified: trunk/nhibernate/src/NHibernate.Test/UtilityTest/ReflectHelperFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/ReflectHelperFixture.cs 2008-10-18 04:06:39 UTC (rev 3864) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/ReflectHelperFixture.cs 2008-10-18 22:18:15 UTC (rev 3865) @@ -1,7 +1,9 @@ using System; +using System.Reflection; using NHibernate.DomainModel; using NHibernate.Util; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; namespace NHibernate.Test.UtilityTest { @@ -50,6 +52,33 @@ System.Type int32 = ReflectHelper.ClassForName("System.Int32"); Assert.AreEqual(typeof(Int32), int32); } + + [Test] + public void TryGetMethod() + { + const BindingFlags bf = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; + MethodInfo mig = typeof (MyBaseImplementation).GetMethod("get_Id", bf); + MethodInfo mis = typeof(MyBaseImplementation).GetMethod("set_Id", bf); + MethodInfo mng = typeof(MyBaseImplementation).GetMethod("get_Name", bf); + MethodInfo mns = typeof(MyBaseImplementation).GetMethod("set_Name", bf); + Assert.That(ReflectHelper.TryGetMethod(typeof(IMyBaseInterface), mig), Is.Not.Null); + Assert.That(ReflectHelper.TryGetMethod(typeof(IMyBaseInterface), mis), Is.Null); + Assert.That(ReflectHelper.TryGetMethod(typeof(IMyBaseInterface), mng), Is.Not.Null); + Assert.That(ReflectHelper.TryGetMethod(typeof(IMyBaseInterface), mns), Is.Not.Null); + + mig = typeof(MyImplementation).GetMethod("get_Id", bf); + mis = typeof(MyImplementation).GetMethod("set_Id", bf); + mng = typeof(MyImplementation).GetMethod("get_Name", bf); + mns = typeof(MyImplementation).GetMethod("set_Name", bf); + MethodInfo mdg = typeof(MyImplementation).GetMethod("get_Description", bf); + MethodInfo mds = typeof(MyImplementation).GetMethod("set_Description", bf); + Assert.That(ReflectHelper.TryGetMethod(new[] { typeof(IMyBaseInterface), typeof(IMyInterface) }, mig), Is.Not.Null); + Assert.That(ReflectHelper.TryGetMethod(new[] { typeof(IMyBaseInterface), typeof(IMyInterface) }, mis), Is.Null); + Assert.That(ReflectHelper.TryGetMethod(new[] { typeof(IMyBaseInterface), typeof(IMyInterface) }, mng), Is.Not.Null); + Assert.That(ReflectHelper.TryGetMethod(new[] { typeof(IMyBaseInterface), typeof(IMyInterface) }, mns), Is.Not.Null); + Assert.That(ReflectHelper.TryGetMethod(new[] { typeof(IMyBaseInterface), typeof(IMyInterface) }, mdg), Is.Not.Null); + Assert.That(ReflectHelper.TryGetMethod(new[] { typeof(IMyBaseInterface), typeof(IMyInterface) }, mds), Is.Null); + } } public class ARhf @@ -68,4 +97,29 @@ public class BRhf : ARhf { } + + public interface IMyBaseInterface + { + int Id { get; } + string Name { get; set; } + } + + public interface IMyInterface: IMyBaseInterface + { + string Description { get; } + } + + public class MyBaseImplementation : IMyBaseInterface + { + public int Id { get; set; } + public string Name { get; set; } + } + + public class MyImplementation: IMyInterface + { + public int Id{ get; set; } + public string Name { get; set; } + public string Description { get; set; } + } + } \ 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...> - 2008-10-19 21:16:51
|
Revision: 3867 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3867&view=rev Author: fabiomaulo Date: 2008-10-19 21:16:44 +0000 (Sun, 19 Oct 2008) Log Message: ----------- Improv session Load to use entity-name Possible breaking change for related FWs: see ISession Modified Paths: -------------- trunk/nhibernate/src/NHibernate/ISession.cs trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs Modified: trunk/nhibernate/src/NHibernate/ISession.cs =================================================================== --- trunk/nhibernate/src/NHibernate/ISession.cs 2008-10-19 20:25:16 UTC (rev 3866) +++ trunk/nhibernate/src/NHibernate/ISession.cs 2008-10-19 21:16:44 UTC (rev 3867) @@ -214,6 +214,16 @@ /// <returns>the persistent instance</returns> object Load(System.Type theType, object id, LockMode lockMode); + /// <summary> + /// Return the persistent instance of the given entity class with the given identifier, + /// obtaining the specified lock mode, assuming the instance exists. + /// </summary> + /// <param name="entityName">The entity-name of a persistent class</param> + /// <param name="id">a valid identifier of an existing persistent instance of the class </param> + /// <param name="lockMode">the lock level </param> + /// <returns> the persistent instance or proxy </returns> + object Load(string entityName, object id, LockMode lockMode); + /// <summary> /// Return the persistent instance of the given entity class with the given identifier, /// assuming that the instance exists. @@ -252,6 +262,20 @@ /// <returns>The persistent instance or proxy</returns> T Load<T>(object id); + /// <summary> + /// Return the persistent instance of the given <paramref name="entityName"/> with the given identifier, + /// assuming that the instance exists. + /// </summary> + /// <param name="entityName">The entity-name of a persistent class</param> + /// <param name="id">a valid identifier of an existing persistent instance of the class </param> + /// <returns> The persistent instance or proxy </returns> + /// <remarks> + /// You should not use this method to determine if an instance exists (use <see cref="Get(string,object)"/> + /// instead). Use this only to retrieve an instance that you assume exists, where non-existence + /// would be an actual error. + /// </remarks> + object Load(string entityName, object id); + /// <summary> /// Read the persistent state associated with the given identifier into the given transient /// instance. Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2008-10-19 20:25:16 UTC (rev 3866) +++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2008-10-19 21:16:44 UTC (rev 3867) @@ -47,7 +47,7 @@ private readonly IInterceptor interceptor; - [NonSerialized] private readonly EntityMode entityMode = NHibernate.EntityMode.Poco; + [NonSerialized] private readonly EntityMode entityMode = EntityMode.Poco; [NonSerialized] private readonly EventListeners listeners; @@ -58,7 +58,7 @@ private readonly ConnectionManager connectionManager; [NonSerialized] - private int dontFlushFromFind = 0; + private int dontFlushFromFind; [NonSerialized] private readonly IDictionary<string, IFilter> enabledFilters = new Dictionary<string, IFilter>(); @@ -541,7 +541,7 @@ public IEnumerable Enumerable(string query, object value, IType type) { - return Enumerable(query, new object[] { value }, new IType[] { type }); + return Enumerable(query, new[] { value }, new[] { type }); } public IEnumerable Enumerable(string query, object[] values, IType[] types) @@ -594,7 +594,7 @@ public int Delete(string query, object value, IType type) { - return Delete(query, new object[] { value }, new IType[] { type }); + return Delete(query, new[] { value }, new[] { type }); } public int Delete(string query, object[] values, IType[] types) @@ -937,28 +937,61 @@ return autoFlushEvent.FlushRequired; } + #region load()/get() operations + public void Load(object obj, object id) { LoadEvent loadEvent = new LoadEvent(id, obj, this); FireLoad(loadEvent, LoadEventListener.Reload); } - public object Load(System.Type clazz, object id) + public T Load<T>(object id) { + return (T)Load(typeof(T), id); + } + + public T Load<T>(object id, LockMode lockMode) + { + return (T)Load(typeof(T), id, lockMode); + } + + /// <summary> + /// Load the data for the object with the specified id into a newly created object + /// using "for update", if supported. A new key will be assigned to the object. + /// This should return an existing proxy where appropriate. + /// + /// If the object does not exist in the database, an exception is thrown. + /// </summary> + /// <param name="entityClass"></param> + /// <param name="id"></param> + /// <param name="lockMode"></param> + /// <returns></returns> + /// <exception cref="ObjectNotFoundException"> + /// Thrown when the object with the specified id does not exist in the database. + /// </exception> + public object Load(System.Type entityClass, object id, LockMode lockMode) + { + return Load(entityClass.FullName, id, lockMode); + } + + public object Load(string entityName, object id) + { if (id == null) { throw new ArgumentNullException("id", "null is not a valid identifier"); } - LoadEvent loadEvent = new LoadEvent(id, clazz.FullName, false, this); + + var @event = new LoadEvent(id, entityName, false, this); bool success = false; try { - FireLoad(loadEvent, LoadEventListener.Load); - if (loadEvent.Result == null) - Factory.EntityNotFoundDelegate.HandleEntityNotFound(clazz.FullName, id); - + FireLoad(@event, LoadEventListener.Load); + if (@event.Result == null) + { + Factory.EntityNotFoundDelegate.HandleEntityNotFound(entityName, id); + } success = true; - return loadEvent.Result; + return @event.Result; } finally { @@ -966,14 +999,16 @@ } } - public T Load<T>(object id) + public object Load(string entityName, object id, LockMode lockMode) { - return (T)Load(typeof(T), id); + var @event = new LoadEvent(id, entityName, lockMode, this); + FireLoad(@event, LoadEventListener.Load); + return @event.Result; } - public T Load<T>(object id, LockMode lockMode) + public object Load(System.Type entityClass, object id) { - return (T)Load(typeof(T), id, lockMode); + return Load(entityClass.FullName, id); } public T Get<T>(object id) @@ -986,6 +1021,29 @@ return (T)Get(typeof(T), id, lockMode); } + public object Get(System.Type entityClass, object id) + { + return Get(entityClass.FullName, id); + } + + /// <summary> + /// Load the data for the object with the specified id into a newly created object + /// using "for update", if supported. A new key will be assigned to the object. + /// This should return an existing proxy where appropriate. + /// + /// If the object does not exist in the database, null is returned. + /// </summary> + /// <param name="clazz"></param> + /// <param name="id"></param> + /// <param name="lockMode"></param> + /// <returns></returns> + public object Get(System.Type clazz, object id, LockMode lockMode) + { + LoadEvent loadEvent = new LoadEvent(id, clazz.FullName, lockMode, this); + FireLoad(loadEvent, LoadEventListener.Get); + return loadEvent.Result; + } + public string GetEntityName(object obj) { CheckAndUpdateSessionStatus(); @@ -1011,11 +1069,6 @@ return entry.Persister.EntityName; } - public object Get(System.Type entityClass, object id) - { - return Get(entityClass.FullName, id); - } - public object Get(string entityName, object id) { LoadEvent loadEvent = new LoadEvent(id, entityName, false, this); @@ -1068,45 +1121,8 @@ return loadEvent.Result; } - /// <summary> - /// Load the data for the object with the specified id into a newly created object - /// using "for update", if supported. A new key will be assigned to the object. - /// This should return an existing proxy where appropriate. - /// - /// If the object does not exist in the database, an exception is thrown. - /// </summary> - /// <param name="clazz"></param> - /// <param name="id"></param> - /// <param name="lockMode"></param> - /// <returns></returns> - /// <exception cref="ObjectNotFoundException"> - /// Thrown when the object with the specified id does not exist in the database. - /// </exception> - public object Load(System.Type clazz, object id, LockMode lockMode) - { - LoadEvent loadEvent = new LoadEvent(id, clazz.FullName, lockMode, this); - FireLoad(loadEvent, LoadEventListener.Load); - return loadEvent.Result; - } + #endregion - /// <summary> - /// Load the data for the object with the specified id into a newly created object - /// using "for update", if supported. A new key will be assigned to the object. - /// This should return an existing proxy where appropriate. - /// - /// If the object does not exist in the database, null is returned. - /// </summary> - /// <param name="clazz"></param> - /// <param name="id"></param> - /// <param name="lockMode"></param> - /// <returns></returns> - public object Get(System.Type clazz, object id, LockMode lockMode) - { - LoadEvent loadEvent = new LoadEvent(id, clazz.FullName, lockMode, this); - FireLoad(loadEvent, LoadEventListener.Get); - return loadEvent.Result; - } - public void Refresh(object obj) { FireRefresh(new RefreshEvent(obj, this)); @@ -1616,7 +1632,7 @@ public IQuery CreateSQLQuery(string sql, string returnAlias, System.Type returnClass) { CheckAndUpdateSessionStatus(); - return new SqlQueryImpl(sql, new string[] { returnAlias }, new System.Type[] { returnClass }, this, Factory.QueryPlanCache.GetSQLParameterMetadata(sql)); + return new SqlQueryImpl(sql, new[] { returnAlias }, new[] { returnClass }, this, Factory.QueryPlanCache.GetSQLParameterMetadata(sql)); } public IQuery CreateSQLQuery(string sql, string[] returnAliases, System.Type[] returnClasses) @@ -1798,7 +1814,7 @@ } string filterName = filterParameterName.Substring(0, dot); string parameterName = filterParameterName.Substring(dot + 1); - return new string[] { filterName, parameterName }; + return new[] { filterName, parameterName }; } public override ConnectionManager ConnectionManager This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-10-20 15:43:17
|
Revision: 3868 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3868&view=rev Author: fabiomaulo Date: 2008-10-20 15:43:09 +0000 (Mon, 20 Oct 2008) Log Message: ----------- - Fix NH-1538, NH-1537 (new feature comments) - Refactoring in tests (to have only one namespace for various HQL tests) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate/IQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd trunk/nhibernate/src/NHibernate.Test/HQL/Animal.cs trunk/nhibernate/src/NHibernate.Test/HQL/Animal.hbm.xml trunk/nhibernate/src/NHibernate.Test/HQL/BaseFunctionFixture.cs trunk/nhibernate/src/NHibernate.Test/HQL/HQLFunctions.cs trunk/nhibernate/src/NHibernate.Test/HQL/Human.cs trunk/nhibernate/src/NHibernate.Test/HQL/MaterialResource.cs trunk/nhibernate/src/NHibernate.Test/HQL/MaterialResource.hbm.xml trunk/nhibernate/src/NHibernate.Test/HQL/Name.cs trunk/nhibernate/src/NHibernate.Test/HQL/SQLFunctionTemplateTest.cs trunk/nhibernate/src/NHibernate.Test/HQL/SimpleFunctionsTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/HQL/ trunk/nhibernate/src/NHibernate.Test/HQL/HqlFixture.cs trunk/nhibernate/src/NHibernate.Test/HQL/SqlCommentsFixture.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/ Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-10-19 21:16:44 UTC (rev 3867) +++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -93,6 +93,7 @@ public const string ShowSql = "show_sql"; public const string MaxFetchDepth = "max_fetch_depth"; public const string CurrentSessionContextClass = "current_session_context_class"; + public const string UseSqlComments = "use_sql_comments"; // Unused, Java-specific public const string UseGetGeneratedKeys = "jdbc.use_get_generated_keys"; Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2008-10-19 21:16:44 UTC (rev 3867) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -65,6 +65,10 @@ #endregion + bool comments = PropertiesHelper.GetBoolean(Environment.UseSqlComments, properties); + log.Info("Generate SQL with comments: " + EnabledDisabled(comments)); + settings.IsCommentsEnabled = comments; + int maxFetchDepth = PropertiesHelper.GetInt32(Environment.MaxFetchDepth, properties, -1); if (maxFetchDepth != -1) { Modified: trunk/nhibernate/src/NHibernate/IQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQuery.cs 2008-10-19 21:16:44 UTC (rev 3867) +++ trunk/nhibernate/src/NHibernate/IQuery.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -62,6 +62,10 @@ /// </summary> IType[] ReturnTypes { get; } + /// <summary> Return the HQL select clause aliases (if any)</summary> + /// <returns> an array of aliases as strings </returns> + string[] ReturnAliases{get;} + /// <summary> /// The names of all named parameters of the query /// </summary> @@ -123,12 +127,17 @@ /// </exception> object UniqueResult(); - /// <summary> /// Strongly-typed version of <see cref="UniqueResult()"/>. /// </summary> T UniqueResult<T>(); + /// <summary> + /// Execute the update or delete statement. + /// </summary> + /// <returns> The number of entities updated or deleted. </returns> + int ExecuteUpdate(); + /// <summary> /// Set the maximum number of rows to retrieve. /// </summary> @@ -141,6 +150,13 @@ /// <param name="firstResult">The first row to retreive.</param> IQuery SetFirstResult(int firstResult); + /// <summary> + /// Entities retrieved by this query will be loaded in + /// a read-only mode where Hibernate will never dirty-check + /// them or make changes persistent. + /// </summary> + IQuery SetReadOnly(bool readOnly); + /// <summary> /// Enable caching of this query result set. /// </summary> @@ -152,19 +168,16 @@ /// for the default query cache</param> IQuery SetCacheRegion(string cacheRegion); - /// <summary> - /// Entities retrieved by this query will be loaded in - /// a read-only mode where Hibernate will never dirty-check - /// them or make changes persistent. - /// </summary> - IQuery SetReadOnly(bool readOnly); - /// <summary> /// The timeout for the underlying ADO query /// </summary> /// <param name="timeout"></param> IQuery SetTimeout(int timeout); + /// <summary> Set a fetch size for the underlying ADO query.</summary> + /// <param name="fetchSize">the fetch size </param> + IQuery SetFetchSize(int fetchSize); + /// <summary> /// Set the lockmode for the objects idententified by the /// given alias that appears in the <c>FROM</c> clause. @@ -173,7 +186,21 @@ /// <param name="lockMode"></param> IQuery SetLockMode(string alias, LockMode lockMode); + /// <summary> Add a comment to the generated SQL.</summary> + /// <param name="comment">a human-readable string </param> + IQuery SetComment(string comment); + /// <summary> + /// Override the current session flush mode, just for this query. + /// </summary> + IQuery SetFlushMode(FlushMode flushMode); + + /// <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> + IQuery SetCacheMode(CacheMode cacheMode); + + /// <summary> /// Bind a value to an indexed parameter. /// </summary> /// <param name="position">Position of the parameter in the query, numbered from <c>0</c></param> @@ -395,20 +422,6 @@ IQuery SetDouble(string name, double val); /// <summary> - /// Bind an instance of a mapped persistent class to an indexed parameter. - /// </summary> - /// <param name="position">Position of the parameter in the query string, numbered from <c>0</c></param> - /// <param name="val">A non-null instance of a persistent class</param> - IQuery SetEntity(int position, object val); - - /// <summary> - /// Bind an instance of a mapped persistent class to a named parameter. - /// </summary> - /// <param name="name">The name of the parameter</param> - /// <param name="val">A non-null instance of a persistent class</param> - IQuery SetEntity(string name, object val); - - /// <summary> /// Bind an instance of a persistent enumeration class to an indexed parameter /// using an NHibernate <see cref="PersistentEnumType"/>. /// </summary> @@ -553,25 +566,23 @@ IQuery SetGuid(string name, Guid val); /// <summary> - /// Override the current session flush mode, just for this query. + /// Bind an instance of a mapped persistent class to an indexed parameter. /// </summary> - IQuery SetFlushMode(FlushMode flushMode); + /// <param name="position">Position of the parameter in the query string, numbered from <c>0</c></param> + /// <param name="val">A non-null instance of a persistent class</param> + IQuery SetEntity(int position, object val); /// <summary> + /// Bind an instance of a mapped persistent class to a named parameter. + /// </summary> + /// <param name="name">The name of the parameter</param> + /// <param name="val">A non-null instance of a persistent class</param> + IQuery SetEntity(string name, object val); + + /// <summary> /// Set a strategy for handling the query results. This can be used to change /// "shape" of the query result. /// </summary> IQuery SetResultTransformer(IResultTransformer resultTransformer); - - /// <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> - IQuery SetCacheMode(CacheMode cacheMode); - - /// <summary> - /// Execute the update or delete statement. - /// </summary> - /// <returns> The number of entities updated or deleted. </returns> - int ExecuteUpdate(); } } Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2008-10-19 21:16:44 UTC (rev 3867) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -43,8 +43,9 @@ private bool shouldIgnoredUnknownNamedParameters; private CacheMode? cacheMode; private CacheMode? sessionCacheMode; + private string comment; - public AbstractQueryImpl(string queryString, FlushMode flushMode, ISessionImplementor session, + protected AbstractQueryImpl(string queryString, FlushMode flushMode, ISessionImplementor session, ParameterMetadata parameterMetadata) { this.session = session; @@ -76,7 +77,7 @@ { if (parameterMetadata.NamedParameterNames.Count != namedParameters.Count + namedParameterLists.Count) { - HashedSet<string> missingParams = new HashedSet<string>(parameterMetadata.NamedParameterNames); + var missingParams = new HashedSet<string>(parameterMetadata.NamedParameterNames); missingParams.RemoveAll(namedParameterLists.Keys); missingParams.RemoveAll(namedParameters.Keys); throw new QueryException("Not all named parameters have been set: " + CollectionPrinter.ToString(missingParams), QueryString); @@ -119,51 +120,31 @@ protected internal virtual IType DetermineType(int paramPosition, object paramValue, IType defaultType) { - IType type = parameterMetadata.GetOrdinalParameterExpectedType(paramPosition + 1); - if (type == null) - { - type = defaultType; - } + IType type = parameterMetadata.GetOrdinalParameterExpectedType(paramPosition + 1) ?? defaultType; return type; } protected internal virtual IType DetermineType(int paramPosition, object paramValue) { - IType type = parameterMetadata.GetOrdinalParameterExpectedType(paramPosition + 1); - if (type == null) - { - type = GuessType(paramValue); - } + IType type = parameterMetadata.GetOrdinalParameterExpectedType(paramPosition + 1) ?? GuessType(paramValue); return type; } protected internal virtual IType DetermineType(string paramName, object paramValue, IType defaultType) { - IType type = parameterMetadata.GetNamedParameterExpectedType(paramName); - if (type == null) - { - type = defaultType; - } + IType type = parameterMetadata.GetNamedParameterExpectedType(paramName) ?? defaultType; return type; } protected internal virtual IType DetermineType(string paramName, object paramValue) { - IType type = parameterMetadata.GetNamedParameterExpectedType(paramName); - if (type == null) - { - type = GuessType(paramValue); - } + IType type = parameterMetadata.GetNamedParameterExpectedType(paramName) ?? GuessType(paramValue); return type; } protected internal virtual IType DetermineType(string paramName, System.Type clazz) { - IType type = parameterMetadata.GetNamedParameterExpectedType(paramName); - if (type == null) - { - type = GuessType(clazz); - } + IType type = parameterMetadata.GetNamedParameterExpectedType(paramName) ?? GuessType(clazz); return type; } @@ -248,7 +229,7 @@ /// </summary> private string ExpandParameterList(string query, string name, TypedValue typedList, IDictionary<string, TypedValue> namedParamsCopy) { - ICollection vals = (ICollection)typedList.Value; + var vals = (ICollection)typedList.Value; IType type = typedList.Type; if (vals.Count == 1) { @@ -259,7 +240,7 @@ return query; } - StringBuilder list = new StringBuilder(16); + var list = new StringBuilder(16); int i = 0; bool isJpaPositionalParam = parameterMetadata.GetNamedParameterDescriptor(name).JpaStyle; foreach (object obj in vals) @@ -732,6 +713,11 @@ get { return session.Factory.GetReturnTypes(queryString); } } + public virtual string[] ReturnAliases + { + get { return session.Factory.GetReturnAliases(queryString); } + } + // TODO: maybe call it RowSelection ? public RowSelection Selection { @@ -772,6 +758,12 @@ public abstract IQuery SetLockMode(string alias, LockMode lockMode); + public IQuery SetComment(string comment) + { + this.comment = comment; + return this; + } + internal protected ISessionImplementor Session { get { return session; } @@ -921,14 +913,14 @@ ValueArray(), namedParams, LockModes, - selection, + Selection, readOnly, cacheable, cacheRegion, - string.Empty, - collectionKey == null ? null : new object[] { collectionKey }, + comment, + collectionKey == null ? null : new[] { collectionKey }, optionalObject, - optionalEntityName ?? null, + optionalEntityName, optionalId, resultTransformer); } Modified: trunk/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs 2008-10-19 21:16:44 UTC (rev 3867) +++ trunk/nhibernate/src/NHibernate/Impl/SqlQueryImpl.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -104,15 +104,15 @@ return result; } - //public string[] ReturnAliases - //{ - // get { throw new NotSupportedException( "SQL queries do not currently support returning aliases" ); } - //} + public override string[] ReturnAliases + { + get { throw new NotSupportedException("SQL queries do not currently support returning aliases"); } + } - //public override IType[] ReturnTypes - //{ - // get { throw new NotSupportedException( "not yet implemented for SQL queries" ); } - //} + public override IType[] ReturnTypes + { + get { throw new NotSupportedException("not yet implemented for SQL queries"); } + } public override IList List() { Modified: trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd =================================================================== --- trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2008-10-19 21:16:44 UTC (rev 3867) +++ trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2008-10-20 15:43:09 UTC (rev 3868) @@ -98,6 +98,7 @@ <xs:enumeration value="adonet.factory_class" /> <xs:enumeration value="default_batch_fetch_size" /> <xs:enumeration value="default_entity_mode" /> + <xs:enumeration value="use_sql_comments" /> </xs:restriction> </xs:simpleType> </xs:attribute> Property changes on: trunk/nhibernate/src/NHibernate.Test/HQL ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate.Test/HQL/Animal.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/Animal.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/Animal.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -1,4 +1,4 @@ -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { public class Animal { Modified: trunk/nhibernate/src/NHibernate.Test/HQL/Animal.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/Animal.hbm.xml 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/Animal.hbm.xml 2008-10-20 15:43:09 UTC (rev 3868) @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" - namespace="NHibernate.Test.HQLFunctionTest" + namespace="NHibernate.Test.Hql" default-access="field.camelcase-underscore" default-lazy="true"> Modified: trunk/nhibernate/src/NHibernate.Test/HQL/BaseFunctionFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/BaseFunctionFixture.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/BaseFunctionFixture.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -3,7 +3,7 @@ using NHibernate.Engine; using NUnit.Framework; -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { public class BaseFunctionFixture { Modified: trunk/nhibernate/src/NHibernate.Test/HQL/HQLFunctions.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/HQLFunctions.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/HQLFunctions.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -4,7 +4,7 @@ using NHibernate.Dialect.Function; using NUnit.Framework; -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { /// <summary> /// This test run each HQL function separatelly so is easy to know wich function need @@ -42,7 +42,7 @@ protected override IList Mappings { - get { return new string[] { "HQLFunctionTest.Animal.hbm.xml", "HQLFunctionTest.MaterialResource.hbm.xml" }; } + get { return new string[] { "HQL.Animal.hbm.xml", "HQL.MaterialResource.hbm.xml" }; } } protected override void OnTearDown() Added: trunk/nhibernate/src/NHibernate.Test/HQL/HqlFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQL/HqlFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/HQL/HqlFixture.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -0,0 +1,74 @@ +using System.Collections; +using NHibernate.Engine.Query; +using NHibernate.Util; +using NUnit.Framework; + +namespace NHibernate.Test.Hql +{ + [TestFixture, Ignore("Not supported yet.")] + public class HqlFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] {"HQL.Animal.hbm.xml"}; } + } + + protected HQLQueryPlan CreateQueryPlan(string hql, bool scalar) + { + return new HQLQueryPlan(hql, scalar, new CollectionHelper.EmptyMapClass<string, IFilter>(), sessions); + } + + protected HQLQueryPlan CreateQueryPlan(string hql) + { + return CreateQueryPlan(hql, false); + } + + private static void Check(ReturnMetadata returnMetadata, bool expectingEmptyTypes, bool expectingEmptyAliases) + { + Assert.IsNotNull(returnMetadata, "null return metadata"); + Assert.IsNotNull(returnMetadata, "null return metadata - types"); + Assert.AreEqual(1, returnMetadata.ReturnTypes.Length, "unexpected return size"); + + if (expectingEmptyTypes) + { + Assert.IsNull(returnMetadata.ReturnTypes[0], "non-empty types"); + } + else + { + Assert.IsNotNull(returnMetadata.ReturnTypes[0], "empty types"); + } + + if (expectingEmptyAliases) + { + Assert.IsNull(returnMetadata.ReturnAliases, "non-empty aliases"); + } + else + { + Assert.IsNotNull(returnMetadata.ReturnAliases, "empty aliases"); + Assert.IsNotNull(returnMetadata.ReturnAliases[0], "empty aliases"); + } + } + + [Test] + public void ReturnMetadata() + { + HQLQueryPlan plan; + plan = CreateQueryPlan("from Animal a"); + Check(plan.ReturnMetadata, false, true); + + plan = CreateQueryPlan("select a as animal from Animal a"); + Check(plan.ReturnMetadata, false, false); + + plan = CreateQueryPlan("from java.lang.Object"); + Check(plan.ReturnMetadata, true, true); + + plan = CreateQueryPlan("select o as entity from java.lang.Object o"); + Check(plan.ReturnMetadata, true, false); + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/HQL/HqlFixture.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate.Test/HQL/Human.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/Human.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/Human.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -1,6 +1,6 @@ using System; -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { public class Human: Animal { Modified: trunk/nhibernate/src/NHibernate.Test/HQL/MaterialResource.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/MaterialResource.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/MaterialResource.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -1,6 +1,6 @@ using System; -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { public class MaterialResource { Modified: trunk/nhibernate/src/NHibernate.Test/HQL/MaterialResource.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/MaterialResource.hbm.xml 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/MaterialResource.hbm.xml 2008-10-20 15:43:09 UTC (rev 3868) @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" - namespace="NHibernate.Test.HQLFunctionTest" + namespace="NHibernate.Test.Hql" default-access="field.camelcase-underscore" default-lazy="true"> Modified: trunk/nhibernate/src/NHibernate.Test/HQL/Name.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/Name.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/Name.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -1,6 +1,6 @@ using System; -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { public class Name { Modified: trunk/nhibernate/src/NHibernate.Test/HQL/SQLFunctionTemplateTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/SQLFunctionTemplateTest.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/SQLFunctionTemplateTest.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -4,7 +4,7 @@ using NHibernate.Dialect.Function; using NUnit.Framework; -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { [TestFixture] public class SQLFunctionTemplateTest : BaseFunctionFixture Modified: trunk/nhibernate/src/NHibernate.Test/HQL/SimpleFunctionsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQLFunctionTest/SimpleFunctionsTest.cs 2008-10-18 22:18:15 UTC (rev 3865) +++ trunk/nhibernate/src/NHibernate.Test/HQL/SimpleFunctionsTest.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -5,7 +5,7 @@ using NUnit.Framework; using NHibernate.SqlCommand; -namespace NHibernate.Test.HQLFunctionTest +namespace NHibernate.Test.Hql { [TestFixture] public class SimpleFunctionsTest : BaseFunctionFixture Added: trunk/nhibernate/src/NHibernate.Test/HQL/SqlCommentsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQL/SqlCommentsFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/HQL/SqlCommentsFixture.cs 2008-10-20 15:43:09 UTC (rev 3868) @@ -0,0 +1,40 @@ +using System.Collections; +using NHibernate.Cfg; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.HQL +{ + [TestFixture] + public class SqlCommentsFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] { "HQL.Animal.hbm.xml" }; } + } + + protected override void Configure(Configuration configuration) + { + configuration.SetProperty(Environment.UseSqlComments, "true"); + } + + [Test] + public void CommentsInQuery() + { + using (ISession s = OpenSession()) + { + using (var sl = new SqlLogSpy()) + { + s.CreateQuery("from Animal").SetComment("This is my query").List(); + string sql = sl.Appender.GetEvents()[0].RenderedMessage; + Assert.That(sql.IndexOf("This is my query"), Is.GreaterThan(0)); + } + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-19 21:16:44 UTC (rev 3867) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-20 15:43:09 UTC (rev 3868) @@ -274,16 +274,18 @@ <Compile Include="GenericTest\SetGeneric\A.cs" /> <Compile Include="GenericTest\SetGeneric\B.cs" /> <Compile Include="GenericTest\SetGeneric\SetGenericFixture.cs" /> - <Compile Include="HQLFunctionTest\Animal.cs" /> - <Compile Include="HQLFunctionTest\BaseFunctionFixture.cs" /> - <Compile Include="HQLFunctionTest\HQLFunctions.cs" /> - <Compile Include="HQLFunctionTest\Human.cs" /> - <Compile Include="HQLFunctionTest\MaterialResource.cs" /> - <Compile Include="HQLFunctionTest\Name.cs" /> - <Compile Include="HQLFunctionTest\SimpleFunctionsTest.cs" /> - <Compile Include="HQLFunctionTest\SQLFunctionTemplateTest.cs" /> + <Compile Include="HQL\Animal.cs" /> + <Compile Include="HQL\BaseFunctionFixture.cs" /> + <Compile Include="HQL\HQLFunctions.cs" /> + <Compile Include="HQL\Human.cs" /> + <Compile Include="HQL\MaterialResource.cs" /> + <Compile Include="HQL\Name.cs" /> + <Compile Include="HQL\SimpleFunctionsTest.cs" /> + <Compile Include="HQL\SqlCommentsFixture.cs" /> + <Compile Include="HQL\SQLFunctionTemplateTest.cs" /> <Compile Include="BulkManipulation\NativeSQLBulkOperations.cs" /> <Compile Include="BulkManipulation\Vehicles.cs" /> + <Compile Include="HQL\HqlFixture.cs" /> <Compile Include="IdGen\Enhanced\SequenceStyleConfigUnitFixture.cs" /> <Compile Include="IdTest\Car.cs" /> <Compile Include="IdTest\HiLoInt16Class.cs" /> @@ -1184,7 +1186,7 @@ <EmbeddedResource Include="NHSpecificTest\NH712\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> - <EmbeddedResource Include="HQLFunctionTest\Animal.hbm.xml" /> + <EmbeddedResource Include="HQL\Animal.hbm.xml" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="ExpressionTest\SubQueries\Mappings.hbm.xml" /> @@ -1294,7 +1296,7 @@ <EmbeddedResource Include="NHSpecificTest\NH980\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> - <EmbeddedResource Include="HQLFunctionTest\MaterialResource.hbm.xml" /> + <EmbeddedResource Include="HQL\MaterialResource.hbm.xml" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="Join\CompositeKey.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-10-21 18:49:46
|
Revision: 3871 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3871&view=rev Author: tehlike Date: 2008-10-21 18:49:38 +0000 (Tue, 21 Oct 2008) Log Message: ----------- Fixes the problem with Caching Criteria with ResultTransformer set(Fix NH-1090) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -151,7 +151,16 @@ CriteriaImpl critImp = criteriaQueries[i] as CriteriaImpl; if(critImp==null || critImp.ResultTransformer==null) continue; - results[i] = critImp.ResultTransformer.TransformList((IList)results[i]); + ArrayList resultForOneCriteria = ((ArrayList) results[i]); + for (int j = 0; j < resultForOneCriteria.Count; j++) + { + if (!(critImp.ResultTransformer is RootEntityResultTransformer)) + { + object[] itemsForOneRow = (object[]) resultForOneCriteria[j]; + resultForOneCriteria[j] = critImp.ResultTransformer.TransformTuple(itemsForOneRow, new string[] {}); + } + } + critImp.ResultTransformer.TransformList(resultForOneCriteria); } } return results; Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using System.Data; @@ -28,7 +29,7 @@ private readonly string[] userAliases; public CriteriaLoader(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, - string rootEntityName, IDictionary<string, IFilter> enabledFilters) + string rootEntityName, IDictionary<string, IFilter> enabledFilters) : base(factory, enabledFilters) { translator = new CriteriaQueryTranslator(factory, rootCriteria, rootEntityName, CriteriaQueryTranslator.RootSqlAlias); @@ -74,10 +75,9 @@ } protected override object GetResultColumnOrRow(object[] row, IResultTransformer resultTransformer, IDataReader rs, - ISessionImplementor session) + ISessionImplementor session) { object[] result; - string[] aliases; if (translator.HasProjection) { @@ -96,11 +96,15 @@ result = row; aliases = userAliases; } - return translator.RootCriteria.ResultTransformer.TransformTuple(result, aliases); + if (translator.RootCriteria.ResultTransformer is RootEntityResultTransformer) + return row[row.Length-1]; + else + return result; } + private string[] aliases; protected override SqlString ApplyLocks(SqlString sqlSelectString, IDictionary<string, LockMode> lockModes, - Dialect.Dialect dialect) + Dialect.Dialect dialect) { if (lockModes == null || lockModes.Count == 0) { @@ -115,7 +119,7 @@ LockMode lockMode; if (lockModes.TryGetValue(drivingSqlAliases[i], out lockMode)) { - ILockable drivingPersister = (ILockable) EntityPersisters[i]; + ILockable drivingPersister = (ILockable)EntityPersisters[i]; string rootSqlAlias = drivingPersister.GetRootTableAlias(drivingSqlAliases[i]); aliasedLockModes[rootSqlAlias] = lockMode; if (keyColumnNames != null) @@ -151,7 +155,15 @@ protected override IList GetResultList(IList results, IResultTransformer resultTransformer) { - return translator.RootCriteria.ResultTransformer.TransformList(results); + if (!(resultTransformer is RootEntityResultTransformer)) + { + for (int i = 0; i < results.Count; i++) + { + object[] row = (object[]) results[i]; + results[i] = resultTransformer.TransformTuple(row, aliases); + } + } + return resultTransformer.TransformList(results); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -62,7 +62,7 @@ } [CLSCompliant(false)] // TODO: Why does this cause a problem in 1.1 - public string RootSQLAlias + public string RootSQLAlias { get { return rootSQLAlias; } } Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090 ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs (from rev 3854, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,194 @@ +using System.Collections; +using log4net.Core; +using NHibernate.AdoNet; +using NHibernate.Cfg; +using NHibernate.Criterion; +using NHibernate.Driver; +using NHibernate.Stat; +using NUnit.Framework; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + using (ISession s = OpenSession()) + using (ITransaction tran = s.BeginTransaction()) + { + MainClass m = new MainClass(); + m.Description = "description1"; + m.Title = "title1"; + + MainClass m2 = new MainClass(); + m2.Description = "description2"; + m2.Title = "title2"; + s.Save(m); + s.Save(m2); + tran.Commit(); + } + } + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + using (ITransaction tran = s.BeginTransaction()) + { + s.Delete("from MainClass"); + tran.Commit(); + } + + + } + [Test] + public void CriteriaCanCacheSingleResultSingleProperty() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof (MainClass)); + criteria.Add(Restrictions.Eq("Title", "title1")); + criteria.SetProjection(Projections.Property("Description")); + criteria.SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + string result = (string)criteria.UniqueResult(); + Assert.AreEqual("description1", result); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + string newResult = (string)criteria.UniqueResult(); + Assert.AreEqual("description1", newResult); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + [Test] + public void CriteriaCanCacheSingleResulMultipleProperty() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(MainClass)); + criteria.Add(Restrictions.Eq("Title", "title1")); + criteria.SetProjection(Projections.ProjectionList() + .Add(Projections.Property("Description")) + .Add(Projections.Property("Title"))); + criteria.SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + object[] result = (object[])criteria.UniqueResult(); + Assert.AreEqual("description1", result[0]); + Assert.AreEqual("title1", result[1]); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + object[] newResult = (object[])criteria.UniqueResult(); + Assert.AreEqual("description1", newResult[0]); + Assert.AreEqual("title1", newResult[1]); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + + + [Test] + public void CriteriaCanCacheEntity() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using(ISession session=OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof (MainClass)); + criteria.SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList results = criteria.List(); + Assert.AreEqual(2,results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results = criteria.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + + [Test] + public void CriteriaCanCacheTransformedResult() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + ICriteria criteria = session.CreateCriteria(typeof(MainClass)) + .SetProjection( + Projections.ProjectionList() + .Add(Projections.Property("Title")) + .Add(Projections.Property("Description"))) + .SetResultTransformer(new TupleToPropertyResultTransformer(typeof(MainClassWithoutId),"Title","Description")) + .SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList<MainClassWithoutId> results=criteria.List<MainClassWithoutId>(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results = criteria.List<MainClassWithoutId>(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(2,results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + [Test] + public void HqlCanCacheEntity() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + IQuery query = session.CreateQuery("from MainClass") + .SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + + [Test] + public void HqlCanCacheTransformedResult() + { + IStatistics stats = sessions.Statistics; + stats.Clear(); + bool isStatsEnabled = stats.IsStatisticsEnabled; + stats.IsStatisticsEnabled = true; + using (ISession session = OpenSession()) + { + IQuery query = session.CreateQuery("select m.Title,m.Description from MainClass m") + .SetResultTransformer(new TupleToPropertyResultTransformer(typeof (MainClassWithoutId), "Title", "Description")) + .SetCacheable(true); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + IList results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + results=query.List(); + Assert.AreEqual(2, results.Count); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + } + stats.IsStatisticsEnabled = isStatsEnabled; + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Fixture.cs ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs (from rev 3854, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1144/Classes.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + public class MainClass + { + private int id; + private string description; + private string title; + + public virtual int Id + { + get { return id; } + set { id = value; } + } + + public virtual string Description + { + get { return description; } + set { description = value; } + } + public virtual string Title + { + get { return title; } + set { title = value; } + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClass.cs ___________________________________________________________________ Added: svn:mergeinfo + Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/MainClassDescriptionOnly.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + public class MainClassWithoutId + { + public string Title { get; set; } + public string Description { get; set; } + } +} Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml (from rev 3854, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1144/Mappings.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml 2008-10-21 18:49:38 UTC (rev 3871) @@ -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.NH1090"> + + <class name="MainClass"> + <id name="Id" type="int"> + <generator class="native" /> + </id> + <property name="Title" type="string" length="50"/> + <property name="Description" type="string" length="50"/> + </class> + +</hibernate-mapping> \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/Mappings.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1090/TuppleToPropertyResultTransformer.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -0,0 +1,52 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using NHibernate.Transform; + +namespace NHibernate.Test.NHSpecificTest.NH1090 +{ + public class TupleToPropertyResultTransformer : IResultTransformer + { + private System.Type result; + private PropertyInfo[] properties; + + public TupleToPropertyResultTransformer(System.Type result, params string[] names) + { + this.result = result; + List<PropertyInfo> props = new List<PropertyInfo>(); + foreach (string name in names) + { + props.Add(result.GetProperty(name)); + } + properties = props.ToArray(); + } + + public object TransformTuple(object[] tuple, string[] aliases) + { + object instance = Activator.CreateInstance(result); + for (int i = 0; i < tuple.Length; i++) + { + properties[i].SetValue(instance, tuple[i], null); + } + return instance; + } + + public System.Collections.IList TransformList(IList collection) + { + return collection; + } + + public override int GetHashCode() + { + return 1234; + } + + public override bool Equals(object obj) + { + return true; + } + } + +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-21 18:49:38 UTC (rev 3871) @@ -380,6 +380,10 @@ <Compile Include="NHSpecificTest\NH1033\Reptile.cs" /> <Compile Include="NHSpecificTest\NH1077\A.cs" /> <Compile Include="NHSpecificTest\NH1077\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1090\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1090\MainClass.cs" /> + <Compile Include="NHSpecificTest\NH1090\MainClassDescriptionOnly.cs" /> + <Compile Include="NHSpecificTest\NH1090\TuppleToPropertyResultTransformer.cs" /> <Compile Include="NHSpecificTest\NH1098\FilterParameterOrderFixture.cs" /> <Compile Include="NHSpecificTest\NH1098\Model.cs" /> <Compile Include="NHSpecificTest\NH1101\Domain.cs" /> @@ -1509,6 +1513,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1090\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH662\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1495\Mappings.hbm.xml" /> <EmbeddedResource Include="ProjectionFixtures\Mapping.hbm.xml" /> Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2008-10-20 18:34:11 UTC (rev 3870) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2008-10-21 18:49:38 UTC (rev 3871) @@ -146,7 +146,7 @@ firstQueryResults.Add(4); IList secondQueryResults = (IList)cachedQuery[1]; - secondQueryResults[0] = 2; + secondQueryResults[0] = new object[]{2}; using (ISession s = sessions.OpenSession()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2008-10-23 19:27:03
|
Revision: 3874 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3874&view=rev Author: ayenderahien Date: 2008-10-23 19:27:00 +0000 (Thu, 23 Oct 2008) Log Message: ----------- NH-1547 - SqLite Paqing does not page properly after the 2nd page Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-10-23 18:44:32 UTC (rev 3873) +++ trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-10-23 19:27:00 UTC (rev 3874) @@ -183,7 +183,7 @@ if (offset > 0) { - pagingBuilder.Add(", "); + pagingBuilder.Add(" offset "); pagingBuilder.Add(offset.ToString()); } Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-23 18:44:32 UTC (rev 3873) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/SQLiteDialectFixture.cs 2008-10-23 19:27:00 UTC (rev 3874) @@ -28,7 +28,7 @@ { SqlString sql = new SqlString("SELECT id, name, email FROM Users"); SqlString s = dialect.GetLimitString(sql, 5, 10); - Assert.AreEqual("SELECT id, name, email FROM Users limit 10, 5", s.ToString()); + Assert.AreEqual("SELECT id, name, email FROM Users limit 10 offset 5", s.ToString()); } [Test] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-10-24 13:46:09
|
Revision: 3875 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3875&view=rev Author: fabiomaulo Date: 2008-10-24 13:45:59 +0000 (Fri, 24 Oct 2008) Log Message: ----------- Fix NH-1539, NH-1540, NH-1541, NH-1542 (Improv ORACLE dialect by Jaroslav Mart?\195?\161sek) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs 2008-10-23 19:27:00 UTC (rev 3874) +++ trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs 2008-10-24 13:45:59 UTC (rev 3875) @@ -1,7 +1,8 @@ -using System; +using System.Collections; using System.Data; using NHibernate.Dialect.Function; using NHibernate.Dialect.Schema; +using NHibernate.Engine; using NHibernate.SqlCommand; using Environment=NHibernate.Cfg.Environment; using System.Data.Common; @@ -110,15 +111,19 @@ RegisterFunction("sysdate", new NoArgSQLFunction("sysdate", NHibernateUtil.Date, false)); RegisterFunction("uid", new NoArgSQLFunction("uid", NHibernateUtil.Int32, false)); RegisterFunction("user", new NoArgSQLFunction("user", NHibernateUtil.String, false)); + RegisterFunction("current_timestamp", new CurrentTimeStamp()); + RegisterFunction("str", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as nvarchar2(2000))")); + // Multi-param string dialect functions... - RegisterFunction("concat", new StandardSQLFunction("concat", NHibernateUtil.String)); + RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "||", ")")); RegisterFunction("instr", new StandardSQLFunction("instr", NHibernateUtil.String)); RegisterFunction("instrb", new StandardSQLFunction("instrb", NHibernateUtil.String)); RegisterFunction("lpad", new StandardSQLFunction("lpad", NHibernateUtil.String)); RegisterFunction("replace", new StandardSQLFunction("replace", NHibernateUtil.String)); RegisterFunction("rpad", new StandardSQLFunction("rpad", NHibernateUtil.String)); RegisterFunction("substr", new StandardSQLFunction("substr", NHibernateUtil.String)); + RegisterFunction("substring", new StandardSQLFunction("substr", NHibernateUtil.String)); RegisterFunction("substrb", new StandardSQLFunction("substrb", NHibernateUtil.String)); RegisterFunction("translate", new StandardSQLFunction("translate", NHibernateUtil.String)); @@ -184,9 +189,12 @@ get { return true; } } - public override SqlString GetLimitString(SqlString querySqlString, bool hasOffset) + + public override SqlString GetLimitString(SqlString querySqlString, int offset, int limit) { SqlStringBuilder pagingBuilder = new SqlStringBuilder(); + var hasOffset = offset > 0; + if (hasOffset) { pagingBuilder.Add("select * from ( select row_.*, rownum rownum_ from ( "); @@ -199,14 +207,14 @@ if (hasOffset) { pagingBuilder.Add(" ) row_ where rownum <= "); - pagingBuilder.Add(Parameter.Placeholder); + pagingBuilder.Add(offset.ToString()); pagingBuilder.Add(" ) where rownum_ > "); - pagingBuilder.Add(Parameter.Placeholder); + pagingBuilder.Add((limit + offset).ToString()); } else { pagingBuilder.Add(" ) where rownum <= "); - pagingBuilder.Add(Parameter.Placeholder); + pagingBuilder.Add(offset.ToString()); } return pagingBuilder.ToSqlString(); @@ -243,5 +251,17 @@ { return new OracleDataBaseSchema(connection); } + + private class CurrentTimeStamp : NoArgSQLFunction + { + public CurrentTimeStamp() + : base("current_timestamp", NHibernateUtil.DateTime, true) + { } + + public override SqlString Render(IList args, ISessionFactoryImplementor factory) + { + return new SqlString(name); + } + } } -} \ No newline at end of file +} Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2008-10-23 19:27:00 UTC (rev 3874) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2008-10-24 13:45:59 UTC (rev 3875) @@ -1445,7 +1445,7 @@ { KeyType.NullSafeSet(st, key, 0, session); rs = session.Batcher.ExecuteReader(st); - return rs.Read() ? rs.GetInt32(0) - baseIndex : 0; + return rs.Read() ? Convert.ToInt32(rs.GetValue(0)) - baseIndex : 0; } finally { @@ -2022,4 +2022,4 @@ #endregion } -} \ 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...> - 2008-10-25 14:05:29
|
Revision: 3877 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3877&view=rev Author: fabiomaulo Date: 2008-10-25 14:05:25 +0000 (Sat, 25 Oct 2008) Log Message: ----------- Fix unreported bug. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/MappingsQueue.cs trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs trunk/nhibernate/src/NHibernate.Test/Extendshbm/ExtendsFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf1.hbm.xml trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf2.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/MappingsQueue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingsQueue.cs 2008-10-24 14:09:53 UTC (rev 3876) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingsQueue.cs 2008-10-25 14:05:25 UTC (rev 3877) @@ -98,7 +98,12 @@ private bool CanProcess(MappingsQueueEntry ce) { - return _processedClassNames.ContainsAll(ce.RequiredClassNames); + foreach (var c in ce.RequiredClassNames) + { + if (!(_processedClassNames.Contains(c.FullClassName) || _processedClassNames.Contains(c.EntityName))) + return false; + } + return true; } private static string FormatExceptionMessage(ICollection resourceEntries) @@ -108,10 +113,9 @@ foreach (MappingsQueueEntry resourceEntry in resourceEntries) { - foreach (string className in resourceEntry.RequiredClassNames) + foreach (var className in resourceEntry.RequiredClassNames) { - message.Append('\n') - .Append(className); + message.Append('\n').Append(className); } } Modified: trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs 2008-10-24 14:09:53 UTC (rev 3876) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs 2008-10-25 14:05:25 UTC (rev 3877) @@ -10,7 +10,7 @@ { private readonly HashedSet<string> containedClassNames; private readonly NamedXmlDocument document; - private readonly HashedSet<string> requiredClassNames; + private readonly HashedSet<RequiredEntityName> requiredClassNames; public MappingsQueueEntry(NamedXmlDocument document, IEnumerable<ClassExtractor.ClassEntry> classEntries) { @@ -29,7 +29,7 @@ /// Gets the names of all entities outside this resource /// needed by the classes in this resource. /// </summary> - public ICollection<string> RequiredClassNames + public ICollection<RequiredEntityName> RequiredClassNames { get { return requiredClassNames; } } @@ -44,9 +44,9 @@ private static HashedSet<string> GetClassNames(IEnumerable<ClassExtractor.ClassEntry> classEntries) { - HashedSet<string> result = new HashedSet<string>(); + var result = new HashedSet<string>(); - foreach (ClassExtractor.ClassEntry ce in classEntries) + foreach (var ce in classEntries) { if (ce.EntityName != null) { @@ -61,20 +61,80 @@ return result; } - private static HashedSet<string> GetRequiredClassNames(IEnumerable<ClassExtractor.ClassEntry> classEntries, + private static HashedSet<RequiredEntityName> GetRequiredClassNames(IEnumerable<ClassExtractor.ClassEntry> classEntries, ICollection<string> containedNames) { - HashedSet<string> result = new HashedSet<string>(); + var result = new HashedSet<RequiredEntityName>(); - foreach (ClassExtractor.ClassEntry ce in classEntries) + foreach (var ce in classEntries) { - if (ce.ExtendsEntityName != null && !containedNames.Contains(ce.FullExtends.Type) && !containedNames.Contains(ce.ExtendsEntityName)) + if (ce.ExtendsEntityName != null && !containedNames.Contains(ce.FullExtends.Type) + && !containedNames.Contains(ce.ExtendsEntityName)) { - result.Add(ce.FullExtends.Type); + result.Add(new RequiredEntityName(ce.ExtendsEntityName, ce.FullExtends.Type)); } } return result; } + + public class RequiredEntityName + { + public RequiredEntityName(string entityName, string fullClassName) + { + EntityName = entityName; + FullClassName = fullClassName; + } + + public string EntityName { get; private set; } + + public string FullClassName { get; private set; } + + public bool Equals(RequiredEntityName obj) + { + if (obj == null) + { + return false; + } + if (ReferenceEquals(this, obj)) + { + return true; + } + return Equals(obj.EntityName, EntityName) && Equals(obj.FullClassName, FullClassName); + } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + var thatSimple = obj as string; + if (thatSimple != null && (thatSimple.Equals(EntityName) || thatSimple.Equals(FullClassName))) + { + return true; + } + var that = obj as RequiredEntityName; + if (that != null) + { + return false; + } + return Equals(that); + } + + public override int GetHashCode() + { + unchecked + { + return ((EntityName != null ? EntityName.GetHashCode() : 0) * 397) + ^ (FullClassName != null ? FullClassName.GetHashCode() : 0); + } + } + + public override string ToString() + { + return string.Format("FullName:{0} - Name:{1}", FullClassName ?? "<null>", EntityName ?? "<null>"); + } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Extendshbm/ExtendsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extendshbm/ExtendsFixture.cs 2008-10-24 14:09:53 UTC (rev 3876) +++ trunk/nhibernate/src/NHibernate.Test/Extendshbm/ExtendsFixture.cs 2008-10-25 14:05:25 UTC (rev 3877) @@ -117,6 +117,19 @@ } [Test] + public void EntityNamesWithPackageFailureExpectedDiffFiles() + { + Configuration cfg = new Configuration(); + cfg.AddResource(BaseForMappings + "Extendshbm.packageentitynamesf1.hbm.xml", typeof(ExtendsFixture).Assembly); + cfg.AddResource(BaseForMappings + "Extendshbm.packageentitynamesf2.hbm.xml", typeof(ExtendsFixture).Assembly); + + cfg.BuildMappings(); + + Assert.That(cfg.GetClassMapping("EntityHasName"), Is.Not.Null); + Assert.That(cfg.GetClassMapping("EntityCompany"), Is.Not.Null); + } + + [Test] public void UnionSubclass() { Configuration cfg = new Configuration(); Added: trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf1.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf1.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf1.hbm.xml 2008-10-25 14:05:25 UTC (rev 3877) @@ -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.Extendshbm"> + + <class lazy="true" entity-name="EntityHasName" table="F5_ENTITY_HASNAME"> + <id name="id" column="ID" type="long"> + <generator class="native"/> + </id> + <property name="attrName" type="string"> + <column name="NAME"/> + </property> + </class> +</hibernate-mapping> \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf1.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Added: trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf2.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf2.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Extendshbm/packageentitynamesf2.hbm.xml 2008-10-25 14:05:25 UTC (rev 3877) @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Extendshbm"> + + <joined-subclass lazy="true" entity-name="EntityCompany" table="F5_ENTITY_COMPANY" extends="EntityHasName"> + <key column="REF_ID"/> + <many-to-one name="parent" entity-name="EntityHasName"/> + </joined-subclass> +</hibernate-mapping> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-24 14:09:53 UTC (rev 3876) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-10-25 14:05:25 UTC (rev 3877) @@ -1513,6 +1513,8 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="Extendshbm\packageentitynamesf1.hbm.xml" /> + <EmbeddedResource Include="Extendshbm\packageentitynamesf2.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1090\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH662\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1495\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-10-25 20:07:02
|
Revision: 3879 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3879&view=rev Author: fabiomaulo Date: 2008-10-25 20:06:57 +0000 (Sat, 25 Oct 2008) Log Message: ----------- Improvement of generic entity usage (it don't need to specify the entity-name in session API) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2008-10-25 17:23:21 UTC (rev 3878) +++ trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2008-10-25 20:06:57 UTC (rev 3879) @@ -177,6 +177,12 @@ /// </returns> IEntityPersister TryGetEntityPersister(string entityName); + /// <summary> + /// Get the entity-name for a given mapped class. + /// </summary> + /// <param name="implementor">the mapped class</param> + /// <returns>the enntity name where available or null</returns> + string TryGetGuessEntityName(System.Type implementor); #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs 2008-10-25 17:23:21 UTC (rev 3878) +++ trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs 2008-10-25 20:06:57 UTC (rev 3879) @@ -40,7 +40,6 @@ * to link an entityName with its AssemblyQualifiedName (strongly typed). * I would like to maitain <imports> like the holder of the association of an entityName (or a class Name) and * its Type (in the future: Dictionary<string, System.Type> imports;) - * Note : The same AssemblyQualifiedName should be associaded with more than one emtityName (in case of use generic). * ********************************************************************************************************* */ return TypeNameParser.Parse(assemblyQualifiedName).Type; Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2008-10-25 17:23:21 UTC (rev 3878) +++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2008-10-25 20:06:57 UTC (rev 3879) @@ -102,6 +102,13 @@ [NonSerialized] private readonly ICurrentSessionContext currentSessionContext; [NonSerialized] private readonly IEntityNotFoundDelegate entityNotFoundDelegate; [NonSerialized] private readonly IDictionary<string, IEntityPersister> entityPersisters; + + /// <summary> + /// NH specific : to avoid the use of entityName for generic implementation + /// </summary> + /// <remarks>this is a shortcut.</remarks> + [NonSerialized] private readonly IDictionary<System.Type, string> implementorToEntityName; + [NonSerialized] private readonly EventListeners eventListeners; [NonSerialized] private readonly Dictionary<string, FilterDefinition> filters; @@ -178,6 +185,8 @@ Dictionary<string, ICacheConcurrencyStrategy> caches = new Dictionary<string, ICacheConcurrencyStrategy>(); entityPersisters = new Dictionary<string, IEntityPersister>(); + implementorToEntityName = new Dictionary<System.Type, string>(); + Dictionary<string, IClassMetadata> classMeta = new Dictionary<string, IClassMetadata>(); foreach (PersistentClass model in cfg.ClassMappings) @@ -198,6 +207,11 @@ IEntityPersister cp = PersisterFactory.CreateClassPersister(model, cache, this, mapping); entityPersisters[model.EntityName] = cp; classMeta[model.EntityName] = cp.ClassMetadata; + + if (model.HasPocoRepresentation) + { + implementorToEntityName[model.MappedClass] = model.EntityName; + } } classMetadata = new UnmodifiableDictionary<string, IClassMetadata>(classMeta); @@ -1125,5 +1139,15 @@ return null; } } + + #region NHibernate specific + public string TryGetGuessEntityName(System.Type implementor) + { + string result; + implementorToEntityName.TryGetValue(implementor, out result); + return result; + } + + #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2008-10-25 17:23:21 UTC (rev 3878) +++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2008-10-25 20:06:57 UTC (rev 3879) @@ -870,7 +870,8 @@ string entityName = interceptor.GetEntityName(entity); if (entityName == null) { - entityName = entity.GetType().FullName; + System.Type t = entity.GetType(); + entityName = Factory.TryGetGuessEntityName(t) ?? t.FullName; } return entityName; } Modified: trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs 2008-10-25 17:23:21 UTC (rev 3878) +++ trunk/nhibernate/src/NHibernate.Test/GenericTest/Overall/Fixture.cs 2008-10-25 20:06:57 UTC (rev 3879) @@ -27,14 +27,14 @@ using (ISession session = OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { - session.Save("AInt", entity); + session.Save(entity); transaction.Commit(); } using (ISession session = OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { - session.Delete("AInt", entity); + session.Delete(entity); transaction.Commit(); } } @@ -53,14 +53,14 @@ using (ISession session = OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { - session.Save("AB", entity); + session.Save(entity); transaction.Commit(); } using (ISession session = OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { - session.Delete("AB", entity); + session.Delete(entity); transaction.Commit(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-02 17:17:04
|
Revision: 3882 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3882&view=rev Author: tehlike Date: 2008-11-02 17:16:59 +0000 (Sun, 02 Nov 2008) Log Message: ----------- Adding EnumStringType with generic arguments in order developer not to write specific classes for enums. (Fix NH-1544) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-10-30 11:33:34 UTC (rev 3881) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-02 17:16:59 UTC (rev 3882) @@ -1053,6 +1053,7 @@ <Compile Include="Type\CollectionType.cs" /> <Compile Include="Type\CustomCollectionType.cs" /> <Compile Include="Type\EmbeddedComponentType.cs" /> + <Compile Include="Type\EnumStringType`1.cs" /> <Compile Include="Type\GenericOrderedSetType.cs" /> <Compile Include="Type\ICacheAssembler.cs" /> <Compile Include="Type\OrderedSetType.cs" /> Added: trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs 2008-11-02 17:16:59 UTC (rev 3882) @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Type +{ + public class EnumStringType<T> : EnumStringType + { + public EnumStringType():base(typeof(T)) + { + + } + } +} Property changes on: trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs ___________________________________________________________________ Added: svn:mergeinfo + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-02 18:28:35
|
Revision: 3884 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3884&view=rev Author: tehlike Date: 2008-11-02 18:28:25 +0000 (Sun, 02 Nov 2008) Log Message: ----------- Applying patch from Michael Montgomery with modifications (fix NH-1233) Introducing Enums with Char DB backend. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-02 17:37:44 UTC (rev 3883) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-02 18:28:25 UTC (rev 3884) @@ -1053,6 +1053,7 @@ <Compile Include="Type\CollectionType.cs" /> <Compile Include="Type\CustomCollectionType.cs" /> <Compile Include="Type\EmbeddedComponentType.cs" /> + <Compile Include="Type\EnumCharType.cs" /> <Compile Include="Type\EnumStringType`1.cs" /> <Compile Include="Type\GenericOrderedSetType.cs" /> <Compile Include="Type\ICacheAssembler.cs" /> Added: trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs 2008-11-02 18:28:25 UTC (rev 3884) @@ -0,0 +1,184 @@ +using System; +using System.Data; +using NHibernate.Engine; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + [Serializable] + public class EnumCharType<T> : ImmutableType, IDiscriminatorType + { + + public EnumCharType() : base(new StringFixedLengthSqlType(1)) + { + if (typeof(T).IsEnum) + { + this.enumClass = typeof(T); + } + else + { + throw new MappingException(enumClass.Name + " did not inherit from System.Enum"); + } + } + private readonly System.Type enumClass; + + public virtual object GetInstance(object code) + { + if (code is String) + { + return GetInstanceFromString((String) code); + } + else if (code is Char) + { + return GetInstanceFromChar((Char) code); + } + else + { + throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, enumClass.Name)); + } + } + + private object GetInstanceFromString(String s) + { + if (s.Length == 0) throw new HibernateException(string.Format("Can't Parse empty string as {0}", enumClass.Name)); + + if (s.Length == 1) + { + //String representation of underlying char value e.g. "R" + return GetInstanceFromChar(s[0]); + } + else + { + //Name of enum value e.g. "Red" + try + { + return Enum.Parse(enumClass, s, false); + } + catch (ArgumentException) + { + try + { + return Enum.Parse(enumClass, s, true); + } + catch (ArgumentException ae) + { + throw new HibernateException(string.Format("Can't Parse {0} as {1}", s, enumClass.Name), ae); + } + } + } + } + + private object GetInstanceFromChar(Char c) + { + Object instance; + + instance = Enum.ToObject(enumClass, c); + if (Enum.IsDefined(enumClass, instance)) return instance; + + instance = Enum.ToObject(enumClass, Alternate(c)); + if (Enum.IsDefined(enumClass, instance)) return instance; + + throw new HibernateException(string.Format("Can't Parse {0} as {1}", c, enumClass.Name)); + } + + private Char Alternate(Char c) + { + return Char.IsUpper(c) ? Char.ToLower(c) : Char.ToUpper(c); + } + + /// <summary> + /// Converts the given enum instance into a basic type. + /// </summary> + /// <param name="instance"></param> + /// <returns></returns> + public virtual object GetValue(object instance) + { + if (instance == null) + { + return null; + } + else + { + return (Char) (Int32) instance; + } + } + + public override System.Type ReturnedClass + { + get { return enumClass; } + } + + public override void Set(IDbCommand cmd, object value, int index) + { + IDataParameter par = (IDataParameter) cmd.Parameters[index]; + if (value == null) + { + par.Value = DBNull.Value; + } + else + { + par.Value = ((Char) (Int32) (value)).ToString(); + } + } + + public override object Get(IDataReader rs, int index) + { + object code = rs[index]; + if (code == DBNull.Value || code == null) + { + return null; + } + else + { + return GetInstance(code); + } + } + + public override object Get(IDataReader rs, string name) + { + return Get(rs, rs.GetOrdinal(name)); + } + + public override string Name + { + get { return "enumchar - " + enumClass.Name; } + } + + public override string ToString(object value) + { + return (value == null) ? null : GetValue(value).ToString(); + } + + public override object Assemble(object cached, ISessionImplementor session, object owner) + { + if (cached == null) + { + return null; + } + else + { + return GetInstance(cached); + } + } + + public override object Disassemble(object value, ISessionImplementor session, object owner) + { + return (value == null) ? null : GetValue(value); + } + + public virtual object StringToObject(string xml) + { + return (string.IsNullOrEmpty(xml)) ? null : FromStringValue(xml); + } + + public override object FromStringValue(string xml) + { + return GetInstance(xml); + } + + public virtual string ObjectToSQLString(object value, Dialect.Dialect dialect) + { + return '\'' + GetValue(value).ToString() + '\''; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-02 17:37:44 UTC (rev 3883) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-02 18:28:25 UTC (rev 3884) @@ -885,6 +885,8 @@ <Compile Include="TypesTest\DoubleTypeFixture.cs" /> <Compile Include="TypesTest\EntityClass.cs" /> <Compile Include="TypesTest\EntityTypeFixture.cs" /> + <Compile Include="TypesTest\EnumCharClass.cs" /> + <Compile Include="TypesTest\EnumCharTypeFixture.cs" /> <Compile Include="TypesTest\EnumStringClass.cs" /> <Compile Include="TypesTest\EnumStringTypeFixture.cs" /> <Compile Include="TypesTest\GuidClass.cs" /> @@ -1509,6 +1511,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="TypesTest\EnumCharClass.hbm.xml" /> <EmbeddedResource Include="Extendshbm\packageentitynamesWithColl.hbm.xml" /> <EmbeddedResource Include="Extendshbm\entitynamesWithColl.hbm.xml" /> <EmbeddedResource Include="Extendshbm\packageentitynamesf1.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.cs 2008-11-02 18:28:25 UTC (rev 3884) @@ -0,0 +1,62 @@ +using System; +using NHibernate.Type; + +namespace NHibernate.Test.TypesTest +{ + public class EnumCharClass + { + private int _id; + private SampleCharEnum _enumValue; + + public int Id + { + get { return _id; } + set { _id = value; } + } + + public SampleCharEnum EnumValue + { + get { return _enumValue; } + set { _enumValue = value; } + } + } + + public enum SampleCharEnum + { + On = 'N', + Off = 'F', + Dimmed = 'D' + } + + + public class EnumCharFoo + { + private Int32 id; + + public virtual Int32 Id + { + get { return id; } + set { id = value; } + } + } + + public class EnumCharBar : EnumCharFoo {} + + public class EnumCharBaz + { + private Int32 id; + private SampleCharEnum type; + + public virtual Int32 Id + { + get { return id; } + set { id = value; } + } + + public virtual SampleCharEnum Type + { + get { return type; } + set { type = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharClass.hbm.xml 2008-11-02 18:28:25 UTC (rev 3884) @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" namespace="NHibernate.Test.TypesTest" assembly="NHibernate.Test"> + <class name="EnumCharClass" table="bc_echr"> + <id name="Id"> + <generator class="assigned" /> + </id> + <property name="EnumValue" type="NHibernate.Type.EnumCharType`1[[NHibernate.Test.TypesTest.SampleCharEnum, NHibernate.Test]], NHibernate" column="enumc"/> + </class> + <class name="EnumCharFoo" table="bc_ecfoobarbaz" discriminator-value="Dimmed"> + <id name="Id"> + <generator class="assigned"/> + </id> + <discriminator type="NHibernate.Type.EnumCharType`1[[NHibernate.Test.TypesTest.SampleCharEnum, NHibernate.Test]], NHibernate" column="type"/> + <subclass name="EnumCharBar" discriminator-value="Off"/> + </class> + + <class name="EnumCharBaz" table="bc_ecfoobarbaz"> + <id name="Id"> + <generator class="assigned"/> + </id> + <property name="Type" column="type" type="NHibernate.Type.EnumCharType`1[[NHibernate.Test.TypesTest.SampleCharEnum, NHibernate.Test]], NHibernate"/> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/EnumCharTypeFixture.cs 2008-11-02 18:28:25 UTC (rev 3884) @@ -0,0 +1,146 @@ +using System.Collections; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + [TestFixture] + public class EnumCharTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "EnumChar"; } + } + + protected override void OnSetUp() + { + + EnumCharClass basic = new EnumCharClass(); + basic.Id = 1; + basic.EnumValue = SampleCharEnum.Dimmed; + + EnumCharClass basic2 = new EnumCharClass(); + basic2.Id = 2; + basic2.EnumValue = SampleCharEnum.On; + + ISession s = OpenSession(); + s.Save(basic); + s.Save(basic2); + s.Flush(); + s.Close(); + } + + protected override void OnTearDown() + { + ISession s = OpenSession(); + s.Delete("from EnumCharClass"); + s.Delete("from EnumCharBaz"); + s.Flush(); + s.Close(); + } + + [Test] + public void ReadFromLoad() + { + using (ISession s = OpenSession()) + { + EnumCharClass basic = (EnumCharClass) s.Load(typeof (EnumCharClass), 1); + Assert.AreEqual(SampleCharEnum.Dimmed, basic.EnumValue); + + EnumCharClass basic2 = (EnumCharClass) s.Load(typeof (EnumCharClass), 2); + Assert.AreEqual(SampleCharEnum.On, basic2.EnumValue); + } + } + + [Test] + public void ReadFromQueryUsingValue() + { + using (ISession s = OpenSession()) + { + IList results; + IQuery q = s.CreateQuery("from EnumCharClass as ecc where ecc.EnumValue=:value"); + + q.SetParameter("value", SampleCharEnum.On,new EnumCharType<SampleCharEnum>()); + results = q.List(); + + Assert.AreEqual(1, results.Count, "only 1 was 'On'"); + + q.SetParameter("value", SampleCharEnum.Off, new EnumCharType<SampleCharEnum>()); + results = q.List(); + + Assert.AreEqual(0, results.Count, "should not be any in the 'Off' status"); + } + } + + [Test] + public void ReadFromQueryUsingString() + { + using (ISession s = OpenSession()) + { + IList results; + IQuery q = s.CreateQuery("from EnumCharClass as ecc where ecc.EnumValue=:value"); + + q.SetString("value", "N"); + results = q.List(); + + Assert.AreEqual(1, results.Count, "only 1 was \"N\" string"); + + q.SetString("value", "F"); + results = q.List(); + + Assert.AreEqual(0, results.Count, "should not be any in the \"F\" string"); + } + } + + [Test] + public void ReadFromQueryUsingChar() + { + using (ISession s = OpenSession()) + { + IList results; + IQuery q = s.CreateQuery("from EnumCharClass as ecc where ecc.EnumValue=:value"); + + q.SetCharacter("value", 'N'); + results = q.List(); + + Assert.AreEqual(1, results.Count, "only 1 was 'N' char"); + + q.SetCharacter("value", 'F'); + results = q.List(); + + Assert.AreEqual(0, results.Count, "should not be any in the 'F' char"); + } + } + + [Test] + public void CanBeUsedAsDiscriminator() + { + EnumCharFoo foo = new EnumCharFoo(); + EnumCharBar bar = new EnumCharBar(); + + foo.Id = 1; + bar.Id = 2; + + using (ISession s = OpenSession()) + { + s.Save(foo); + s.Save(bar); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + s.Load<EnumCharFoo>(1); + s.Load<EnumCharBar>(2); + + EnumCharBaz baz; + + baz = s.Load<EnumCharBaz>(1); + Assert.AreEqual(SampleCharEnum.Dimmed, baz.Type); + + baz = s.Load<EnumCharBaz>(2); + Assert.AreEqual(SampleCharEnum.Off, baz.Type); + } + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |