|
From: <fab...@us...> - 2010-08-06 13:56:22
|
Revision: 5117
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5117&view=rev
Author: fabiomaulo
Date: 2010-08-06 13:56:15 +0000 (Fri, 06 Aug 2010)
Log Message:
-----------
Apply NH-1135 with modifications to avoid breaking changes
Modified Paths:
--------------
trunk/nhibernate/doc/reference/modules/basic_mapping.xml
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate/NHibernateUtil.cs
trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeTypeFixture.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Type/AbstractDateTimeSpecificKindType.cs
trunk/nhibernate/src/NHibernate/Type/LocalDateTimeType.cs
trunk/nhibernate/src/NHibernate/Type/UtcDateTimeType.cs
trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.cs
trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.hbm.xml
trunk/nhibernate/src/NHibernate.Test/TypesTest/LocalDateTimeTypeFixture.cs
trunk/nhibernate/src/NHibernate.Test/TypesTest/UtcDateTimeTypeFixture.cs
Modified: trunk/nhibernate/doc/reference/modules/basic_mapping.xml
===================================================================
--- trunk/nhibernate/doc/reference/modules/basic_mapping.xml 2010-08-05 16:11:15 UTC (rev 5116)
+++ trunk/nhibernate/doc/reference/modules/basic_mapping.xml 2010-08-06 13:56:15 UTC (rev 5117)
@@ -2283,7 +2283,19 @@
<entry><literal>DbType.DateTime</literal> - ignores the milliseconds</entry>
<entry>Default when no <literal>type</literal> attribute specified.</entry>
</row>
- <row>
+ <row>
+ <entry><literal>LocalDateTime</literal></entry>
+ <entry><literal>System.DateTime</literal></entry>
+ <entry><literal>DbType.DateTime</literal> - ignores the milliseconds</entry>
+ <entry>Ensures the <literal>DateTimeKind</literal> is set to <literal>DateTimeKind.Local</literal></entry>
+ </row>
+ <row>
+ <entry><literal>UtcDateTime</literal></entry>
+ <entry><literal>System.DateTime</literal></entry>
+ <entry><literal>DbType.DateTime</literal> - ignores the milliseconds</entry>
+ <entry>Ensures the <literal>DateTimeKind</literal> is set to <literal>DateTimeKind.Utc</literal></entry>
+ </row>
+ <row>
<entry><literal>Decimal</literal></entry>
<entry><literal>System.Decimal</literal></entry>
<entry><literal>DbType.Decimal</literal></entry>
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-08-05 16:11:15 UTC (rev 5116)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-08-06 13:56:15 UTC (rev 5117)
@@ -851,9 +851,12 @@
<Compile Include="Tool\hbm2ddl\ScriptSplitter.cs" />
<Compile Include="Transaction\AdoNetWithDistrubtedTransactionFactory.cs" />
<Compile Include="Transform\ToListResultTransformer.cs" />
+ <Compile Include="Type\AbstractDateTimeSpecificKindType.cs" />
<Compile Include="Type\DbTimestampType.cs" />
<Compile Include="Type\DefaultCollectionTypeFactory.cs" />
<Compile Include="Bytecode\ICollectionTypeFactory.cs" />
+ <Compile Include="Type\LocalDateTimeType.cs" />
+ <Compile Include="Type\UtcDateTimeType.cs" />
<Compile Include="Util\ExpressionsHelper.cs" />
<Compile Include="Util\NullableDictionary.cs" />
<Compile Include="Hql\Ast\ANTLR\Util\PathHelper.cs" />
Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-08-05 16:11:15 UTC (rev 5116)
+++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -121,6 +121,16 @@
public static readonly NullableType DateTime2 = new DateTime2Type();
/// <summary>
+ /// NHibernate local date type
+ /// </summary>
+ public static readonly NullableType LocalDateTime = new LocalDateTimeType();
+
+ /// <summary>
+ /// NHibernate utc date type
+ /// </summary>
+ public static readonly NullableType UtcDateTime = new UtcDateTimeType();
+
+ /// <summary>
/// NHibernate date type
/// </summary>
public static readonly NullableType DateTimeOffset = new DateTimeOffsetType();
Added: trunk/nhibernate/src/NHibernate/Type/AbstractDateTimeSpecificKindType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/AbstractDateTimeSpecificKindType.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Type/AbstractDateTimeSpecificKindType.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -0,0 +1,65 @@
+using System;
+using System.Data;
+
+namespace NHibernate.Type
+{
+ [Serializable]
+ public abstract class AbstractDateTimeSpecificKindType : DateTimeType
+ {
+ protected abstract DateTimeKind DateTimeKind { get; }
+
+ protected virtual DateTime CreateDateTime(DateTime dateValue)
+ {
+ return new DateTime(dateValue.Year, dateValue.Month, dateValue.Day, dateValue.Hour, dateValue.Minute, dateValue.Second, DateTimeKind);
+ }
+
+ public override object FromStringValue(string xml)
+ {
+ return DateTime.SpecifyKind(DateTime.Parse(xml), DateTimeKind);
+ }
+
+ public override int GetHashCode(object x, EntityMode entityMode)
+ {
+ int hashCode = base.GetHashCode(x, entityMode);
+ unchecked
+ {
+ hashCode = 31*hashCode + ((DateTime) x).Kind.GetHashCode();
+ }
+ return hashCode;
+ }
+
+ public override bool IsEqual(object x, object y)
+ {
+ if (x == y)
+ {
+ return true;
+ }
+
+ if (x == null || y == null)
+ {
+ return false;
+ }
+
+ return base.IsEqual(x, y) && ((DateTime) x).Kind == ((DateTime) y).Kind;
+ }
+
+ public override void Set(IDbCommand st, object value, int index)
+ {
+ var dateValue = (DateTime) value;
+ ((IDataParameter) st.Parameters[index]).Value = CreateDateTime(dateValue);
+ }
+
+ public override object Get(IDataReader rs, int index)
+ {
+ try
+ {
+ DateTime dbValue = Convert.ToDateTime(rs[index]);
+ return CreateDateTime(dbValue);
+ }
+ catch (Exception ex)
+ {
+ throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex);
+ }
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Type/LocalDateTimeType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/LocalDateTimeType.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Type/LocalDateTimeType.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -0,0 +1,18 @@
+using System;
+
+namespace NHibernate.Type
+{
+ [Serializable]
+ public class LocalDateTimeType : AbstractDateTimeSpecificKindType
+ {
+ protected override DateTimeKind DateTimeKind
+ {
+ get { return DateTimeKind.Local; }
+ }
+
+ public override string Name
+ {
+ get { return "LocalDateTime"; }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-08-05 16:11:15 UTC (rev 5116)
+++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -238,6 +238,8 @@
RegisterType(NHibernateUtil.YesNo, new[] { "yes_no" });
RegisterType(NHibernateUtil.Ticks, new[] { "ticks" });
RegisterType(NHibernateUtil.TimeAsTimeSpan, EmptyAliases);
+ RegisterType(NHibernateUtil.LocalDateTime, new[] { "localdatetime" });
+ RegisterType(NHibernateUtil.UtcDateTime, new[] { "utcdatetime" });
RegisterType(NHibernateUtil.Currency, new[] { "currency" },
(p, s) => GetType(NHibernateUtil.Currency, p, s, st => new CurrencyType(st)));
Added: trunk/nhibernate/src/NHibernate/Type/UtcDateTimeType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/UtcDateTimeType.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Type/UtcDateTimeType.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -0,0 +1,18 @@
+using System;
+
+namespace NHibernate.Type
+{
+ [Serializable]
+ public class UtcDateTimeType : AbstractDateTimeSpecificKindType
+ {
+ protected override DateTimeKind DateTimeKind
+ {
+ get { return DateTimeKind.Utc; }
+ }
+
+ public override string Name
+ {
+ get { return "UtcDateTime"; }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-05 16:11:15 UTC (rev 5116)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-08-06 13:56:15 UTC (rev 5117)
@@ -451,6 +451,9 @@
<Compile Include="NHSpecificTest\NH2148\Domain.cs" />
<Compile Include="NHSpecificTest\NH2245\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2245\Model.cs" />
+ <Compile Include="TypesTest\DateTimeClass.cs" />
+ <Compile Include="TypesTest\LocalDateTimeTypeFixture.cs" />
+ <Compile Include="TypesTest\UtcDateTimeTypeFixture.cs" />
<Compile Include="UtilityTest\ReflectionHelperIsMethodOfTests.cs" />
<Compile Include="UtilityTest\ReflectionHelperTest.cs" />
<Compile Include="Linq\RegresstionTests.cs" />
@@ -2232,6 +2235,7 @@
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
<EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="TypesTest\DateTimeClass.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1421\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2148\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2245\Mappings.hbm.xml" />
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -0,0 +1,38 @@
+using System;
+
+namespace NHibernate.Test.TypesTest
+{
+ /// <summary>
+ /// Summary description for GuidClass.
+ /// </summary>
+ public class DateTimeClass
+ {
+ private int _id;
+ private DateTime? _utcDateTimeValue;
+ private DateTime? _localDateTimeValue;
+ public DateTimeClass()
+ {
+ NormalDateTimeValue = DateTime.Today;
+ }
+
+ public int Id
+ {
+ get { return _id; }
+ set { _id = value; }
+ }
+
+ public DateTime? UtcDateTimeValue
+ {
+ get { return _utcDateTimeValue; }
+ set { _utcDateTimeValue = value; }
+ }
+
+ public DateTime? LocalDateTimeValue
+ {
+ get { return _localDateTimeValue; }
+ set { _localDateTimeValue = value; }
+ }
+
+ public DateTime NormalDateTimeValue { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeClass.hbm.xml 2010-08-06 13:56:15 UTC (rev 5117)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
+
+ <class
+ name="NHibernate.Test.TypesTest.DateTimeClass, NHibernate.Test"
+ table="bc_datetime"
+ >
+
+ <id name="Id" column="id">
+ <generator class="assigned" />
+ </id>
+
+ <property name="UtcDateTimeValue" type="UtcDateTime" column="utcdatec"/>
+ <property name="LocalDateTimeValue" type="LocalDateTime" column="localdatec"/>
+ <property name="NormalDateTimeValue" />
+ </class>
+</hibernate-mapping>
Modified: trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeTypeFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeTypeFixture.cs 2010-08-05 16:11:15 UTC (rev 5116)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTimeTypeFixture.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -1,6 +1,7 @@
using System;
using NHibernate.Type;
using NUnit.Framework;
+using SharpTestsEx;
namespace NHibernate.Test.TypesTest
{
@@ -43,5 +44,15 @@
value2 = ((DateTime)value2).AddHours(2);
Assert.IsFalse(value1 == value2, "value2 was changed, value1 should not have changed also.");
}
+
+ [Test]
+ public void EqualityShouldIgnoreKindAndMillisecond()
+ {
+ var type = (DateTimeType)NHibernateUtil.DateTime;
+ var localTime = DateTime.Now;
+ var unspecifiedKid = new DateTime(localTime.Year, localTime.Month, localTime.Day, localTime.Hour, localTime.Minute, localTime.Second, 0, DateTimeKind.Unspecified);
+ type.Satisfy(t => t.IsEqual(localTime, unspecifiedKid));
+ type.Satisfy(t => t.IsEqual(localTime, unspecifiedKid, EntityMode.Poco));
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/LocalDateTimeTypeFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/LocalDateTimeTypeFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/LocalDateTimeTypeFixture.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -0,0 +1,43 @@
+using System;
+using NUnit.Framework;
+
+namespace NHibernate.Test.TypesTest
+{
+ /// <summary>
+ /// The Unit Tests for the UtcDateTimeType.
+ /// </summary>
+ [TestFixture]
+ public class LocalDateTimeTypeFixture : TypeFixtureBase
+ {
+ protected override string TypeName
+ {
+ get { return "DateTime"; }
+ }
+
+ [Test]
+ public void ReadWrite()
+ {
+ DateTime val = DateTime.UtcNow;
+ DateTime expected = new DateTime(val.Year, val.Month, val.Day, val.Hour, val.Minute, val.Second, DateTimeKind.Local);
+
+ DateTimeClass basic = new DateTimeClass();
+ basic.Id = 1;
+ basic.LocalDateTimeValue = val;
+
+ ISession s = OpenSession();
+ s.Save(basic);
+ s.Flush();
+ s.Close();
+
+ s = OpenSession();
+ basic = (DateTimeClass) s.Load(typeof (DateTimeClass), 1);
+
+ Assert.AreEqual(DateTimeKind.Local, basic.LocalDateTimeValue.Value.Kind);
+ Assert.AreEqual(expected, basic.LocalDateTimeValue.Value);
+
+ s.Delete(basic);
+ s.Flush();
+ s.Close();
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/UtcDateTimeTypeFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/UtcDateTimeTypeFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/UtcDateTimeTypeFixture.cs 2010-08-06 13:56:15 UTC (rev 5117)
@@ -0,0 +1,43 @@
+using System;
+using NUnit.Framework;
+
+namespace NHibernate.Test.TypesTest
+{
+ /// <summary>
+ /// The Unit Tests for the UtcDateTimeType.
+ /// </summary>
+ [TestFixture]
+ public class UtcDateTimeTypeFixture : TypeFixtureBase
+ {
+ protected override string TypeName
+ {
+ get { return "DateTime"; }
+ }
+
+ [Test]
+ public void ReadWrite()
+ {
+ DateTime val = DateTime.UtcNow;
+ DateTime expected = new DateTime(val.Year, val.Month, val.Day, val.Hour, val.Minute, val.Second, DateTimeKind.Utc);
+
+ DateTimeClass basic = new DateTimeClass();
+ basic.Id = 1;
+ basic.UtcDateTimeValue = val;
+
+ ISession s = OpenSession();
+ s.Save(basic);
+ s.Flush();
+ s.Close();
+
+ s = OpenSession();
+ basic = (DateTimeClass) s.Load(typeof (DateTimeClass), 1);
+
+ Assert.AreEqual(DateTimeKind.Utc, basic.UtcDateTimeValue.Value.Kind);
+ Assert.AreEqual(expected, basic.UtcDateTimeValue.Value);
+
+ s.Delete(basic);
+ s.Flush();
+ s.Close();
+ }
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|