Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Add IPNetwork to cidr mapping
  • Loading branch information
vonzshik committed Oct 17, 2024
commit bcad46b33a076c631a8e0e72f7d9be2f5e932255
26 changes: 26 additions & 0 deletions src/Npgsql/Internal/Converters/Networking/IPNetworkConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#if NET8_0_OR_GREATER

using System.Net;

// ReSharper disable once CheckNamespace
namespace Npgsql.Internal.Converters;

sealed class IPNetworkConverter : PgBufferedConverter<IPNetwork>
{
public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
=> CanConvertBufferedDefault(format, out bufferRequirements);

public override Size GetSize(SizeContext context, IPNetwork value, ref object? writeState)
=> NpgsqlInetConverter.GetSizeImpl(context, value.BaseAddress, ref writeState);

protected override IPNetwork ReadCore(PgReader reader)
{
var (ip, netmask) = NpgsqlInetConverter.ReadImpl(reader, shouldBeCidr: true);
return new(ip, netmask);
}

protected override void WriteCore(PgWriter writer, IPNetwork value)
=> NpgsqlInetConverter.WriteImpl(writer, (value.BaseAddress, (byte)value.PrefixLength), isCidr: true);
}

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
mappings.AddStructType<NpgsqlCidr>(DataTypeNames.Cidr,
static (options, mapping, _) => mapping.CreateInfo(options, new NpgsqlCidrConverter()), isDefault: true);

#if NET8_0_OR_GREATER
mappings.AddStructType<IPNetwork>(DataTypeNames.Cidr,
static (options, mapping, _) => mapping.CreateInfo(options, new IPNetworkConverter()));
#endif

return mappings;
}
}
Expand All @@ -76,6 +81,10 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
// cidr
mappings.AddStructArrayType<NpgsqlCidr>(DataTypeNames.Cidr);

#if NET8_0_OR_GREATER
mappings.AddStructArrayType<IPNetwork>(DataTypeNames.Cidr);
#endif

return mappings;
}
}
Expand Down
10 changes: 10 additions & 0 deletions test/Npgsql.Tests/Types/NetworkTypeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ public Task Cidr()
NpgsqlDbType.Cidr,
isDefaultForWriting: false);

[Test]
public Task IPNetwork_as_cidr()
=> AssertType(
new IPNetwork(IPAddress.Parse("192.168.1.0"), 24),
"192.168.1.0/24",
"cidr",
NpgsqlDbType.Cidr,
isDefaultForWriting: false,
isDefaultForReading: false);

[Test]
public Task Inet_v4_as_NpgsqlInet()
=> AssertType(
Expand Down