-
Notifications
You must be signed in to change notification settings - Fork 877
Expand file tree
/
Copy pathTimestampConverters.cs
More file actions
86 lines (71 loc) · 3.55 KB
/
TimestampConverters.cs
File metadata and controls
86 lines (71 loc) · 3.55 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using NodaTime;
using Npgsql.Internal;
using static Npgsql.NodaTime.Internal.NodaTimeUtils;
namespace Npgsql.NodaTime.Internal;
sealed class InstantConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<Instant>
{
public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(long));
return format is DataFormat.Binary;
}
protected override Instant ReadCore(PgReader reader)
=> DecodeInstant(reader.ReadInt64(), dateTimeInfinityConversions);
protected override void WriteCore(PgWriter writer, Instant value)
=> writer.WriteInt64(EncodeInstant(value, dateTimeInfinityConversions));
}
sealed class ZonedDateTimeConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<ZonedDateTime>
{
public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(long));
return format is DataFormat.Binary;
}
protected override ZonedDateTime ReadCore(PgReader reader)
=> DecodeInstant(reader.ReadInt64(), dateTimeInfinityConversions).InUtc();
protected override void WriteCore(PgWriter writer, ZonedDateTime value)
{
if (value.Zone != DateTimeZone.Utc && !LegacyTimestampBehavior)
{
throw new ArgumentException(
$"Cannot write ZonedDateTime with Zone={value.Zone} to PostgreSQL type 'timestamp with time zone', " +
"only UTC is supported. " +
"See the Npgsql.EnableLegacyTimestampBehavior AppContext switch to enable legacy behavior.");
}
writer.WriteInt64(EncodeInstant(value.ToInstant(), dateTimeInfinityConversions));
}
}
sealed class OffsetDateTimeConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<OffsetDateTime>
{
public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(long));
return format is DataFormat.Binary;
}
protected override OffsetDateTime ReadCore(PgReader reader)
=> DecodeInstant(reader.ReadInt64(), dateTimeInfinityConversions).WithOffset(Offset.Zero);
protected override void WriteCore(PgWriter writer, OffsetDateTime value)
{
if (value.Offset != Offset.Zero && !LegacyTimestampBehavior)
{
throw new ArgumentException(
$"Cannot write OffsetDateTime with Offset={value.Offset} to PostgreSQL type 'timestamp with time zone', " +
"only offset 0 (UTC) is supported. " +
"See the Npgsql.EnableLegacyTimestampBehavior AppContext switch to enable legacy behavior.");
}
writer.WriteInt64(EncodeInstant(value.ToInstant(), dateTimeInfinityConversions));
}
}
sealed class LocalDateTimeConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<LocalDateTime>
{
public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(long));
return format is DataFormat.Binary;
}
protected override LocalDateTime ReadCore(PgReader reader)
=> DecodeInstant(reader.ReadInt64(), dateTimeInfinityConversions).InUtc().LocalDateTime;
protected override void WriteCore(PgWriter writer, LocalDateTime value)
=> writer.WriteInt64(EncodeInstant(value.InUtc().ToInstant(), dateTimeInfinityConversions));
}