|
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.
|