Merge remote-tracking branch 'thobbs/PYTHON-234'
This commit is contained in:
@@ -984,6 +984,23 @@ class CompositeType(_ParameterizedType):
|
||||
typestring = cls.cass_parameterized_type(full=True)
|
||||
return "'%s'" % (typestring,)
|
||||
|
||||
@classmethod
|
||||
def deserialize_safe(cls, byts, protocol_version):
|
||||
result = []
|
||||
for subtype in cls.subtypes:
|
||||
if not byts:
|
||||
# CompositeType can have missing elements at the end
|
||||
break
|
||||
|
||||
element_length = uint16_unpack(byts[:2])
|
||||
element = byts[2:2 + element_length]
|
||||
|
||||
# skip element length, element, and the EOC (one byte)
|
||||
byts = byts[2 + element_length + 1:]
|
||||
result.append(subtype.from_binary(element, protocol_version))
|
||||
|
||||
return tuple(result)
|
||||
|
||||
|
||||
class DynamicCompositeType(CompositeType):
|
||||
typename = "'org.apache.cassandra.db.marshal.DynamicCompositeType'"
|
||||
|
||||
@@ -741,3 +741,23 @@ class TypeTests(unittest.TestCase):
|
||||
s.execute("DROP TYPE %s_nested" % (name))
|
||||
s.execute("DROP TYPE %s" % (name))
|
||||
s.shutdown()
|
||||
|
||||
def test_reading_composite_type(self):
|
||||
s = self._session
|
||||
s.execute("""
|
||||
CREATE TABLE composites (
|
||||
a int PRIMARY KEY,
|
||||
b 'org.apache.cassandra.db.marshal.CompositeType(AsciiType, Int32Type)'
|
||||
)""")
|
||||
|
||||
# CompositeType string literals are split on ':' chars
|
||||
s.execute("INSERT INTO composites (a, b) VALUES (0, 'abc:123')")
|
||||
result = s.execute("SELECT * FROM composites WHERE a = 0")[0]
|
||||
self.assertEqual(0, result.a)
|
||||
self.assertEqual(('abc', 123), result.b)
|
||||
|
||||
# CompositeType values can omit elements at the end
|
||||
s.execute("INSERT INTO composites (a, b) VALUES (0, 'abc')")
|
||||
result = s.execute("SELECT * FROM composites WHERE a = 0")[0]
|
||||
self.assertEqual(0, result.a)
|
||||
self.assertEqual(('abc',), result.b)
|
||||
|
||||
Reference in New Issue
Block a user