|
16 | 16 | class TestObjectVar(BaseTestCase): |
17 | 17 |
|
18 | 18 | def __GetObjectAsTuple(self, obj): |
| 19 | + if obj.type.iscollection: |
| 20 | + value = [] |
| 21 | + for v in obj.aslist(): |
| 22 | + if isinstance(v, cx_Oracle.Object): |
| 23 | + v = self.__GetObjectAsTuple(v) |
| 24 | + elif isinstance(value, cx_Oracle.LOB): |
| 25 | + v = v.read() |
| 26 | + value.append(v) |
| 27 | + return value |
19 | 28 | attributeValues = [] |
20 | 29 | for attribute in obj.type.attributes: |
21 | 30 | value = getattr(obj, attribute.name) |
22 | 31 | if isinstance(value, cx_Oracle.Object): |
23 | | - if not value.type.iscollection: |
24 | | - value = self.__GetObjectAsTuple(value) |
25 | | - else: |
26 | | - subValue = [] |
27 | | - for v in value.aslist(): |
28 | | - if isinstance(v, cx_Oracle.Object): |
29 | | - v = self.__GetObjectAsTuple(v) |
30 | | - subValue.append(v) |
31 | | - value = subValue |
| 32 | + value = self.__GetObjectAsTuple(value) |
32 | 33 | elif isinstance(value, cx_Oracle.LOB): |
33 | 34 | value = value.read() |
34 | 35 | attributeValues.append(value) |
@@ -247,6 +248,35 @@ def testAppendingWrongObjectType(self): |
247 | 248 | self.assertRaises(cx_Oracle.DatabaseError, collectionObj.append, |
248 | 249 | arrayObj) |
249 | 250 |
|
| 251 | + def testReferencingSubObj(self): |
| 252 | + "test that referencing a sub object affects the parent object" |
| 253 | + objType = self.connection.gettype("UDT_OBJECT") |
| 254 | + subObjType = self.connection.gettype("UDT_SUBOBJECT") |
| 255 | + obj = objType.newobject() |
| 256 | + obj.SUBOBJECTVALUE = subObjType.newobject() |
| 257 | + obj.SUBOBJECTVALUE.SUBNUMBERVALUE = 5 |
| 258 | + obj.SUBOBJECTVALUE.SUBSTRINGVALUE = "Substring" |
| 259 | + self.assertEqual(obj.SUBOBJECTVALUE.SUBNUMBERVALUE, 5) |
| 260 | + self.assertEqual(obj.SUBOBJECTVALUE.SUBSTRINGVALUE, "Substring") |
| 261 | + |
| 262 | + def testAccessSubObjectParentObjectDestroyed(self): |
| 263 | + "test that accessing sub object after parent object destroyed works" |
| 264 | + objType = self.connection.gettype("UDT_OBJECT") |
| 265 | + subObjType = self.connection.gettype("UDT_SUBOBJECT") |
| 266 | + arrayType = self.connection.gettype("UDT_OBJECTARRAY") |
| 267 | + subObj1 = subObjType.newobject() |
| 268 | + subObj1.SUBNUMBERVALUE = 2 |
| 269 | + subObj1.SUBSTRINGVALUE = "AB" |
| 270 | + subObj2 = subObjType.newobject() |
| 271 | + subObj2.SUBNUMBERVALUE = 3 |
| 272 | + subObj2.SUBSTRINGVALUE = "CDE" |
| 273 | + obj = objType.newobject() |
| 274 | + obj.SUBOBJECTARRAY = arrayType.newobject([subObj1, subObj2]) |
| 275 | + subObjArray = obj.SUBOBJECTARRAY |
| 276 | + del obj |
| 277 | + self.assertEqual(self.__GetObjectAsTuple(subObjArray), |
| 278 | + [(2, "AB"), (3, "CDE")]) |
| 279 | + |
250 | 280 | def testSettingAttrWrongObjectType(self): |
251 | 281 | "test assigning an object of the wrong type to an object attribute" |
252 | 282 | objType = self.connection.gettype("UDT_OBJECT") |
|
0 commit comments