Skip to content

Commit ef3d843

Browse files
The ability to pickle/unpickle Database and API types has been restored.
1 parent d242bc7 commit ef3d843

File tree

5 files changed

+221
-133
lines changed

5 files changed

+221
-133
lines changed

doc/src/release_notes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Version 8.1 (TBD)
2020
#) Builds are now done with setuptools and most metadata has moved from
2121
`setup.py` to `setup.cfg` in order to take advantage of Python packaging
2222
improvements.
23+
#) The ability to pickle/unpickle Database and API types has been restored.
2324
#) Tests can now be run with tox in order to automate testing of the different
2425
environments that are supported.
2526
#) Improved documentation and test suite.

src/cxoApiType.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,25 @@ static PyObject *cxoApiType_repr(cxoApiType *apiType)
4646
}
4747

4848

49+
//-----------------------------------------------------------------------------
50+
// cxoApiType_reduce()
51+
// Method provided for pickling/unpickling of API types.
52+
//-----------------------------------------------------------------------------
53+
static PyObject *cxoApiType_reduce(cxoApiType *apiType)
54+
{
55+
return PyUnicode_DecodeASCII(apiType->name, strlen(apiType->name), NULL);
56+
}
57+
58+
59+
//-----------------------------------------------------------------------------
60+
// declaration of methods
61+
//-----------------------------------------------------------------------------
62+
static PyMethodDef cxoMethods[] = {
63+
{ "__reduce__", (PyCFunction) cxoApiType_reduce, METH_NOARGS },
64+
{ NULL, NULL }
65+
};
66+
67+
4968
//-----------------------------------------------------------------------------
5069
// declaration of members
5170
//-----------------------------------------------------------------------------
@@ -65,5 +84,6 @@ PyTypeObject cxoPyTypeApiType = {
6584
.tp_dealloc = (destructor) cxoApiType_free,
6685
.tp_repr = (reprfunc) cxoApiType_repr,
6786
.tp_flags = Py_TPFLAGS_DEFAULT,
68-
.tp_members = cxoMembers
87+
.tp_members = cxoMembers,
88+
.tp_methods = cxoMethods
6989
};

src/cxoDbType.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,25 @@ cxoDbType *cxoDbType_fromTransformNum(cxoTransformNum transformNum)
241241
}
242242

243243

244+
//-----------------------------------------------------------------------------
245+
// cxoDBType_reduce()
246+
// Method provided for pickling/unpickling of DB types.
247+
//-----------------------------------------------------------------------------
248+
static PyObject *cxoDBType_reduce(cxoDbType *dbType)
249+
{
250+
return PyUnicode_DecodeASCII(dbType->name, strlen(dbType->name), NULL);
251+
}
252+
253+
254+
//-----------------------------------------------------------------------------
255+
// declaration of methods
256+
//-----------------------------------------------------------------------------
257+
static PyMethodDef cxoMethods[] = {
258+
{ "__reduce__", (PyCFunction) cxoDBType_reduce, METH_NOARGS },
259+
{ NULL, NULL}
260+
};
261+
262+
244263
//-----------------------------------------------------------------------------
245264
// declaration of members
246265
//-----------------------------------------------------------------------------
@@ -261,6 +280,7 @@ PyTypeObject cxoPyTypeDbType = {
261280
.tp_repr = (reprfunc) cxoDbType_repr,
262281
.tp_flags = Py_TPFLAGS_DEFAULT,
263282
.tp_members = cxoMembers,
283+
.tp_methods = cxoMethods,
264284
.tp_richcompare = (richcmpfunc) cxoDbType_richCompare,
265285
.tp_hash = (hashfunc) cxoDbType_hash
266286
};

test/test_1500_dbtypes.py

Lines changed: 0 additions & 132 deletions
This file was deleted.

test/test_1500_types.py

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
#------------------------------------------------------------------------------
2+
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
#------------------------------------------------------------------------------
4+
5+
"""
6+
1500 - Module for testing comparisons with database types and API types,
7+
including the synonyms retained for backwards compatibility. This module also
8+
tests for pickling/unpickling of database types and API types.
9+
"""
10+
11+
import TestEnv
12+
13+
import cx_Oracle
14+
import pickle
15+
16+
class TestCase(TestEnv.BaseTestCase):
17+
18+
def __testCompare(self, dbType, apiType):
19+
self.assertEqual(dbType, dbType)
20+
self.assertEqual(dbType, apiType)
21+
self.assertEqual(apiType, dbType)
22+
self.assertNotEqual(dbType, 5)
23+
self.assertNotEqual(dbType, cx_Oracle.DB_TYPE_OBJECT)
24+
25+
def __testPickle(self, typ):
26+
self.assertIs(typ, pickle.loads(pickle.dumps(typ)))
27+
28+
def test_1500_DB_TYPE_BFILE(self):
29+
"1500 - test cx_Oracle.DB_TYPE_BFILE comparisons and pickling"
30+
self.assertEqual(cx_Oracle.DB_TYPE_BFILE, cx_Oracle.BFILE)
31+
self.__testPickle(cx_Oracle.DB_TYPE_BFILE)
32+
33+
def test_1501_DB_TYPE_BINARY_DOUBLE(self):
34+
"1501 - test cx_Oracle.DB_TYPE_BINARY_DOUBLE comparisons and pickling"
35+
self.__testCompare(cx_Oracle.DB_TYPE_BINARY_DOUBLE, cx_Oracle.NUMBER)
36+
self.assertEqual(cx_Oracle.DB_TYPE_BINARY_DOUBLE,
37+
cx_Oracle.NATIVE_FLOAT)
38+
self.__testPickle(cx_Oracle.DB_TYPE_BINARY_DOUBLE)
39+
40+
def test_1502_DB_TYPE_BINARY_FLOAT(self):
41+
"1502 - test cx_Oracle.DB_TYPE_BINARY_FLOAT comparisons and pickling"
42+
self.__testCompare(cx_Oracle.DB_TYPE_BINARY_FLOAT, cx_Oracle.NUMBER)
43+
self.__testPickle(cx_Oracle.DB_TYPE_BINARY_FLOAT)
44+
45+
def test_1503_DB_TYPE_BINARY_INTEGER(self):
46+
"1503 - test cx_Oracle.DB_TYPE_BINARY_INTEGER comparisons and pickling"
47+
self.__testCompare(cx_Oracle.DB_TYPE_BINARY_INTEGER, cx_Oracle.NUMBER)
48+
self.assertEqual(cx_Oracle.DB_TYPE_BINARY_INTEGER,
49+
cx_Oracle.NATIVE_INT)
50+
self.__testPickle(cx_Oracle.DB_TYPE_BINARY_INTEGER)
51+
52+
def test_1504_DB_TYPE_BLOB(self):
53+
"1504 - test cx_Oracle.DB_TYPE_BLOB comparisons and pickling"
54+
self.assertEqual(cx_Oracle.DB_TYPE_BLOB, cx_Oracle.BLOB)
55+
self.__testPickle(cx_Oracle.DB_TYPE_BLOB)
56+
57+
def test_1505_DB_TYPE_BOOLEAN(self):
58+
"1505 - test cx_Oracle.DB_TYPE_BOOLEAN comparisons and pickling"
59+
self.assertEqual(cx_Oracle.DB_TYPE_BOOLEAN, cx_Oracle.BOOLEAN)
60+
self.__testPickle(cx_Oracle.DB_TYPE_BOOLEAN)
61+
62+
def test_1506_DB_TYPE_CHAR(self):
63+
"1506 - test cx_Oracle.DB_TYPE_CHAR comparisons and pickling"
64+
self.__testCompare(cx_Oracle.DB_TYPE_CHAR, cx_Oracle.STRING)
65+
self.assertEqual(cx_Oracle.DB_TYPE_CHAR, cx_Oracle.FIXED_CHAR)
66+
self.__testPickle(cx_Oracle.DB_TYPE_CHAR)
67+
68+
def test_1507_DB_TYPE_CLOB(self):
69+
"1507 - test cx_Oracle.DB_TYPE_CLOB comparisons and pickling"
70+
self.assertEqual(cx_Oracle.DB_TYPE_CLOB, cx_Oracle.CLOB)
71+
self.__testPickle(cx_Oracle.DB_TYPE_CLOB)
72+
73+
def test_1508_DB_TYPE_CURSOR(self):
74+
"1508 - test cx_Oracle.DB_TYPE_CURSOR comparisons and pickling"
75+
self.assertEqual(cx_Oracle.DB_TYPE_CURSOR, cx_Oracle.CURSOR)
76+
self.__testPickle(cx_Oracle.DB_TYPE_CURSOR)
77+
78+
def test_1509_DB_TYPE_DATE(self):
79+
"1509 - test cx_Oracle.DB_TYPE_DATE comparisons and pickling"
80+
self.__testCompare(cx_Oracle.DB_TYPE_DATE, cx_Oracle.DATETIME)
81+
self.__testPickle(cx_Oracle.DB_TYPE_DATE)
82+
83+
def test_1510_DB_TYPE_INTERVAL_DS(self):
84+
"1510 - test cx_Oracle.DB_TYPE_INTERVAL_DS comparisons and pickling"
85+
self.assertEqual(cx_Oracle.DB_TYPE_INTERVAL_DS, cx_Oracle.INTERVAL)
86+
self.__testPickle(cx_Oracle.DB_TYPE_INTERVAL_DS)
87+
88+
def test_1511_DB_TYPE_LONG(self):
89+
"1511 - test cx_Oracle.DB_TYPE_LONG comparisons and pickling"
90+
self.__testCompare(cx_Oracle.DB_TYPE_LONG, cx_Oracle.STRING)
91+
self.assertEqual(cx_Oracle.DB_TYPE_LONG, cx_Oracle.LONG_STRING)
92+
self.__testPickle(cx_Oracle.DB_TYPE_LONG)
93+
94+
def test_1512_DB_TYPE_LONG_RAW(self):
95+
"1512 - test cx_Oracle.DB_TYPE_LONG_RAW comparisons and pickling"
96+
self.__testCompare(cx_Oracle.DB_TYPE_LONG_RAW, cx_Oracle.BINARY)
97+
self.assertEqual(cx_Oracle.DB_TYPE_LONG_RAW, cx_Oracle.LONG_BINARY)
98+
self.__testPickle(cx_Oracle.DB_TYPE_LONG_RAW)
99+
100+
def test_1513_DB_TYPE_NCHAR(self):
101+
"1513 - test cx_Oracle.DB_TYPE_NCHAR comparisons and pickling"
102+
self.__testCompare(cx_Oracle.DB_TYPE_NCHAR, cx_Oracle.STRING)
103+
self.assertEqual(cx_Oracle.DB_TYPE_NCHAR, cx_Oracle.FIXED_NCHAR)
104+
self.__testPickle(cx_Oracle.DB_TYPE_NCHAR)
105+
106+
def test_1514_DB_TYPE_NCLOB(self):
107+
"1514 - test cx_Oracle.DB_TYPE_NCLOB comparisons and pickling"
108+
self.assertEqual(cx_Oracle.DB_TYPE_NCLOB, cx_Oracle.NCLOB)
109+
self.__testPickle(cx_Oracle.DB_TYPE_NCLOB)
110+
111+
def test_1515_DB_TYPE_NUMBER(self):
112+
"1515 - test cx_Oracle.DB_TYPE_NUMBER comparisons and pickling"
113+
self.__testCompare(cx_Oracle.DB_TYPE_NUMBER, cx_Oracle.NUMBER)
114+
self.__testPickle(cx_Oracle.DB_TYPE_NUMBER)
115+
116+
def test_1516_DB_TYPE_NVARCHAR(self):
117+
"1516 - test cx_Oracle.DB_TYPE_NVARCHAR comparisons and pickling"
118+
self.__testCompare(cx_Oracle.DB_TYPE_NVARCHAR, cx_Oracle.STRING)
119+
self.assertEqual(cx_Oracle.DB_TYPE_NVARCHAR, cx_Oracle.NCHAR)
120+
self.__testPickle(cx_Oracle.DB_TYPE_NVARCHAR)
121+
122+
def test_1517_DB_TYPE_OBJECT(self):
123+
"1517 - test cx_Oracle.DB_TYPE_OBJECT comparisons and pickling"
124+
self.assertEqual(cx_Oracle.DB_TYPE_OBJECT, cx_Oracle.OBJECT)
125+
self.__testPickle(cx_Oracle.DB_TYPE_OBJECT)
126+
127+
def test_1518_DB_TYPE_RAW(self):
128+
"1518 - test cx_Oracle.DB_TYPE_RAW comparisons and pickling"
129+
self.__testCompare(cx_Oracle.DB_TYPE_RAW, cx_Oracle.BINARY)
130+
self.__testPickle(cx_Oracle.DB_TYPE_RAW)
131+
132+
def test_1519_DB_TYPE_ROWID(self):
133+
"1519 - test cx_Oracle.DB_TYPE_ROWID comparisons and pickling"
134+
self.__testCompare(cx_Oracle.DB_TYPE_ROWID, cx_Oracle.ROWID)
135+
self.__testPickle(cx_Oracle.DB_TYPE_ROWID)
136+
137+
def test_1520_DB_TYPE_TIMESTAMP(self):
138+
"1520 - test cx_Oracle.DB_TYPE_TIMESTAMP comparisons and pickling"
139+
self.__testCompare(cx_Oracle.DB_TYPE_TIMESTAMP, cx_Oracle.DATETIME)
140+
self.assertEqual(cx_Oracle.DB_TYPE_TIMESTAMP, cx_Oracle.TIMESTAMP)
141+
self.__testPickle(cx_Oracle.DB_TYPE_TIMESTAMP)
142+
143+
def test_1521_DB_TYPE_TIMESTAMP_LTZ(self):
144+
"1521 - test cx_Oracle.DB_TYPE_TIMESTAMP_LTZ comparisons and pickling"
145+
self.__testCompare(cx_Oracle.DB_TYPE_TIMESTAMP_LTZ, cx_Oracle.DATETIME)
146+
self.__testPickle(cx_Oracle.DB_TYPE_TIMESTAMP_LTZ)
147+
148+
def test_1522_DB_TYPE_TIMESTAMP_TZ(self):
149+
"1522 - test cx_Oracle.DB_TYPE_TIMESTAMP_TZ comparisons and pickling"
150+
self.__testCompare(cx_Oracle.DB_TYPE_TIMESTAMP_TZ, cx_Oracle.DATETIME)
151+
self.__testPickle(cx_Oracle.DB_TYPE_TIMESTAMP_TZ)
152+
153+
def test_1523_DB_TYPE_VARCHAR(self):
154+
"1523 - test cx_Oracle.DB_TYPE_VARCHAR comparisons and pickling"
155+
self.__testCompare(cx_Oracle.DB_TYPE_VARCHAR, cx_Oracle.STRING)
156+
self.__testPickle(cx_Oracle.DB_TYPE_VARCHAR)
157+
158+
def test_1524_NUMBER(self):
159+
"1524 - test cx_Oracle.NUMBER pickling"
160+
self.__testPickle(cx_Oracle.NUMBER)
161+
162+
def test_1525_STRING(self):
163+
"1525 - test cx_Oracle.STRING pickling"
164+
self.__testPickle(cx_Oracle.STRING)
165+
166+
def test_1526_DATETIME(self):
167+
"1526 - test cx_Oracle.DATETIME pickling"
168+
self.__testPickle(cx_Oracle.DATETIME)
169+
170+
def test_1527_BINARY(self):
171+
"1527 - test cx_Oracle.BINARY pickling"
172+
self.__testPickle(cx_Oracle.BINARY)
173+
174+
def test_1528_ROWID(self):
175+
"1528 - test cx_Oracle.ROWID pickling"
176+
self.__testPickle(cx_Oracle.ROWID)
177+
178+
if __name__ == "__main__":
179+
TestEnv.RunTestCases()

0 commit comments

Comments
 (0)