|
From: <jul...@us...> - 2010-11-02 11:59:18
|
Revision: 5259
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5259&view=rev
Author: julian-maughan
Date: 2010-11-02 11:59:09 +0000 (Tue, 02 Nov 2010)
Log Message:
-----------
Change to ICompositeUserType.NullSafeSet to cater for cases where not all parameters should be set (such as dynamic-update). Contributed by Patrick Earl (ref. NH-2392)
Modified Paths:
--------------
trunk/nhibernate/releasenotes.txt
trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs
trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs
trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs
trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs
trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs
Modified: trunk/nhibernate/releasenotes.txt
===================================================================
--- trunk/nhibernate/releasenotes.txt 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/releasenotes.txt 2010-11-02 11:59:09 UTC (rev 5259)
@@ -2,6 +2,9 @@
=============================
** Known BREAKING CHANGES from NH2.1.1.GA to NH3.0.0.CR1
+ ##### Design time #####
+ * [NH-2392] - ICompositeUserType.NullSafeSet method signature changed
+
##### Run time #####
* [NH-2199] - null values in maps/dictionaries are no longer silenty ignored/deleted
* [NH-1894] - SybaseAnywhereDialect has been removed, and replaced with SybaseASA9Dialect.
@@ -15,6 +18,8 @@
Build 3.0.0.CR1
=============================
+** Improvement
+ * [NH-2392] - ICompositeUserType support for cases where not all parameters should be set (such as dynamic-update)
Build 3.0.0.Beta2 (rev5254)
=============================
Modified: trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate/Type/CompositeCustomType.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Data;
+using System.Linq;
using System.Reflection;
using System.Xml;
@@ -11,9 +12,6 @@
namespace NHibernate.Type
{
- /// <summary>
- /// Summary description for CompositeCustomType.
- /// </summary>
[Serializable]
public class CompositeCustomType : AbstractType, IAbstractComponentType
{
@@ -51,24 +49,16 @@
}
}
- /// <summary></summary>
public virtual IType[] Subtypes
{
get { return userType.PropertyTypes; }
}
- /// <summary></summary>
public virtual string[] PropertyNames
{
get { return userType.PropertyNames; }
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="component"></param>
- /// <param name="session"></param>
- /// <returns></returns>
public virtual object[] GetPropertyValues(object component, ISessionImplementor session)
{
return GetPropertyValues(component, session.EntityMode);
@@ -101,11 +91,6 @@
return userType.GetPropertyValue(component, i);
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="i"></param>
- /// <returns></returns>
public virtual CascadeStyle GetCascadeStyle(int i)
{
return CascadeStyle.None;
@@ -121,21 +106,12 @@
get { return false; }
}
- /// <summary></summary>
public override bool IsComponentType
{
get { return true; }
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="cached"></param>
- /// <param name="session"></param>
- /// <param name="owner"></param>
- /// <returns></returns>
- public override object Assemble(object cached, ISessionImplementor session,
- object owner)
+ public override object Assemble(object cached, ISessionImplementor session, object owner)
{
return userType.Assemble(cached, session, owner);
}
@@ -150,11 +126,6 @@
return userType.Disassemble(value, session);
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="mapping"></param>
- /// <returns></returns>
public override int GetColumnSpan(IMapping mapping)
{
IType[] types = userType.PropertyTypes;
@@ -166,45 +137,26 @@
return n;
}
- /// <summary></summary>
public override string Name
{
get { return name; }
}
- /// <summary></summary>
public override System.Type ReturnedClass
{
get { return userType.ReturnedClass; }
}
- /// <summary></summary>
public override bool IsMutable
{
get { return userType.IsMutable; }
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="rs"></param>
- /// <param name="name"></param>
- /// <param name="session"></param>
- /// <param name="owner"></param>
- /// <returns></returns>
public override object NullSafeGet(IDataReader rs, string name, ISessionImplementor session, object owner)
{
return userType.NullSafeGet(rs, new string[] {name}, session, owner);
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="rs"></param>
- /// <param name="names"></param>
- /// <param name="session"></param>
- /// <param name="owner"></param>
- /// <returns></returns>
public override object NullSafeGet(IDataReader rs, string[] names, ISessionImplementor session, object owner)
{
return userType.NullSafeGet(rs, names, session, owner);
@@ -212,19 +164,15 @@
public override void NullSafeSet(IDbCommand st, object value, int index, bool[] settable, ISessionImplementor session)
{
- userType.NullSafeSet(st, value, index, session);
+ userType.NullSafeSet(st, value, index, settable, session);
}
public override void NullSafeSet(IDbCommand cmd, object value, int index, ISessionImplementor session)
{
- userType.NullSafeSet(cmd, value, index, session);
+ bool[] settable = Enumerable.Repeat(true, GetColumnSpan(session.Factory)).ToArray();
+ userType.NullSafeSet(cmd, value, index, settable, session);
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="mapping"></param>
- /// <returns></returns>
public override SqlType[] SqlTypes(IMapping mapping)
{
IType[] types = userType.PropertyTypes;
@@ -241,12 +189,6 @@
return result;
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="value"></param>
- /// <param name="factory"></param>
- /// <returns></returns>
public override string ToLoggableString(object value, ISessionFactoryImplementor factory)
{
return value == null ? "null" : value.ToString();
@@ -277,8 +219,7 @@
get { return null; }
}
- public override object Replace(object original, object current, ISessionImplementor session, object owner,
- IDictionary copiedAlready)
+ public override object Replace(object original, object current, ISessionImplementor session, object owner, IDictionary copiedAlready)
{
return userType.Replace(original, current, session, owner);
}
Modified: trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate/UserTypes/ICompositeUserType.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -9,23 +9,23 @@
/// A UserType that may be dereferenced in a query.
/// This interface allows a custom type to define "properties".
/// These need not necessarily correspond to physical .NET style properties.
- ///
- /// A ICompositeUserType may be used in almost every way
+ ///
+ /// A ICompositeUserType may be used in almost every way
/// that a component may be used. It may even contain many-to-one
/// associations.
- ///
+ ///
/// Implementors must be immutable and must declare a public
/// default constructor.
- ///
+ ///
/// Unlike UserType, cacheability does not depend upon
- /// serializability. Instead, Assemble() and
+ /// serializability. Instead, Assemble() and
/// Disassemble() provide conversion to/from a cacheable
/// representation.
/// </summary>
public interface ICompositeUserType
{
/// <summary>
- /// Get the "property names" that may be used in a query.
+ /// Get the "property names" that may be used in a query.
/// </summary>
string[] PropertyNames { get; }
@@ -80,16 +80,18 @@
/// <returns></returns>
object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner);
- /// <summary>
- /// Write an instance of the mapped class to a prepared statement.
- /// Implementors should handle possibility of null values.
- /// A multi-column type should be written to parameters starting from index.
- /// </summary>
- /// <param name="cmd"></param>
- /// <param name="value"></param>
- /// <param name="index"></param>
- /// <param name="session"></param>
- void NullSafeSet(IDbCommand cmd, object value, int index, ISessionImplementor session);
+ /// <summary>
+ /// Write an instance of the mapped class to a prepared statement.
+ /// Implementors should handle possibility of null values.
+ /// A multi-column type should be written to parameters starting from index.
+ /// If a property is not settable, skip it and don't increment the index.
+ /// </summary>
+ /// <param name="cmd"></param>
+ /// <param name="value"></param>
+ /// <param name="index"></param>
+ /// <param name="settable"></param>
+ /// <param name="session"></param>
+ void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session);
/// <summary>
/// Return a deep copy of the persistent state, stopping at entities and at collections.
@@ -128,7 +130,7 @@
/// with a new (original) value from the detached entity we are merging. For immutable
/// objects, or null values, it is safe to simply return the first parameter. For
/// mutable objects, it is safe to return a copy of the first parameter. However, since
- /// composite user types often define component values, it might make sense to recursively
+ /// composite user types often define component values, it might make sense to recursively
/// replace component values in the target object.
/// </summary>
object Replace(object original, object target, ISessionImplementor session, object owner);
Modified: trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate.DomainModel/DoubleStringType.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -58,12 +58,12 @@
}
- public void NullSafeSet(IDbCommand st, Object value, int index, ISessionImplementor session)
+ public void NullSafeSet(IDbCommand st, Object value, int index, bool[] settable, ISessionImplementor session)
{
string[] strings = (value == null) ? new string[2] : (string[]) value;
- NHibernateUtil.String.NullSafeSet(st, strings[0], index, session);
- NHibernateUtil.String.NullSafeSet(st, strings[1], index + 1, session);
+ if (settable[0]) NHibernateUtil.String.NullSafeSet(st, strings[0], index++, session);
+ if (settable[1]) NHibernateUtil.String.NullSafeSet(st, strings[1], index, session);
}
public string[] PropertyNames
Modified: trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate.DomainModel/MultiplicityType.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -1,6 +1,6 @@
using System;
using System.Data;
-
+using System.Linq;
using NHibernate.Engine;
using NHibernate.Type;
using NHibernate.UserTypes;
@@ -84,7 +84,7 @@
return m;
}
- public void NullSafeSet(IDbCommand st, Object value, int index, ISessionImplementor session)
+ public void NullSafeSet(IDbCommand st, Object value, int index, bool[] settable, ISessionImplementor session)
{
Multiplicity o = (Multiplicity) value;
GlarchProxy g;
@@ -99,8 +99,8 @@
g = o.glarch;
c = o.count;
}
- NHibernateUtil.Int32.NullSafeSet(st, c, index, session);
- NHibernateUtil.Entity(typeof(Glarch)).NullSafeSet(st, g, index + 1, session);
+ if (settable[0]) NHibernateUtil.Int32.NullSafeSet(st, c, index, session);
+ NHibernateUtil.Entity(typeof(Glarch)).NullSafeSet(st, g, index + 1, settable.Skip(1).ToArray(), session);
}
public object DeepCopy(object value)
Modified: trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj 2010-11-02 11:59:09 UTC (rev 5259)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -40,6 +40,9 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4">
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1763/EmptyStringUserType.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -1,12 +1,10 @@
using System;
+using System.Data;
using NHibernate.Engine;
using NHibernate.UserTypes;
namespace NHibernate.Test.NHSpecificTest.NH1763
{
- /// <summary>
- /// Summary description for EmptyStringUserType
- /// </summary>
[Serializable]
public class EmptyStringUserType : ICompositeUserType
{
@@ -65,18 +63,20 @@
return NHibernateUtil.String.NullSafeGet(rs, names[0], session, owner);
}
- public void NullSafeSet(System.Data.IDbCommand st, Object value, int index, NHibernate.Engine.ISessionImplementor session)
+ public void NullSafeSet(System.Data.IDbCommand st, Object value, int index, bool[] settable, NHibernate.Engine.ISessionImplementor session)
{
- string str = null;
- if (value != null) str = value.ToString().Trim();
- if (str == String.Empty)
+ if (settable[0])
{
- str = null;
- NHibernateUtil.String.NullSafeSet(st, str, index, session);
+ string str = null;
+ if (value != null) str = value.ToString().Trim();
+ if (str == String.Empty)
+ {
+ str = null;
+ NHibernateUtil.String.NullSafeSet(st, str, index, session);
+ }
+ else
+ NHibernateUtil.String.NullSafeSet(st, value, index, session);
}
- else
- NHibernateUtil.String.NullSafeSet(st, value, index, session);
-
}
public Object GetPropertyValue(Object component, int property)
@@ -86,17 +86,13 @@
public void SetPropertyValue(Object object1, int i, Object object2)
{
-
}
-
#region ICompositeUserType Members
-
public int GetHashCode(object x)
{
return x == null ? typeof(string).GetHashCode() : x.GetHashCode();
-
}
public object Replace(object original, object target, ISessionImplementor session, object owner)
@@ -104,7 +100,6 @@
return DeepCopy(original);
}
-
#endregion
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2324/CompositeUserType.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -23,8 +23,7 @@
{
return true;
}
- else if (x == null ||
- y == null)
+ else if (x == null || y == null)
{
return false;
}
@@ -42,11 +41,7 @@
{
get
{
- return new[]
- {
- "DataA",
- "DataB"
- };
+ return new[] { "DataA", "DataB" };
}
}
@@ -59,10 +54,10 @@
get
{
return new IType[]
- {
- NHibernateUtil.DateTime,
- NHibernateUtil.DateTime
- };
+ {
+ NHibernateUtil.DateTime,
+ NHibernateUtil.DateTime
+ };
}
}
@@ -141,19 +136,20 @@
/// <param name="cmd"></param>
/// <param name="value"></param>
/// <param name="index"></param>
+ /// <param name="settable"></param>
/// <param name="session"></param>
- public void NullSafeSet(IDbCommand cmd, object value, int index, ISessionImplementor session)
+ public void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session)
{
if (value == null)
{
- ((IDataParameter) cmd.Parameters[index]).Value = DBNull.Value;
- ((IDataParameter) cmd.Parameters[index + 1]).Value = DBNull.Value;
+ if (settable[0]) ((IDataParameter) cmd.Parameters[index++]).Value = DBNull.Value;
+ if (settable[1]) ((IDataParameter) cmd.Parameters[index]).Value = DBNull.Value;
}
else
{
var data = (CompositeData) value;
- NHibernateUtil.DateTime.Set(cmd, data.DataA, index);
- NHibernateUtil.DateTime.Set(cmd, data.DataB, index + 1);
+ if (settable[0]) NHibernateUtil.DateTime.Set(cmd, data.DataA, index++);
+ if (settable[1]) NHibernateUtil.DateTime.Set(cmd, data.DataB, index);
}
}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/A.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -0,0 +1,13 @@
+using System;
+using System.Collections;
+
+namespace NHibernate.Test.NHSpecificTest.NH2392
+{
+ public class A
+ {
+ public int? Id { get; set; }
+ public string StringData1 { get; set; }
+ public PhoneNumber MyPhone { get; set; }
+ public string StringData2 { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Fixture.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NHibernate.Criterion;
+using NHibernate.Linq;
+using NHibernate.Linq.Functions;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.NH2392
+{
+ [TestFixture]
+ public class Fixture : BugTestCase
+ {
+ protected override void OnTearDown()
+ {
+ using (ISession s = sessions.OpenSession())
+ {
+ s.Delete("from A");
+ s.Flush();
+ }
+ }
+
+ [Test]
+ public void CompositeUserTypeSettability()
+ {
+ ISession s = OpenSession();
+ try
+ {
+ s.Save(new A { StringData1 = "first", StringData2 = "second" });
+ s.Flush();
+ }
+ finally
+ {
+ s.Close();
+ }
+
+ s = OpenSession();
+ try
+ {
+ A a = s.CreateCriteria<A>().List<A>().First();
+ a.MyPhone = new PhoneNumber(1, null);
+ s.Save(a);
+ s.Flush();
+ }
+ finally
+ {
+ s.Close();
+ }
+
+ s = OpenSession();
+ try
+ {
+ A a = s.CreateCriteria<A>().List<A>().First();
+ a.MyPhone = new PhoneNumber(1, "555-1234");
+ s.Save(a);
+ s.Flush();
+ }
+ finally
+ {
+ s.Close();
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/Mappings.hbm.xml 2010-11-02 11:59:09 UTC (rev 5259)
@@ -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.NH2392">
+ <class name="A" table="a" lazy="false" optimistic-lock="dirty" dynamic-update="true">
+ <id name="Id" column="id" unsaved-value="null">
+ <generator class="native" />
+ </id>
+ <property name="StringData1"/>
+ <property name="MyPhone" type="NHibernate.Test.NHSpecificTest.NH2392.PhoneNumberUserType, NHibernate.Test">
+ <column name="MyPhoneCountryCode"/>
+ <column name="MyPhoneNumber"/>
+ </property>
+ <property name="StringData2"/>
+ </class>
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumber.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace NHibernate.Test.NHSpecificTest.NH2392
+{
+ public class PhoneNumber
+ {
+ public PhoneNumber(int countryCode, string number)
+ {
+ CountryCode = countryCode;
+ Number = number;
+ }
+
+ public int CountryCode { get; private set; }
+ public string Number { get; private set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2392/PhoneNumberUserType.cs 2010-11-02 11:59:09 UTC (rev 5259)
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using NHibernate.Engine;
+using NHibernate.Type;
+using NHibernate.UserTypes;
+
+namespace NHibernate.Test.NHSpecificTest.NH2392
+{
+ class PhoneNumberUserType : ICompositeUserType
+ {
+ public string[] PropertyNames
+ {
+ get { return new[] { "CountryCode", "Number" }; }
+ }
+
+ public IType[] PropertyTypes
+ {
+ get { return new[] { NHibernateUtil.Int32, NHibernateUtil.String }; }
+ }
+
+ public object GetPropertyValue(object component, int property)
+ {
+ PhoneNumber phone = (PhoneNumber)component;
+
+ switch (property)
+ {
+ case 0: return phone.CountryCode;
+ case 1: return phone.Number;
+ default: throw new NotImplementedException();
+ }
+ }
+
+ public void SetPropertyValue(object component, int property, object value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public System.Type ReturnedClass
+ {
+ get { return typeof(PhoneNumber); }
+ }
+
+ public bool Equals(object x, object y)
+ {
+ if (ReferenceEquals(x, null) && ReferenceEquals(y, null))
+ return true;
+
+ if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
+ return false;
+
+ return x.Equals(y);
+ }
+
+ public int GetHashCode(object x)
+ {
+ return x.GetHashCode();
+ }
+
+ public object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner)
+ {
+ if (dr.IsDBNull(dr.GetOrdinal(names[0])))
+ return null;
+
+ return new PhoneNumber(
+ (int)NHibernateUtil.Int32.NullSafeGet(dr, names[0], session, owner),
+ (string)NHibernateUtil.String.NullSafeGet(dr, names[1], session, owner));
+ }
+
+ public void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session)
+ {
+ object countryCode = value == null ? null : (int?)((PhoneNumber)value).CountryCode;
+ object number = value == null ? null : ((PhoneNumber)value).Number;
+
+ if (settable[0]) NHibernateUtil.Int32.NullSafeSet(cmd, countryCode, index++, session);
+ if (settable[1]) NHibernateUtil.String.NullSafeSet(cmd, number, index, session);
+ }
+
+ public object DeepCopy(object value)
+ {
+ return value;
+ }
+
+ public bool IsMutable
+ {
+ get { return false; }
+ }
+
+ public object Disassemble(object value, ISessionImplementor session)
+ {
+ return value;
+ }
+
+ public object Assemble(object cached, ISessionImplementor session, object owner)
+ {
+ return cached;
+ }
+
+ public object Replace(object original, object target, ISessionImplementor session, object owner)
+ {
+ return original;
+ }
+ }
+}
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-11-02 11:48:40 UTC (rev 5258)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-11-02 11:59:09 UTC (rev 5259)
@@ -536,6 +536,10 @@
<Compile Include="NHSpecificTest\NH2378\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2378\TestEntity.cs" />
<Compile Include="NHSpecificTest\NH2378\TestEntityDto.cs" />
+ <Compile Include="NHSpecificTest\NH2392\A.cs" />
+ <Compile Include="NHSpecificTest\NH2392\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2392\PhoneNumber.cs" />
+ <Compile Include="NHSpecificTest\NH2392\PhoneNumberUserType.cs" />
<Compile Include="PolymorphicGetAndLoad\Domain.cs" />
<Compile Include="PolymorphicGetAndLoad\PolymorphicGetAndLoadTest.cs" />
<Compile Include="TypesTest\CharClass.cs" />
@@ -1827,6 +1831,7 @@
<EmbeddedResource Include="NHSpecificTest\NH1136\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2202\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1869\Mappings.hbm.xml" />
+ <EmbeddedResource Include="NHSpecificTest\NH2392\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj">
@@ -2691,6 +2696,7 @@
<EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" />
</ItemGroup>
<ItemGroup>
+ <Folder Include="NHSpecificTest\NH2392" />
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|