@@ -71,6 +71,13 @@ cdef class Codec:
71
71
' range types is not supported' .format(schema, name))
72
72
self .encoder = < codec_encode_func> & self .encode_range
73
73
self .decoder = < codec_decode_func> & self .decode_range
74
+ elif type == CODEC_MULTIRANGE:
75
+ if format != PG_FORMAT_BINARY:
76
+ raise exceptions.UnsupportedClientFeatureError(
77
+ ' cannot decode type "{}"."{}": text encoding of '
78
+ ' range types is not supported' .format(schema, name))
79
+ self .encoder = < codec_encode_func> & self .encode_multirange
80
+ self .decoder = < codec_decode_func> & self .decode_multirange
74
81
elif type == CODEC_COMPOSITE:
75
82
if format != PG_FORMAT_BINARY:
76
83
raise exceptions.UnsupportedClientFeatureError(
@@ -122,6 +129,12 @@ cdef class Codec:
122
129
codec_encode_func_ex,
123
130
< void * > (< cpython.PyObject> self .element_codec))
124
131
132
+ cdef encode_multirange(self , ConnectionSettings settings, WriteBuffer buf,
133
+ object obj):
134
+ multirange_encode(settings, buf, obj, self .element_codec.oid,
135
+ codec_encode_func_ex,
136
+ < void * > (< cpython.PyObject> self .element_codec))
137
+
125
138
cdef encode_composite(self , ConnectionSettings settings, WriteBuffer buf,
126
139
object obj):
127
140
cdef:
@@ -209,6 +222,10 @@ cdef class Codec:
209
222
return range_decode(settings, buf, codec_decode_func_ex,
210
223
< void * > (< cpython.PyObject> self .element_codec))
211
224
225
+ cdef decode_multirange(self , ConnectionSettings settings, FRBuffer * buf):
226
+ return multirange_decode(settings, buf, codec_decode_func_ex,
227
+ < void * > (< cpython.PyObject> self .element_codec))
228
+
212
229
cdef decode_composite(self , ConnectionSettings settings,
213
230
FRBuffer * buf):
214
231
cdef:
@@ -294,7 +311,11 @@ cdef class Codec:
294
311
if self .c_encoder is not NULL or self .py_encoder is not None :
295
312
return True
296
313
297
- elif self .type == CODEC_ARRAY or self .type == CODEC_RANGE:
314
+ elif (
315
+ self .type == CODEC_ARRAY
316
+ or self .type == CODEC_RANGE
317
+ or self .type == CODEC_MULTIRANGE
318
+ ):
298
319
return self .element_codec.has_encoder()
299
320
300
321
elif self .type == CODEC_COMPOSITE:
@@ -312,7 +333,11 @@ cdef class Codec:
312
333
if self .c_decoder is not NULL or self .py_decoder is not None :
313
334
return True
314
335
315
- elif self .type == CODEC_ARRAY or self .type == CODEC_RANGE:
336
+ elif (
337
+ self .type == CODEC_ARRAY
338
+ or self .type == CODEC_RANGE
339
+ or self .type == CODEC_MULTIRANGE
340
+ ):
316
341
return self .element_codec.has_decoder()
317
342
318
343
elif self .type == CODEC_COMPOSITE:
@@ -358,6 +383,18 @@ cdef class Codec:
358
383
None , None , None , 0 )
359
384
return codec
360
385
386
+ @staticmethod
387
+ cdef Codec new_multirange_codec(uint32_t oid,
388
+ str name,
389
+ str schema,
390
+ Codec element_codec):
391
+ cdef Codec codec
392
+ codec = Codec(oid)
393
+ codec.init(name, schema, ' multirange' , CODEC_MULTIRANGE,
394
+ element_codec.format, PG_XFORMAT_OBJECT, NULL , NULL ,
395
+ None , None , element_codec, None , None , None , 0 )
396
+ return codec
397
+
361
398
@staticmethod
362
399
cdef Codec new_composite_codec(uint32_t oid,
363
400
str name,
@@ -536,6 +573,21 @@ cdef class DataCodecConfig:
536
573
self ._derived_type_codecs[oid, elem_codec.format] = \
537
574
Codec.new_range_codec(oid, name, schema, elem_codec)
538
575
576
+ elif ti[' kind' ] == b' m' :
577
+ # Multirange type
578
+
579
+ if not range_subtype_oid:
580
+ raise exceptions.InternalClientError(
581
+ f' type record missing base type for multirange {oid}' )
582
+
583
+ elem_codec = self .get_codec(range_subtype_oid, PG_FORMAT_ANY)
584
+ if elem_codec is None :
585
+ elem_codec = self .declare_fallback_codec(
586
+ range_subtype_oid, ti[' range_subtype_name' ], schema)
587
+
588
+ self ._derived_type_codecs[oid, elem_codec.format] = \
589
+ Codec.new_multirange_codec(oid, name, schema, elem_codec)
590
+
539
591
elif ti[' kind' ] == b' e' :
540
592
# Enum types are essentially text
541
593
self ._set_builtin_type_codec(oid, name, schema, ' scalar' ,
0 commit comments