Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 84d9fab

Browse files
committed
Add support for ,NET 6 DateOnly and TimeOnly data types
1 parent 577a4cc commit 84d9fab

File tree

8 files changed

+179
-3
lines changed

8 files changed

+179
-3
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using ServiceStack.OrmLite.Converters;
3+
4+
#if NET6_0
5+
namespace ServiceStack.OrmLite.PostgreSQL.Converters;
6+
7+
public class PostgreSqlDateOnlyConverter : PostgreSqlDateTimeConverter
8+
{
9+
public override string ToQuotedString(Type fieldType, object value)
10+
{
11+
var dateOnly = (DateOnly)value;
12+
return DateTimeFmt(dateOnly.ToDateTime(default, DateTimeKind.Utc), "yyyy-MM-dd HH:mm:ss.fff");
13+
}
14+
15+
public override object ToDbValue(Type fieldType, object value)
16+
{
17+
var dateOnly = (DateOnly)value;
18+
var dateTime = dateOnly.ToDateTime(default, DateTimeKind.Utc);
19+
if (dateTime.Kind != DateTimeKind.Utc)
20+
dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
21+
return dateTime;
22+
}
23+
24+
public override object FromDbValue(object value)
25+
{
26+
var dateTime = (DateTime)base.FromDbValue(value);
27+
if (dateTime.Kind == DateTimeKind.Unspecified)
28+
dateTime = dateTime.ToLocalTime();
29+
var dateOnly = DateOnly.FromDateTime(dateTime);
30+
return dateOnly;
31+
}
32+
}
33+
34+
#endif

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public PostgreSqlDialectProvider()
7272
RegisterConverter<DateTimeOffset[]>(new PostgreSqlDateTimeOffsetTimeStampTzArrayConverter());
7373

7474
RegisterConverter<XmlValue>(new PostgreSqlXmlConverter());
75+
76+
#if NET6_0
77+
RegisterConverter<DateOnly>(new PostgreSqlDateOnlyConverter());
78+
#endif
7579

7680
this.Variables = new Dictionary<string, string>
7781
{
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
3+
#if NET6_0
4+
namespace ServiceStack.OrmLite.Converters;
5+
6+
public class DateOnlyConverter : DateTimeConverter
7+
{
8+
public override string ToQuotedString(Type fieldType, object value)
9+
{
10+
var dateOnly = (DateOnly)value;
11+
return DateTimeFmt(dateOnly.ToDateTime(default, DateTimeKind.Local), "yyyy-MM-dd HH:mm:ss.fff");
12+
}
13+
14+
public override object ToDbValue(Type fieldType, object value)
15+
{
16+
var dateOnly = (DateOnly)value;
17+
return base.ToDbValue(typeof(DateTime), dateOnly.ToDateTime(default, DateTimeKind.Local));
18+
}
19+
20+
public override object FromDbValue(object value)
21+
{
22+
var dateTime = (DateTime)base.FromDbValue(value);
23+
if (dateTime.Kind != DateTimeKind.Local)
24+
dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Local);
25+
var dateOnly = DateOnly.FromDateTime(dateTime);
26+
return dateOnly;
27+
}
28+
}
29+
30+
#endif
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Globalization;
3+
4+
#if NET6_0
5+
namespace ServiceStack.OrmLite.Converters;
6+
7+
public class TimeOnlyConverter : TimeSpanAsIntConverter
8+
{
9+
public override string ToQuotedString(Type fieldType, object value)
10+
{
11+
return ((TimeOnly)value).Ticks.ToString(CultureInfo.InvariantCulture);
12+
}
13+
14+
public override object ToDbValue(Type fieldType, object value)
15+
{
16+
var timespan = (TimeOnly)value;
17+
return timespan.Ticks;
18+
}
19+
20+
public override object FromDbValue(Type fieldType, object value)
21+
{
22+
var ticks = (long)this.ConvertNumber(typeof(long), value);
23+
var timeSpan = TimeSpan.FromTicks(ticks);
24+
return TimeOnly.FromTimeSpan(timeSpan);
25+
}
26+
}
27+
28+
#endif

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ protected void InitColumnTypeMap()
122122
RegisterConverter<TimeSpan>(new TimeSpanAsIntConverter());
123123
RegisterConverter<DateTime>(new DateTimeConverter());
124124
RegisterConverter<DateTimeOffset>(new DateTimeOffsetConverter());
125+
126+
#if NET6_0
127+
RegisterConverter<DateOnly>(new DateOnlyConverter());
128+
RegisterConverter<TimeOnly>(new TimeOnlyConverter());
129+
#endif
125130
}
126131

127132
public string GetColumnTypeDefinition(Type columnType, int? fieldLength, int? scale)

tests/ServiceStack.OrmLite.Tests/Expression/SqlExpressionTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
using System.Linq;
55
using NUnit.Framework;
66
using ServiceStack.DataAnnotations;
7-
#if !NETCORE_SUPPORT
8-
#endif
97
using ServiceStack.OrmLite.Tests.UseCase;
108
using ServiceStack.Text;
119

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using System;
2+
using System.Data;
3+
using System.Linq;
4+
using NUnit.Framework;
5+
6+
#if NET6_0
7+
namespace ServiceStack.OrmLite.Tests;
8+
9+
public class Net6TypeTests : OrmLiteTestBase
10+
{
11+
private class DateOnlyObject
12+
{
13+
public DateOnly Test { get; set; }
14+
public DateOnly? TestNullable { get; set; }
15+
}
16+
17+
private static DateOnlyObject InsertAndSelectDateOnly(IDbConnection db, DateOnly dateTime)
18+
{
19+
db.DeleteAll<DateOnlyObject>();
20+
db.Insert(new DateOnlyObject { Test = dateTime, TestNullable = dateTime });
21+
var x = db.Select<DateOnlyObject>().First();
22+
return x;
23+
}
24+
25+
[Test]
26+
public void Can_insert_and_query_DateOnly()
27+
{
28+
// OrmLiteUtils.PrintSql();
29+
using var db = OpenDbConnection();
30+
db.DropAndCreateTable<DateOnlyObject>();
31+
32+
DateOnly dateTime;
33+
DateOnlyObject x;
34+
35+
dateTime = new DateOnly(2013, 1, 13);
36+
x = InsertAndSelectDateOnly(db, dateTime);
37+
Assert.That(x.Test, Is.EqualTo(dateTime));
38+
Assert.That(x.TestNullable!.Value, Is.EqualTo(x.Test));
39+
x = db.Select<DateOnlyObject>(d => d.Test == dateTime).FirstOrDefault();
40+
Assert.That(x, Is.Not.Null);
41+
}
42+
43+
private class TimeOnlyObject
44+
{
45+
public TimeOnly Test { get; set; }
46+
public TimeOnly? TestNullable { get; set; }
47+
}
48+
49+
private static TimeOnlyObject InsertAndSelectTimeOnly(IDbConnection db, TimeOnly timeOnly)
50+
{
51+
db.DeleteAll<TimeOnlyObject>();
52+
db.Insert(new TimeOnlyObject { Test = timeOnly, TestNullable = timeOnly });
53+
var x = db.Select<TimeOnlyObject>().First();
54+
return x;
55+
}
56+
57+
[Test]
58+
public void Can_insert_and_query_TimeOnly()
59+
{
60+
OrmLiteUtils.PrintSql();
61+
using var db = OpenDbConnection();
62+
db.DropAndCreateTable<TimeOnlyObject>();
63+
64+
TimeOnly timeOnly;
65+
TimeOnlyObject x;
66+
67+
timeOnly = new TimeOnly(13, 14, 15);
68+
x = InsertAndSelectTimeOnly(db, timeOnly);
69+
Assert.That(x.Test, Is.EqualTo(timeOnly));
70+
Assert.That(x.TestNullable!.Value, Is.EqualTo(x.Test));
71+
x = db.Select<TimeOnlyObject>(d => d.Test == timeOnly).FirstOrDefault();
72+
Assert.That(x, Is.Not.Null);
73+
}
74+
75+
}
76+
77+
#endif

tests/ServiceStack.OrmLite.Tests/ServiceStack.OrmLite.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
</ItemGroup>
3535

3636
<PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
37-
<DefineConstants>$(DefineConstants);NETCORE_SUPPORT;NETCORE</DefineConstants>
37+
<DefineConstants>$(DefineConstants);NETCORE;NET6_0</DefineConstants>
3838
</PropertyGroup>
3939

4040
<ItemGroup>

0 commit comments

Comments
 (0)