/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Npgsql/Internal/Converters/Networking/NpgsqlInetConverter.cs
75 строк
3 KB
Nino Floris
Remove PgBufferedConverter virtual dispatch hop (#6574)
15 май 2026, 18:24
Не верифицирован
15 май 2026, 18:24
78d37a1
Код
Авторство
О чём код?
using System; using System.Diagnostics; using System.Net; using System.Net.Sockets; using NpgsqlTypes; // ReSharper disable once CheckNamespace namespace Npgsql.Internal.Converters; sealed class NpgsqlInetConverter : PgBufferedConverter<NpgsqlInet> { const byte IPv4 = 2; const byte IPv6 = 3; public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements) => CanConvertImpl(format, out bufferRequirements); internal static bool CanConvertImpl(DataFormat format, out BufferRequirements bufferRequirements) { bufferRequirements = BufferRequirements.Create(Size.CreateUpperBound(20)); return format == DataFormat.Binary; } protected override Size BindValue(in BindContext context, NpgsqlInet value, ref object? writeState) => BindValueImpl(context, value.Address, ref writeState); internal static Size BindValueImpl(in BindContext context, IPAddress ipAddress, ref object? writeState) => ipAddress.AddressFamily switch { AddressFamily.InterNetwork => 8, AddressFamily.InterNetworkV6 => 20, _ => throw new InvalidCastException( $"Can't handle IPAddress with AddressFamily {ipAddress.AddressFamily}, only InterNetwork or InterNetworkV6!") }; public override NpgsqlInet Read(PgReader reader) { var (ip, netmask) = ReadImpl(reader, shouldBeCidr: false); return new(ip, netmask); } internal static (IPAddress Address, byte Netmask) ReadImpl(PgReader reader, bool shouldBeCidr) { _ = reader.ReadByte(); // addressFamily var mask = reader.ReadByte(); // mask var isCidr = reader.ReadByte() == 1; Debug.Assert(isCidr == shouldBeCidr); var numBytes = reader.ReadByte(); Span<byte> bytes = stackalloc byte[numBytes]; reader.Read(bytes); return (new IPAddress(bytes), mask); } public override void Write(PgWriter writer, NpgsqlInet value) => WriteImpl(writer, (value.Address, value.Netmask), isCidr: false); internal static void WriteImpl(PgWriter writer, (IPAddress Address, byte Netmask) value, bool isCidr) { writer.WriteByte(value.Address.AddressFamily switch { AddressFamily.InterNetwork => IPv4, AddressFamily.InterNetworkV6 => IPv6, _ => throw new InvalidCastException( $"Can't handle IPAddress with AddressFamily {value.Address.AddressFamily}, only InterNetwork or InterNetworkV6!") }); writer.WriteByte(value.Netmask); writer.WriteByte((byte)(isCidr ? 1 : 0)); // Ignored on server side var bytes = value.Address.GetAddressBytes(); writer.WriteByte((byte)bytes.Length); writer.WriteBytes(bytes); } }