@@ -210,16 +210,14 @@ namespace {
210
210
return res;
211
211
}
212
212
213
- TMaybe< TString> SerializeSubnet (const TIpAddressRange& range) {
213
+ TString SerializeSubnet (const TIpAddressRange& range) {
214
214
TString res;
215
215
if (range.Type () == TIpv6Address::Ipv4) {
216
216
auto subnet4 = TRawIp4Subnet::FromIpRange (range);
217
217
res = TString (reinterpret_cast <const char *>(&subnet4), sizeof subnet4);
218
218
} else if (range.Type () == TIpv6Address::Ipv6) {
219
219
auto subnet6 = TRawIp6Subnet::FromIpRange (range);
220
220
res = TString (reinterpret_cast <const char *>(&subnet6), sizeof subnet6);
221
- } else {
222
- return Nothing ();
223
221
}
224
222
return res;
225
223
}
@@ -237,7 +235,7 @@ namespace {
237
235
TString str (strRef.Data (), strRef.Data () + strRef.Size ());
238
236
TIpAddressRange range = TIpAddressRange::FromCompactString (str);
239
237
auto res = SerializeSubnet (range);
240
- return res ? valueBuilder->NewString (res. GetRef () ) : TUnboxedValue (TUnboxedValuePod ());
238
+ return res ? valueBuilder->NewString (res) : TUnboxedValue (TUnboxedValuePod ());
241
239
}
242
240
243
241
SIMPLE_UDF (TToString, char *(TAutoMapString)) {
@@ -253,6 +251,18 @@ namespace {
253
251
return valueBuilder->NewString (result);
254
252
}
255
253
254
+ SIMPLE_UDF (TSubnetMatch, bool (TAutoMapString, TAutoMapString)) {
255
+ Y_UNUSED (valueBuilder);
256
+ auto range1 = DeserializeSubnet (args[0 ].AsStringRef ());
257
+ if (args[1 ].AsStringRef ().Size () == sizeof (TRawIp4) || args[1 ].AsStringRef ().Size () == sizeof (TRawIp6)) {
258
+ auto addr2 = DeserializeAddress (args[1 ].AsStringRef ());
259
+ return TUnboxedValuePod (range1.Contains (addr2));
260
+ } else { // second argument is a whole subnet, not a single address
261
+ auto range2 = DeserializeSubnet (args[1 ].AsStringRef ());
262
+ return TUnboxedValuePod (range1.Contains (range2));
263
+ }
264
+ }
265
+
256
266
SIMPLE_STRICT_UDF (TIsIPv4, bool (TOptionalString)) {
257
267
Y_UNUSED (valueBuilder);
258
268
bool result = false ;
@@ -334,7 +344,6 @@ namespace {
334
344
TIsIPv6, \
335
345
TIsEmbeddedIPv4, \
336
346
TConvertToIPv6, \
337
- TGetSubnet
338
- }
339
-
340
-
347
+ TGetSubnet, \
348
+ TSubnetMatch
349
+ }
0 commit comments