@@ -22,6 +22,7 @@ from cassandra.parsing cimport ParseDesc, ColumnParser, RowParser
2222from cassandra.tuple cimport tuple_new, tuple_set
2323
2424from cpython.bytes cimport PyBytes_AsStringAndSize
25+ cimport cython
2526
2627
2728cdef class ListParser(ColumnParser):
@@ -31,7 +32,10 @@ cdef class ListParser(ColumnParser):
3132 cdef Py_ssize_t i, rowcount
3233 rowcount = read_int(reader)
3334 cdef RowParser rowparser = TupleRowParser()
34- return [rowparser.unpack_row(reader, desc) for i in range (rowcount)]
35+ if desc.column_encryption_policy:
36+ return [rowparser.unpack_col_encrypted_row(reader, desc) for i in range (rowcount)]
37+ else :
38+ return [rowparser.unpack_plain_row(reader, desc) for i in range (rowcount)]
3539
3640
3741cdef class LazyParser(ColumnParser):
@@ -47,48 +51,78 @@ def parse_rows_lazy(BytesIOReader reader, ParseDesc desc):
4751 cdef Py_ssize_t i, rowcount
4852 rowcount = read_int(reader)
4953 cdef RowParser rowparser = TupleRowParser()
50- return (rowparser.unpack_row(reader, desc) for i in range (rowcount))
54+ if desc.column_encryption_policy:
55+ return (rowparser.unpack_col_encrypted_row(reader, desc) for i in range (rowcount))
56+ else :
57+ return (rowparser.unpack_plain_row(reader, desc) for i in range (rowcount))
5158
5259
5360cdef class TupleRowParser(RowParser):
5461 """
5562 Parse a single returned row into a tuple of objects:
5663
5764 (obj1, ..., objN)
65+ If CE (Column encryption) policy is enabled - use unpack_col_encrypted_row(),
66+ otherwise use unpack_plain_row()
5867 """
5968
60- cpdef unpack_row( self , BytesIOReader reader, ParseDesc desc):
61- assert desc.rowsize >= 0
62-
69+ @ cython.boundscheck ( False )
70+ @ cython.wraparound ( False )
71+ cpdef unpack_col_encrypted_row( self , BytesIOReader reader, ParseDesc desc):
6372 cdef Buffer buf
6473 cdef Buffer newbuf
6574 cdef Py_ssize_t i, rowsize = desc.rowsize
6675 cdef Deserializer deserializer
6776 cdef tuple res = tuple_new(desc.rowsize)
6877
6978 ce_policy = desc.column_encryption_policy
70- for i in range (rowsize) :
71- # Read the next few bytes
72- get_buf(reader, & buf)
73-
74- # Deserialize bytes to python object
75- deserializer = desc.deserializers[i]
76- coldesc = desc.coldescs [i]
77- uses_ce = ce_policy and ce_policy.contains_column( coldesc)
78- try :
79+ try :
80+ for i in range (rowsize):
81+ # Read the next few bytes
82+ get_buf(reader, & buf)
83+
84+ # Deserialize bytes to python object
85+ deserializer = desc.deserializers [i]
86+ coldesc = desc.coldescs[i]
87+ uses_ce = ce_policy.contains_column(coldesc)
7988 if uses_ce:
8089 col_type = ce_policy.column_type(coldesc)
8190 decrypted_bytes = ce_policy.decrypt(coldesc, to_bytes(& buf))
8291 PyBytes_AsStringAndSize(decrypted_bytes, & newbuf.ptr, & newbuf.size)
83- deserializer = find_deserializer(ce_policy.column_type(coldesc) )
92+ deserializer = find_deserializer(col_type )
8493 val = from_binary(deserializer, & newbuf, desc.protocol_version)
8594 else :
8695 val = from_binary(deserializer, & buf, desc.protocol_version)
87- except Exception as e:
88- raise DriverException(' Failed decoding result column "%s " of type %s : %s ' % (desc.colnames[i],
89- desc.coltypes[i].cql_parameterized_type(),
90- str (e)))
91- # Insert new object into tuple
92- tuple_set(res, i, val)
96+ # Insert new object into tuple
97+ tuple_set(res, i, val)
98+ except Exception as e:
99+ raise DriverException(' Failed decoding result column "%s " of type %s : %s ' % (desc.colnames[i],
100+ desc.coltypes[i].cql_parameterized_type(),
101+ str (e)))
102+
103+ return res
104+
105+ @ cython.boundscheck (False )
106+ @ cython.wraparound (False )
107+ cpdef unpack_plain_row(self , BytesIOReader reader, ParseDesc desc):
108+ cdef Buffer buf
109+ cdef Py_ssize_t i, rowsize = desc.rowsize
110+ cdef Deserializer deserializer
111+ cdef tuple res = tuple_new(desc.rowsize)
112+
113+ try :
114+ for i in range (rowsize):
115+ # Read the next few bytes
116+ get_buf(reader, & buf)
117+
118+ # Deserialize bytes to python object
119+ deserializer = desc.deserializers[i]
120+ val = from_binary(deserializer, & buf, desc.protocol_version)
121+ # Insert new object into tuple
122+ tuple_set(res, i, val)
123+ except Exception as e:
124+ raise DriverException(' Failed decoding result column "%s " of type %s : %s ' % (desc.colnames[i],
125+ desc.coltypes[i].cql_parameterized_type(),
126+ str (e)))
93127
94128 return res
0 commit comments