|
From: <fab...@us...> - 2010-10-06 20:55:25
|
Revision: 5234
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5234&view=rev
Author: fabiomaulo
Date: 2010-10-06 20:55:15 +0000 (Wed, 06 Oct 2010)
Log Message:
-----------
Fix NH-2358 and related issues
Modified Paths:
--------------
trunk/nhibernate/releasenotes.txt
trunk/nhibernate/src/NHibernate/Type/DateTimeOffSetType.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffSetFixture.cs
Modified: trunk/nhibernate/releasenotes.txt
===================================================================
--- trunk/nhibernate/releasenotes.txt 2010-10-06 18:58:13 UTC (rev 5233)
+++ trunk/nhibernate/releasenotes.txt 2010-10-06 20:55:15 UTC (rev 5234)
@@ -9,6 +9,7 @@
##### Possible Breaking Changes #####
* [NH-2251] - Signature change for GetLimitString in Dialect
* [NH-2284] - Obsolete members removed
+ * Related to [NH-2358]: DateTimeOffset type now works as a DateTimeOffset instead a "surrogate" of DateTime
Build 3.0.0.Alpha3 (rev5226)
=============================
Modified: trunk/nhibernate/src/NHibernate/Type/DateTimeOffSetType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/DateTimeOffSetType.cs 2010-10-06 18:58:13 UTC (rev 5233)
+++ trunk/nhibernate/src/NHibernate/Type/DateTimeOffSetType.cs 2010-10-06 20:55:15 UTC (rev 5234)
@@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Data;
+using NHibernate.Engine;
using NHibernate.SqlTypes;
namespace NHibernate.Type
@@ -10,7 +11,7 @@
/// Maps a <see cref="System.DateTimeOffset" /> Property to a <see cref="DbType.DateTimeOffset"/>
/// </summary>
[Serializable]
- public class DateTimeOffsetType : DateTimeType
+ public class DateTimeOffsetType : PrimitiveType, IIdentifierType, ILiteralType, IVersionType
{
/// <summary></summary>
public DateTimeOffsetType()
@@ -33,8 +34,13 @@
get { return typeof (DateTimeOffset); }
}
- public override IComparer Comparator
+ public override object DefaultValue
{
+ get { throw new NotImplementedException(); }
+ }
+
+ public IComparer Comparator
+ {
get { return Comparer<DateTimeOffset>.Default; }
}
@@ -42,8 +48,7 @@
{
var dateValue = (DateTimeOffset) value;
((IDataParameter) st.Parameters[index]).Value =
- new DateTimeOffset(dateValue.Year, dateValue.Month, dateValue.Day, dateValue.Hour, dateValue.Minute,
- dateValue.Second, dateValue.Offset);
+ new DateTimeOffset(dateValue.Ticks, dateValue.Offset);
}
public override object Get(IDataReader rs, int index)
@@ -52,8 +57,7 @@
{
var dbValue = (DateTimeOffset) rs[index];
;
- return new DateTimeOffset(dbValue.Year, dbValue.Month, dbValue.Day, dbValue.Hour, dbValue.Minute, dbValue.Second,
- dbValue.Offset);
+ return new DateTimeOffset(dbValue.Ticks, dbValue.Offset);
}
catch (Exception ex)
{
@@ -61,6 +65,21 @@
}
}
+ public override object Get(IDataReader rs, string name)
+ {
+ return Get(rs, rs.GetOrdinal(name));
+ }
+
+ public object Next(object current, ISessionImplementor session)
+ {
+ return Seed(session);
+ }
+
+ public object Seed(ISessionImplementor session)
+ {
+ return DateTimeOffset.Now;
+ }
+
public override bool IsEqual(object x, object y)
{
if (x == y)
@@ -76,34 +95,12 @@
var date1 = (DateTimeOffset) x;
var date2 = (DateTimeOffset) y;
- if (date1.Equals(date2))
- return true;
-
- return (date1.Year == date2.Year &&
- date1.Month == date2.Month &&
- date1.Day == date2.Day &&
- date1.Hour == date2.Hour &&
- date1.Minute == date2.Minute &&
- date1.Second == date2.Second &&
- date1.Offset == date2.Offset);
+ return date1.Equals(date2);
}
- public override int GetHashCode(object x, EntityMode entityMode)
+ public object StringToObject(string xml)
{
- // Custom hash code implementation because DateTimeType is only accurate
- // up to seconds.
- var date = (DateTimeOffset) x;
- int hashCode = 1;
- unchecked
- {
- hashCode = 31*hashCode + date.Second;
- hashCode = 31*hashCode + date.Minute;
- hashCode = 31*hashCode + date.Hour;
- hashCode = 31*hashCode + date.Day;
- hashCode = 31*hashCode + date.Month;
- hashCode = 31*hashCode + date.Year;
- }
- return hashCode;
+ return string.IsNullOrEmpty(xml) ? null : FromStringValue(xml);
}
public override string ToString(object val)
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffSetFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffSetFixture.cs 2010-10-06 18:58:13 UTC (rev 5233)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffSetFixture.cs 2010-10-06 20:55:15 UTC (rev 5234)
@@ -1,7 +1,9 @@
using System;
using System.Collections;
using System.Data;
+using NHibernate.Type;
using NUnit.Framework;
+using SharpTestsEx;
namespace NHibernate.Test.NHSpecificTest.Dates
{
@@ -23,8 +25,72 @@
{
DateTimeOffset NowOS = DateTimeOffset.Now;
- SavingAndRetrievingAction(new AllDates {Sql_datetimeoffset = NowOS},
- entity => DateTimeAssert.AreEqual(entity.Sql_datetimeoffset, NowOS));
+ AllDates dates = new AllDates { Sql_datetimeoffset = NowOS };
+
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ s.Save(dates);
+ tx.Commit();
+ }
+
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ var datesRecovered = s.CreateQuery("from AllDates").UniqueResult<AllDates>();
+ datesRecovered.Sql_datetimeoffset.Should().Be(NowOS);
+ }
+
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ var datesRecovered = s.CreateQuery("from AllDates").UniqueResult<AllDates>();
+ s.Delete(datesRecovered);
+ tx.Commit();
+ }
}
+
+ [Test]
+ public void WhenEqualTicksThenShouldMatchIsEqual()
+ {
+ var type = new DateTimeOffsetType();
+ var now = DateTimeOffset.Now;
+ type.IsEqual(new DateTimeOffset(now.Ticks, now.Offset), new DateTimeOffset(now.Ticks, now.Offset)).Should().Be.True();
+ }
+
+ [Test]
+ public void WhenNotEqualTicksThenShouldNotMatchIsEqual()
+ {
+ var type = new DateTimeOffsetType();
+ var now = DateTimeOffset.Now;
+ type.IsEqual(new DateTimeOffset(now.Ticks - 1, now.Offset), new DateTimeOffset(now.Ticks, now.Offset)).Should().Be.False();
+ }
+
+ [Test]
+ public void HashCodeShouldHaveSameBehaviorOfNetType()
+ {
+ var type = new DateTimeOffsetType();
+ var now = DateTimeOffset.Now;
+ var exactClone = new DateTimeOffset(now.Ticks, now.Offset);
+ (now.GetHashCode() == exactClone.GetHashCode()).Should().Be.EqualTo(now.GetHashCode() == type.GetHashCode(exactClone, EntityMode.Poco));
+ }
+
+ [Test]
+ public void Next()
+ {
+ var type = (DateTimeOffsetType)NHibernateUtil.DateTimeOffset;
+ var current = DateTimeOffset.Now.AddTicks(-1);
+ object next = type.Next(current, null);
+
+ next.Should().Be.OfType<DateTimeOffset>().And.ValueOf.Ticks.Should().Be.GreaterThan(current.Ticks);
+ }
+
+ [Test]
+ public void Seed()
+ {
+ var type = (DateTimeOffsetType)NHibernateUtil.DateTimeOffset;
+ type.Seed(null).Should().Be.OfType<DateTimeOffset>();
+ }
+
}
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|