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