/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Npgsql/Internal/Converters/Geometric/PolygonConverter.cs
55 строк
2 KB
Nino Floris
Introduce bind operation on PgConverter surface (#6566)
11 май 2026, 20:01
Не верифицирован
11 май 2026, 20:01
0f4cfd8
Код
Авторство
О чём код?
using System.Threading; using System.Threading.Tasks; using NpgsqlTypes; // ReSharper disable once CheckNamespace namespace Npgsql.Internal.Converters; sealed class PolygonConverter : PgStreamingConverter<NpgsqlPolygon> { public override NpgsqlPolygon Read(PgReader reader) => Read(async: false, reader, CancellationToken.None).GetAwaiter().GetResult(); public override ValueTask<NpgsqlPolygon> ReadAsync(PgReader reader, CancellationToken cancellationToken = default) => Read(async: true, reader, cancellationToken); async ValueTask<NpgsqlPolygon> Read(bool async, PgReader reader, CancellationToken cancellationToken) { if (reader.ShouldBuffer(sizeof(int))) await reader.Buffer(async, sizeof(int), cancellationToken).ConfigureAwait(false); var numPoints = reader.ReadInt32(); var result = new NpgsqlPolygon(numPoints); for (var i = 0; i < numPoints; i++) { if (reader.ShouldBuffer(sizeof(double) * 2)) await reader.Buffer(async, sizeof(double) * 2, cancellationToken).ConfigureAwait(false); result.Add(new NpgsqlPoint(reader.ReadDouble(), reader.ReadDouble())); } return result; } protected override Size BindValue(in BindContext context, NpgsqlPolygon value, ref object? writeState) => 4 + value.Count * sizeof(double) * 2; public override void Write(PgWriter writer, NpgsqlPolygon value) => Write(async: false, writer, value, CancellationToken.None).GetAwaiter().GetResult(); public override ValueTask WriteAsync(PgWriter writer, NpgsqlPolygon value, CancellationToken cancellationToken = default) => Write(async: true, writer, value, cancellationToken); async ValueTask Write(bool async, PgWriter writer, NpgsqlPolygon value, CancellationToken cancellationToken) { if (writer.ShouldFlush(sizeof(int))) await writer.Flush(async, cancellationToken).ConfigureAwait(false); writer.WriteInt32(value.Count); foreach (var p in value) { if (writer.ShouldFlush(sizeof(double) * 2)) await writer.Flush(async, cancellationToken).ConfigureAwait(false); writer.WriteDouble(p.X); writer.WriteDouble(p.Y); } } }