Merge remote-tracking branch 'thobbs/PYTHON-234'

This commit is contained in:
Adam Holmberg
2015-03-16 11:20:02 -05:00
2 changed files with 37 additions and 0 deletions

View File

@@ -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'"

View File

@@ -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)