@@ -21,6 +21,12 @@ from cassandra import util
2121
2222
2323cdef class Deserializer:
24+ """ Cython-based deserializer class for a cqltype"""
25+
26+ def __init__ (self , cqltype ):
27+ self .cqltype = cqltype
28+ self .empty_binary_ok = False
29+
2430 cdef deserialize(self , Buffer * buf, int protocol_version):
2531 raise NotImplementedError
2632
@@ -144,25 +150,21 @@ cdef class DesVarcharType(DesUTF8Type):
144150
145151cdef class _DesParameterizedType(Deserializer):
146152
147- cdef object cqltype
148- cdef object adapter
149153 cdef object subtypes
150154 cdef Deserializer[::1 ] deserializers
151155 cdef Py_ssize_t subtypes_len
152156
153157 def __init__ (self , cqltype ):
154- assert cqltype.subtypes and len (cqltype.subtypes) == 1
155- self .cqltype = cqltype
156- self .adapter = cqltype.adapter
158+ super ().__init__(cqltype)
157159 self .subtypes = cqltype.subtypes
158160 self .deserializers = make_deserializers(cqltype.subtypes)
159161
160162
161163cdef class _DesSingleParamType(_DesParameterizedType):
162-
163164 cdef Deserializer deserializer
164165
165166 def __init__ (self , cqltype ):
167+ assert cqltype.subtypes and len (cqltype.subtypes) == 1 , cqltype.subtypes
166168 super ().__init__(cqltype)
167169 self .deserializer = self .deserializers[0 ]
168170
@@ -182,7 +184,7 @@ cdef class DesListType(_DesSingleParamType):
182184 result = _deserialize_list_or_set[uint16_t](
183185 v2_and_below, buf, protocol_version, self .deserializer)
184186
185- return self .adapter(result)
187+ return self .cqltype. adapter(result)
186188
187189
188190DesSetType = DesListType
@@ -214,7 +216,7 @@ cdef list _deserialize_list_or_set(itemlen_t dummy_version,
214216 sub_buf.ptr = buf.ptr + p
215217 sub_buf.size = itemlen
216218 p += itemlen
217- result.append(deserializer.deserialize( & sub_buf, protocol_version))
219+ result.append(from_binary(deserializer, & sub_buf, protocol_version))
218220
219221 return result
220222
@@ -284,8 +286,8 @@ cdef _deserialize_map(itemlen_t dummy_version,
284286 val_buf.ptr = buf.ptr + p
285287 val_buf.size = val_len
286288 p += val_len
287- key = key_deserializer.deserialize( & key_buf, protocol_version)
288- val = val_deserializer.deserialize( & val_buf, protocol_version)
289+ key = from_binary(key_deserializer, & key_buf, protocol_version)
290+ val = from_binary(val_deserializer, & val_buf, protocol_version)
289291 themap._insert_unchecked(key, to_bytes(& key_buf), val)
290292
291293 return themap
@@ -316,7 +318,7 @@ cdef class DesTupleType(_DesParameterizedType):
316318 item_buf.ptr = buf.ptr + p
317319 item_buf.size = itemlen
318320 deserializer = self .deserializers[i]
319- item = deserializer.deserialize( & item_buf, protocol_version)
321+ item = from_binary(deserializer, & item_buf, protocol_version)
320322 p += itemlen
321323
322324 tuple_set(res, i, item)
@@ -355,7 +357,7 @@ cdef class DesCompositeType(_DesParameterizedType):
355357 buf.ptr = buf.ptr + 2 + element_length + 1
356358 buf.size = buf.size - (2 + element_length + 1 )
357359 deserializer = self .deserializers[i]
358- item = deserializer.deserialize( & elem_buf, protocol_version)
360+ item = from_binary(deserializer, & elem_buf, protocol_version)
359361 tuple_set(res, i, item)
360362
361363 return res
@@ -366,12 +368,26 @@ DesDynamicCompositeType = DesCompositeType
366368
367369cdef class DesReversedType(_DesSingleParamType):
368370 cdef deserialize(self , Buffer * buf, int protocol_version):
369- return self .deserializer.deserialize( buf, protocol_version)
371+ return from_binary( self .deserializer, buf, protocol_version)
370372
371373
372374cdef class DesFrozenType(_DesSingleParamType):
373375 cdef deserialize(self , Buffer * buf, int protocol_version):
374- return self .deserializer.deserialize(buf, protocol_version)
376+ return from_binary(self .deserializer, buf, protocol_version)
377+
378+ # --------------------------------------------------------------------------
379+
380+ cdef _ret_empty(Deserializer deserializer, Py_ssize_t buf_size):
381+ """
382+ Decide whether to return None or EMPTY when a buffer size is
383+ zero or negative. This is used by from_binary in deserializers.pxd.
384+ """
385+ if buf_size < 0 :
386+ return None
387+ elif deserializer.cqltype.support_empty_values:
388+ return cqltypes.EMPTY
389+ else :
390+ return None
375391
376392# --------------------------------------------------------------------------
377393# Generic deserialization
@@ -381,11 +397,6 @@ cdef class GenericDeserializer(Deserializer):
381397 Wrap a generic datatype for deserialization
382398 """
383399
384- cdef object cqltype
385-
386- def __init__ (self , cqltype ):
387- self .cqltype = cqltype
388-
389400 cdef deserialize(self , Buffer * buf, int protocol_version):
390401 return self .cqltype.deserialize(to_bytes(buf), protocol_version)
391402
@@ -401,31 +412,33 @@ def make_deserializers(cqltypes):
401412cpdef Deserializer find_deserializer(cqltype):
402413 """ Find a deserializer for a cqltype"""
403414 name = ' Des' + cqltype.__name__
415+
404416 if name in globals ():
405- deserializer_cls = globals ()[name]
406- deserializer_cls()
417+ cls = globals ()[name]
407418 elif issubclass (cqltype, cqltypes.ListType):
408- return DesListType
419+ cls = DesListType
409420 elif issubclass (cqltype, cqltypes.SetType):
410- return DesSetType
421+ cls = DesSetType
411422 elif issubclass (cqltype, cqltypes.MapType):
412- return DesMapType
423+ cls = DesMapType
413424 elif issubclass (cqltype, cqltypes.UserType):
414425 # UserType is a subclass of TupleType, so should precede it
415- return DesUserType
426+ cls = DesUserType
416427 elif issubclass (cqltype, cqltypes.TupleType):
417- return DesTupleType
428+ cls = DesTupleType
418429 elif issubclass (cqltype, cqltypes.DynamicCompositeType):
419430 # DynamicCompositeType is a subclass of CompositeType, so should precede it
420- return DesDynamicCompositeType
431+ cls = DesDynamicCompositeType
421432 elif issubclass (cqltype, cqltypes.CompositeType):
422- return DesCompositeType
433+ cls = DesCompositeType
423434 elif issubclass (cqltype, cqltypes.ReversedType):
424- return DesReversedType
435+ cls = DesReversedType
425436 elif issubclass (cqltype, cqltypes.FrozenType):
426- return DesFrozenType
437+ cls = DesFrozenType
438+ else :
439+ cls = GenericDeserializer
427440
428- return GenericDeserializer (cqltype)
441+ return cls (cqltype)
429442
430443
431444def obj_array (list objs ):
0 commit comments