/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
v4.0.17
src/Npgsql.NodaTime/DateHandler.cs
90 строк
3 KB
Shay Rojansky
2017 -> 2018
13 фев 2018, 08:19
13 фев 2018, 08:19
f3de4c2
Код
Авторство
О чём код?
#region License // The PostgreSQL License // // Copyright (C) 2018 The Npgsql Development Team // // Permission to use, copy, modify, and distribute this software and its // documentation for any purpose, without fee, and without a written // agreement is hereby granted, provided that the above copyright notice // and this paragraph and the following two paragraphs appear in all copies. // // IN NO EVENT SHALL THE NPGSQL DEVELOPMENT TEAM BE LIABLE TO ANY PARTY // FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, // INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS // DOCUMENTATION, EVEN IF THE NPGSQL DEVELOPMENT TEAM HAS BEEN ADVISED OF // THE POSSIBILITY OF SUCH DAMAGE. // // THE NPGSQL DEVELOPMENT TEAM SPECIFICALLY DISCLAIMS ANY WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY // AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS // ON AN "AS IS" BASIS, AND THE NPGSQL DEVELOPMENT TEAM HAS NO OBLIGATIONS // TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. #endregion using NodaTime; using Npgsql.BackendMessages; using Npgsql.TypeHandling; #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member namespace Npgsql.NodaTime { public class DateHandlerFactory : NpgsqlTypeHandlerFactory<LocalDate> { protected override NpgsqlTypeHandler<LocalDate> Create(NpgsqlConnection conn) { var csb = new NpgsqlConnectionStringBuilder(conn.ConnectionString); return new DateHandler(csb.ConvertInfinityDateTime); } } sealed class DateHandler : NpgsqlSimpleTypeHandler<LocalDate> { /// <summary> /// Whether to convert positive and negative infinity values to Instant.{Max,Min}Value when /// an Instant is requested /// </summary> readonly bool _convertInfinityDateTime; internal DateHandler(bool convertInfinityDateTime) { _convertInfinityDateTime = convertInfinityDateTime; } public override LocalDate Read(NpgsqlReadBuffer buf, int len, FieldDescription fieldDescription = null) { var value = buf.ReadInt32(); if (_convertInfinityDateTime) { if (value == int.MaxValue) return LocalDate.MaxIsoValue; if (value == int.MinValue) return LocalDate.MinIsoValue; } return new LocalDate().PlusDays(value + 730119); } public override int ValidateAndGetLength(LocalDate value, NpgsqlParameter parameter) => 4; public override void Write(LocalDate value, NpgsqlWriteBuffer buf, NpgsqlParameter parameter) { if (_convertInfinityDateTime) { if (value == LocalDate.MaxIsoValue) { buf.WriteInt32(int.MaxValue); return; } if (value == LocalDate.MinIsoValue) { buf.WriteInt32(int.MinValue); return; } } var totalDaysSinceEra = Period.Between(default(LocalDate), value, PeriodUnits.Days).Days; buf.WriteInt32(totalDaysSinceEra - 730119); } } }