consistent error message on deserialization failure

This commit is contained in:
Alan Boudreault
2016-11-22 15:27:15 -05:00
parent 74331d860a
commit be63ec7152
3 changed files with 19 additions and 4 deletions

View File

@@ -14,6 +14,7 @@
include "ioutils.pyx"
from cassandra import DriverException
from cassandra.bytesio cimport BytesIOReader
from cassandra.deserializers cimport Deserializer, from_binary
from cassandra.parsing cimport ParseDesc, ColumnParser, RowParser
@@ -67,8 +68,12 @@ cdef class TupleRowParser(RowParser):
# Deserialize bytes to python object
deserializer = desc.deserializers[i]
val = from_binary(deserializer, &buf, desc.protocol_version)
try:
val = from_binary(deserializer, &buf, desc.protocol_version)
except Exception as e:
raise DriverException('Failed decoding result column "%s" of type %s: %s' % (desc.colnames[i],
desc.coltypes[i].cql_parameterized_type(),
str(e)))
# Insert new object into tuple
tuple_set(res, i, val)

View File

@@ -651,7 +651,7 @@ class ResultMessage(_MessageType):
except Exception as e:
raise DriverException('Failed decoding result column "%s" of type %s: %s' % (colnames[i],
coltypes[i].cql_parameterized_type(),
e.message))
str(e)))
return paging_state, coltypes, (colnames, parsed_rows)
@classmethod

View File

@@ -13,6 +13,7 @@
# limitations under the License.
from cassandra.parsing cimport ParseDesc, ColumnParser
from cassandra.obj_parser import TupleRowParser
from cassandra.deserializers import make_deserializers
include "ioutils.pyx"
@@ -33,7 +34,16 @@ def make_recv_results_rows(ColumnParser colparser):
desc = ParseDesc(colnames, coltypes, make_deserializers(coltypes),
protocol_version)
reader = BytesIOReader(f.read())
parsed_rows = colparser.parse_rows(reader, desc)
try:
parsed_rows = colparser.parse_rows(reader, desc)
except Exception as e:
# Use explicitly the TupleRowParser to display better error messages for column decoding failures
rowparser = TupleRowParser()
reader.buf_ptr = reader.buf
reader.pos = 0
rowcount = read_int(reader)
for i in range(rowcount):
rowparser.unpack_row(reader, desc)
return (paging_state, coltypes, (colnames, parsed_rows))