-
Notifications
You must be signed in to change notification settings - Fork 877
Expand file tree
/
Copy pathDateIntervalConverter.cs
More file actions
41 lines (31 loc) · 1.79 KB
/
DateIntervalConverter.cs
File metadata and controls
41 lines (31 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System.Threading;
using System.Threading.Tasks;
using NodaTime;
using Npgsql.Internal;
using NpgsqlTypes;
namespace Npgsql.NodaTime.Internal;
public class DateIntervalConverter(PgConverter<NpgsqlRange<LocalDate>> rangeConverter, bool dateTimeInfinityConversions)
: PgStreamingConverter<DateInterval>
{
public override DateInterval Read(PgReader reader)
=> Read(async: false, reader, CancellationToken.None).GetAwaiter().GetResult();
public override ValueTask<DateInterval> ReadAsync(PgReader reader, CancellationToken cancellationToken = default)
=> Read(async: true, reader, cancellationToken);
async ValueTask<DateInterval> Read(bool async, PgReader reader, CancellationToken cancellationToken)
{
var range = async
? await rangeConverter.ReadAsync(reader, cancellationToken).ConfigureAwait(false)
// ReSharper disable once MethodHasAsyncOverloadWithCancellation
: rangeConverter.Read(reader);
var upperBound = range.UpperBound;
if (upperBound != LocalDate.MaxIsoValue || !dateTimeInfinityConversions)
upperBound -= Period.FromDays(1);
return new(range.LowerBound, upperBound);
}
public override Size GetSize(SizeContext context, DateInterval value, ref object? writeState)
=> rangeConverter.GetSize(context, new NpgsqlRange<LocalDate>(value.Start, value.End), ref writeState);
public override void Write(PgWriter writer, DateInterval value)
=> rangeConverter.Write(writer, new NpgsqlRange<LocalDate>(value.Start, value.End));
public override ValueTask WriteAsync(PgWriter writer, DateInterval value, CancellationToken cancellationToken = default)
=> rangeConverter.WriteAsync(writer, new NpgsqlRange<LocalDate>(value.Start, value.End), cancellationToken);
}