forked from npgsql/npgsql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTimeTzHandler.cs
More file actions
38 lines (32 loc) · 1.57 KB
/
TimeTzHandler.cs
File metadata and controls
38 lines (32 loc) · 1.57 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
using System;
using NodaTime;
using Npgsql.BackendMessages;
using Npgsql.PostgresTypes;
using Npgsql.TypeHandling;
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
namespace Npgsql.NodaTime
{
public class TimeTzHandlerFactory : NpgsqlTypeHandlerFactory<OffsetTime>
{
// Check for the legacy floating point timestamps feature
public override NpgsqlTypeHandler<OffsetTime> Create(PostgresType postgresType, NpgsqlConnection conn)
=> conn.HasIntegerDateTimes
? new TimeTzHandler(postgresType)
: throw new NotSupportedException($"The deprecated floating-point date/time format is not supported by {nameof(Npgsql)}.");
}
class TimeTzHandler : NpgsqlSimpleTypeHandler<OffsetTime>
{
public TimeTzHandler(PostgresType postgresType) : base(postgresType) {}
// Adjust from 1 microsecond to 100ns. Time zone (in seconds) is inverted.
public override OffsetTime Read(NpgsqlReadBuffer buf, int len, FieldDescription? fieldDescription = null)
=> new OffsetTime(
LocalTime.FromTicksSinceMidnight(buf.ReadInt64() * 10),
Offset.FromSeconds(-buf.ReadInt32()));
public override int ValidateAndGetLength(OffsetTime value, NpgsqlParameter? parameter) => 12;
public override void Write(OffsetTime value, NpgsqlWriteBuffer buf, NpgsqlParameter? parameter)
{
buf.WriteInt64(value.TickOfDay / 10);
buf.WriteInt32(-(int)(value.Offset.Ticks / NodaConstants.TicksPerSecond));
}
}
}