|
From: <fab...@us...> - 2010-07-22 03:55:28
|
Revision: 5036
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5036&view=rev
Author: fabiomaulo
Date: 2010-07-22 03:55:22 +0000 (Thu, 22 Jul 2010)
Log Message:
-----------
Fix NH-2249
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Type/DateType.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.cs
trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.hbm.xml
trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTypeTest.cs
Modified: trunk/nhibernate/src/NHibernate/Type/DateType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/DateType.cs 2010-07-21 20:58:52 UTC (rev 5035)
+++ trunk/nhibernate/src/NHibernate/Type/DateType.cs 2010-07-22 03:55:22 UTC (rev 5036)
@@ -1,6 +1,8 @@
using System;
+using System.Collections.Generic;
using System.Data;
using NHibernate.SqlTypes;
+using NHibernate.UserTypes;
namespace NHibernate.Type
{
@@ -9,12 +11,14 @@
/// <see cref="DbType.Date"/> column
/// </summary>
[Serializable]
- public class DateType : PrimitiveType, IIdentifierType, ILiteralType
+ public class DateType : PrimitiveType, IIdentifierType, ILiteralType, IParameterizedType
{
- private static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01);
+ public const string BaseValueParameterName = "BaseValue";
+ public static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01);
+ private DateTime customBaseDate = BaseDateValue;
/// <summary></summary>
- internal DateType() : base(SqlTypeFactory.Date)
+ public DateType() : base(SqlTypeFactory.Date)
{
}
@@ -29,7 +33,7 @@
try
{
DateTime dbValue = Convert.ToDateTime(rs[index]);
- return new DateTime(dbValue.Year, dbValue.Month, dbValue.Day);
+ return dbValue.Date;
}
catch (Exception ex)
{
@@ -51,7 +55,7 @@
{
var parm = st.Parameters[index] as IDataParameter;
var dateTime = (DateTime)value;
- if (dateTime < BaseDateValue)
+ if (dateTime < customBaseDate)
{
parm.Value = DBNull.Value;
}
@@ -118,12 +122,25 @@
public override object DefaultValue
{
- get { return BaseDateValue; }
+ get { return customBaseDate; }
}
public override string ObjectToSQLString(object value, Dialect.Dialect dialect)
{
return '\'' + ((DateTime)value).ToShortDateString() + '\'';
}
+
+ public void SetParameterValues(IDictionary<string, string> parameters)
+ {
+ if(parameters == null)
+ {
+ return;
+ }
+ string value;
+ if (parameters.TryGetValue(BaseValueParameterName, out value))
+ {
+ customBaseDate = DateTime.Parse(value);
+ }
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-07-21 20:58:52 UTC (rev 5035)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-07-22 03:55:22 UTC (rev 5036)
@@ -1525,6 +1525,8 @@
<Compile Include="TypesTest\ByteTypeFixture.cs" />
<Compile Include="TypesTest\CurrencyClass.cs" />
<Compile Include="TypesTest\CurrencyTypeFixture.cs" />
+ <Compile Include="TypesTest\DateClass.cs" />
+ <Compile Include="TypesTest\DateTypeTest.cs" />
<Compile Include="TypesTest\TimeAsTimeSpanClass.cs" />
<Compile Include="TypesTest\TimeAsTimeSpanTypeFixture.cs" />
<Compile Include="TypesTest\TimeSpanClass.cs" />
@@ -2200,6 +2202,7 @@
<EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" />
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="TypesTest\DateClass.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2207\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2243\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1891\FormulaEscaping.hbm.xml" />
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.cs 2010-07-22 03:55:22 UTC (rev 5036)
@@ -0,0 +1,9 @@
+using System;
+
+namespace NHibernate.Test.TypesTest
+{
+ public class DateClass
+ {
+ public DateTime? DateValue { get; set; }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/DateClass.hbm.xml 2010-07-22 03:55:22 UTC (rev 5036)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.TypesTest"
+ default-lazy="false">
+
+ <class name="DateClass">
+ <id type="int">
+ <generator class="native" />
+ </id>
+ <property name="DateValue">
+ <type name="NHibernate.Type.DateType, NHibernate">
+ <param name="BaseValue">1900/01/01</param>
+ </type>
+ </property>
+ </class>
+</hibernate-mapping>
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTypeTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTypeTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/DateTypeTest.cs 2010-07-22 03:55:22 UTC (rev 5036)
@@ -0,0 +1,93 @@
+using System.Collections.Generic;
+using NHibernate.Dialect;
+using NHibernate.Type;
+using NUnit.Framework;
+using SharpTestsEx;
+using System;
+
+namespace NHibernate.Test.TypesTest
+{
+ public class DateTypeTest
+ {
+ [Test]
+ public void WhenNoParameterThenDefaultValueIsBaseDateValue()
+ {
+ var dateType = new DateType();
+ dateType.DefaultValue.Should().Be(DateType.BaseDateValue);
+ }
+
+ [Test]
+ public void WhenSetParameterThenDefaultValueIsParameterValue()
+ {
+ var dateType = new DateType();
+ dateType.SetParameterValues(new Dictionary<string, string>{{DateType.BaseValueParameterName, "0001/01/01"}});
+ dateType.DefaultValue.Should().Be(DateTime.MinValue);
+ }
+
+ [Test]
+ public void WhenSetParameterNullThenNotThrow()
+ {
+ var dateType = new DateType();
+ dateType.Executing(dt=> dt.SetParameterValues(null)).NotThrows();
+ }
+ }
+
+ public class DateTypeFixture : TypeFixtureBase
+ {
+ protected override string TypeName
+ {
+ get { return "Date"; }
+ }
+
+ [Test]
+ public void ShouldBeDateType()
+ {
+ if (!(Dialect is MsSql2008Dialect))
+ {
+ Assert.Ignore("This test does not apply to " + Dialect);
+ }
+ var sqlType = Dialect.GetTypeName(NHibernateUtil.Date.SqlType);
+ sqlType.ToLowerInvariant().Should().Be("date");
+ }
+
+ [Test]
+ public void ReadWriteNormal()
+ {
+ var expected = DateTime.Today.Date;
+
+ var basic = new DateClass { DateValue = expected.AddHours(1) };
+ object savedId;
+ using (ISession s = OpenSession())
+ {
+ savedId = s.Save(basic);
+ s.Flush();
+ }
+ using (ISession s = OpenSession())
+ {
+ basic = s.Get<DateClass>(savedId);
+ basic.DateValue.Should().Be(expected);
+ s.Delete(basic);
+ s.Flush();
+ }
+ }
+
+ [Test]
+ public void ReadWriteBaseValue()
+ {
+ var basic = new DateClass { DateValue = new DateTime(1899,1,1) };
+ object savedId;
+ using (ISession s = OpenSession())
+ {
+ savedId = s.Save(basic);
+ s.Flush();
+ }
+ using (ISession s = OpenSession())
+ {
+ basic = s.Get<DateClass>(savedId);
+ basic.DateValue.HasValue.Should().Be.False();
+ s.Delete(basic);
+ s.Flush();
+ }
+ }
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|