Skip to content

Commit 0629a92

Browse files
NH-1752 - Cease silently nullifying dates before 1753
Obsolete base date parameterization and set its default value to MinDate
1 parent 2fe11e9 commit 0629a92

File tree

5 files changed

+127
-35
lines changed

5 files changed

+127
-35
lines changed

src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public async Task WillGetSessionIdFromSessionLogsAsync()
5151

5252
await (s.GetAsync<Person>(1));//will execute some sql
5353

54-
var loggingEvent = spy.Events[0];
54+
var loggingEvent = spy.GetWholeLog();
5555
Assert.That(loggingEvent.Contains(sessionId.ToString()), Is.True);
5656
}
5757
}
@@ -89,12 +89,9 @@ public TextLogSpy(string loggerName, string pattern)
8989
loggerImpl.Level = Level.All;
9090
}
9191

92-
public string[] Events
92+
public string GetWholeLog()
9393
{
94-
get
95-
{
96-
return stringBuilder.ToString().Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
97-
}
94+
return stringBuilder.ToString();
9895
}
9996

10097
public void Dispose()
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Collections.Generic;
12+
using NHibernate.Dialect;
13+
using NHibernate.Type;
14+
using NUnit.Framework;
15+
using System;
16+
17+
namespace NHibernate.Test.TypesTest
18+
{
19+
using System.Threading.Tasks;
20+
using System.Threading;
21+
22+
[TestFixture]
23+
public class DateTypeFixtureAsync : TypeFixtureBase
24+
{
25+
protected override string TypeName
26+
{
27+
get { return "Date"; }
28+
}
29+
30+
[Test]
31+
public Task ReadWriteNormalAsync()
32+
{
33+
try
34+
{
35+
var expected = DateTime.Today.Date;
36+
37+
return ReadWriteAsync(expected);
38+
}
39+
catch (Exception ex)
40+
{
41+
return Task.FromException<object>(ex);
42+
}
43+
}
44+
45+
[Test]
46+
public Task ReadWriteMinAsync()
47+
{
48+
try
49+
{
50+
var expected = Sfi.ConnectionProvider.Driver.MinDate;
51+
52+
return ReadWriteAsync(expected);
53+
}
54+
catch (Exception ex)
55+
{
56+
return Task.FromException<object>(ex);
57+
}
58+
}
59+
60+
private async Task ReadWriteAsync(DateTime expected, CancellationToken cancellationToken = default(CancellationToken))
61+
{
62+
var basic = new DateClass { DateValue = expected.AddHours(1) };
63+
object savedId;
64+
using (var s = OpenSession())
65+
{
66+
savedId = await (s.SaveAsync(basic, cancellationToken));
67+
await (s.FlushAsync(cancellationToken));
68+
}
69+
using (var s = OpenSession())
70+
{
71+
basic = await (s.GetAsync<DateClass>(savedId, cancellationToken));
72+
Assert.That(basic.DateValue, Is.EqualTo(expected));
73+
await (s.DeleteAsync(basic, cancellationToken));
74+
await (s.FlushAsync(cancellationToken));
75+
}
76+
}
77+
}
78+
}

src/NHibernate.Test/TypesTest/DateTypeTest.cs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,32 @@ public class DateTypeTest
1313
public void WhenNoParameterThenDefaultValueIsBaseDateValue()
1414
{
1515
var dateType = new DateType();
16+
#pragma warning disable CS0618 // Type or member is obsolete
1617
Assert.That(dateType.DefaultValue, Is.EqualTo(DateType.BaseDateValue));
18+
#pragma warning restore CS0618 // Type or member is obsolete
1719
}
1820

1921
[Test]
2022
public void WhenSetParameterThenDefaultValueIsParameterValue()
2123
{
2224
var dateType = new DateType();
23-
dateType.SetParameterValues(new Dictionary<string, string>{{DateType.BaseValueParameterName, "0001/01/01"}});
25+
#pragma warning disable CS0618 // Type or member is obsolete
26+
dateType.SetParameterValues(new Dictionary<string, string> { { DateType.BaseValueParameterName, "0001/01/01" } });
27+
#pragma warning restore CS0618 // Type or member is obsolete
2428
Assert.That(dateType.DefaultValue, Is.EqualTo(DateTime.MinValue));
2529
}
2630

2731
[Test]
2832
public void WhenSetParameterNullThenNotThrow()
2933
{
3034
var dateType = new DateType();
35+
#pragma warning disable CS0618 // Type or member is obsolete
3136
Assert.That(() => dateType.SetParameterValues(null), Throws.Nothing);
37+
#pragma warning restore CS0618 // Type or member is obsolete
3238
}
3339
}
3440

41+
[TestFixture]
3542
public class DateTypeFixture : TypeFixtureBase
3643
{
3744
protected override string TypeName
@@ -55,36 +62,30 @@ public void ReadWriteNormal()
5562
{
5663
var expected = DateTime.Today.Date;
5764

58-
var basic = new DateClass { DateValue = expected.AddHours(1) };
59-
object savedId;
60-
using (ISession s = OpenSession())
61-
{
62-
savedId = s.Save(basic);
63-
s.Flush();
64-
}
65-
using (ISession s = OpenSession())
66-
{
67-
basic = s.Get<DateClass>(savedId);
68-
Assert.That(basic.DateValue, Is.EqualTo(expected));
69-
s.Delete(basic);
70-
s.Flush();
71-
}
65+
ReadWrite(expected);
7266
}
7367

7468
[Test]
75-
public void ReadWriteBaseValue()
69+
public void ReadWriteMin()
7670
{
77-
var basic = new DateClass { DateValue = new DateTime(1899,1,1) };
71+
var expected = DateTime.MinValue;
72+
73+
ReadWrite(expected);
74+
}
75+
76+
private void ReadWrite(DateTime expected)
77+
{
78+
var basic = new DateClass { DateValue = expected.AddHours(1) };
7879
object savedId;
79-
using (ISession s = OpenSession())
80+
using (var s = OpenSession())
8081
{
81-
savedId = s.Save(basic);
82+
savedId = s.Save(basic);
8283
s.Flush();
8384
}
84-
using (ISession s = OpenSession())
85+
using (var s = OpenSession())
8586
{
8687
basic = s.Get<DateClass>(savedId);
87-
Assert.That(basic.DateValue.HasValue, Is.False);
88+
Assert.That(basic.DateValue, Is.EqualTo(expected));
8889
s.Delete(basic);
8990
s.Flush();
9091
}

src/NHibernate/Driver/Sql2008ClientDriver.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,17 @@ public class Sql2008ClientDriver : SqlClientDriver
1111
protected override void InitializeParameter(DbParameter dbParam, string name, SqlTypes.SqlType sqlType)
1212
{
1313
base.InitializeParameter(dbParam, name, sqlType);
14-
if (sqlType.DbType == DbType.Time)
14+
switch (sqlType.DbType)
1515
{
16-
((SqlParameter) dbParam).SqlDbType = SqlDbType.Time;
16+
case DbType.Time:
17+
((SqlParameter) dbParam).SqlDbType = SqlDbType.Time;
18+
break;
19+
case DbType.Date:
20+
((SqlParameter) dbParam).SqlDbType = SqlDbType.Date;
21+
break;
1722
}
1823
}
1924

2025
public override bool RequiresTimeSpanForTime => true;
2126
}
22-
}
27+
}

src/NHibernate/Type/DateType.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,16 @@ namespace NHibernate.Type
1515
[Serializable]
1616
public class DateType : PrimitiveType, IIdentifierType, ILiteralType, IParameterizedType
1717
{
18+
private static readonly IInternalLogger _log = LoggerProvider.LoggerFor(typeof(DateType));
19+
// Since v5.0
20+
[Obsolete("Explicitly affect your values to your entities properties instead.")]
1821
public const string BaseValueParameterName = "BaseValue";
19-
public static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01);
20-
private DateTime customBaseDate = BaseDateValue;
22+
// Since v5.0
23+
[Obsolete("Use DateTime.MinValue.")]
24+
public static readonly DateTime BaseDateValue = _baseDateValue;
25+
private DateTime customBaseDate = _baseDateValue;
26+
27+
private static readonly DateTime _baseDateValue = DateTime.MinValue;
2128

2229
/// <summary></summary>
2330
public DateType() : base(SqlTypeFactory.Date)
@@ -57,8 +64,7 @@ public override void Set(DbCommand st, object value, int index, ISessionImplemen
5764
{
5865
var parm = st.Parameters[index];
5966
var dateTime = (DateTime)value;
60-
if (dateTime < customBaseDate) parm.Value = DBNull.Value;
61-
else parm.Value = dateTime.Date;
67+
parm.Value = dateTime.Date;
6268
}
6369

6470
public override bool IsEqual(object x, object y)
@@ -125,6 +131,8 @@ public override string ObjectToSQLString(object value, Dialect.Dialect dialect)
125131
return "\'" + ((DateTime)value).ToShortDateString() + "\'";
126132
}
127133

134+
// Since v5
135+
[Obsolete("Its only parameter, BaseValue, is obsolete.")]
128136
public void SetParameterValues(IDictionary<string, string> parameters)
129137
{
130138
if(parameters == null)
@@ -134,8 +142,11 @@ public void SetParameterValues(IDictionary<string, string> parameters)
134142
string value;
135143
if (parameters.TryGetValue(BaseValueParameterName, out value))
136144
{
145+
_log.WarnFormat(
146+
"Parameter {0} is obsolete and will be remove in a future version. Explicitly affect your values to your entities properties instead.",
147+
BaseValueParameterName);
137148
customBaseDate = DateTime.Parse(value);
138149
}
139150
}
140151
}
141-
}
152+
}

0 commit comments

Comments
 (0)