/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
v6.0.13
src/Npgsql.NodaTime/Internal/DateRangeHandler.cs
70 строк
3 KB
Shay Rojansky
Fix reading of NodaTime DateInterval with infinite upper bound (#4718)
14 окт 2022, 16:54
14 окт 2022, 16:54
dcd34dc
Код
Авторство
О чём код?
using System; using System.Threading; using System.Threading.Tasks; using NodaTime; using Npgsql.BackendMessages; using Npgsql.Internal; using Npgsql.Internal.TypeHandlers; using Npgsql.Internal.TypeHandling; using Npgsql.NodaTime.Properties; using Npgsql.PostgresTypes; using NpgsqlTypes; using static Npgsql.NodaTime.Internal.NodaTimeUtils; namespace Npgsql.NodaTime.Internal; public partial class DateRangeHandler : RangeHandler<LocalDate>, INpgsqlTypeHandler<DateInterval> #if NET6_0_OR_GREATER , INpgsqlTypeHandler<NpgsqlRange<DateOnly>> #endif { public DateRangeHandler(PostgresType rangePostgresType, NpgsqlTypeHandler subtypeHandler) : base(rangePostgresType, subtypeHandler) { } public override Type GetFieldType(FieldDescription? fieldDescription = null) => typeof(DateInterval); public override Type GetProviderSpecificFieldType(FieldDescription? fieldDescription = null) => typeof(DateInterval); public override async ValueTask<object> ReadAsObject(NpgsqlReadBuffer buf, int len, bool async, FieldDescription? fieldDescription = null) => (await Read<DateInterval>(buf, len, async, fieldDescription))!; async ValueTask<DateInterval> INpgsqlTypeHandler<DateInterval>.Read(NpgsqlReadBuffer buf, int len, bool async, FieldDescription? fieldDescription) { var range = await Read(buf, len, async, fieldDescription); var upperBound = range.UpperBound; if (DisableDateTimeInfinityConversions || upperBound != LocalDate.MaxIsoValue) upperBound -= Period.FromDays(1); return new(range.LowerBound, upperBound); } public int ValidateAndGetLength(DateInterval value, ref NpgsqlLengthCache? lengthCache, NpgsqlParameter? parameter) => ValidateAndGetLengthRange(new NpgsqlRange<LocalDate>(value.Start, value.End), ref lengthCache, parameter); public Task Write( DateInterval value, NpgsqlWriteBuffer buf, NpgsqlLengthCache? lengthCache, NpgsqlParameter? parameter, bool async, CancellationToken cancellationToken = default) => WriteRange(new NpgsqlRange<LocalDate>(value.Start, value.End), buf, lengthCache, parameter, async, cancellationToken); #if NET6_0_OR_GREATER ValueTask<NpgsqlRange<DateOnly>> INpgsqlTypeHandler<NpgsqlRange<DateOnly>>.Read( NpgsqlReadBuffer buf, int len, bool async, FieldDescription? fieldDescription) => ReadRange<DateOnly>(buf, len, async, fieldDescription); public int ValidateAndGetLength(NpgsqlRange<DateOnly> value, ref NpgsqlLengthCache? lengthCache, NpgsqlParameter? parameter) => ValidateAndGetLengthRange(value, ref lengthCache, parameter); public Task Write( NpgsqlRange<DateOnly> value, NpgsqlWriteBuffer buf, NpgsqlLengthCache? lengthCache, NpgsqlParameter? parameter, bool async, CancellationToken cancellationToken = default) => WriteRange(value, buf, lengthCache, parameter, async, cancellationToken); #endif }