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