Skip to content

Commit e8eaa9b

Browse files
Fixed bug that prevented the full_code attribute from being populated on
the errors returned by cursor.getbatcherrors().
1 parent eaa4234 commit e8eaa9b

File tree

4 files changed

+25
-23
lines changed

4 files changed

+25
-23
lines changed

doc/src/release_notes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Thin Mode Changes
3030
when connecting to a database that the listener configuration file states
3131
exists but actually doesn't
3232
(`issue 51 <https://github.com/oracle/python-oracledb/issues/51>`__).
33+
#) Fixed bug that prevented the `full_code` attribute from being populated on
34+
the errors returned by :func:`Cursor.getbatcherrors()`.
3335

3436
Thick Mode Changes
3537
++++++++++++++++++

src/oracledb/errors.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,35 @@ def __init__(self, message: str=None, context: str=None,
5151
self.offset = offset
5252
self.is_session_dead = False
5353
self.full_code = ""
54-
if message is not None:
55-
pos = message.find(":")
54+
self._make_adjustments()
55+
56+
def _make_adjustments(self):
57+
"""
58+
Make adjustments to the error, if needed, and calculate the full_code
59+
attribute.
60+
"""
61+
if self.message is not None:
62+
pos = self.message.find(":")
5663
if pos > 0:
57-
self.full_code = message[:pos]
58-
if code != 0 or self.full_code.startswith("DPI-"):
64+
self.full_code = self.message[:pos]
65+
if self.code != 0 or self.full_code.startswith("DPI-"):
5966
args = {}
60-
if code != 0:
61-
driver_error_info = ERR_ORACLE_ERROR_XREF.get(code)
67+
if self.code != 0:
68+
driver_error_info = ERR_ORACLE_ERROR_XREF.get(self.code)
6269
else:
6370
error_num = int(self.full_code[4:])
6471
driver_error_info = ERR_DPI_ERROR_XREF.get(error_num)
6572
if driver_error_info is not None:
6673
if isinstance(driver_error_info, tuple):
6774
driver_error_num, pattern = driver_error_info
68-
args = re.search(pattern, message).groupdict()
75+
args = re.search(pattern, self.message).groupdict()
6976
else:
7077
driver_error_num = driver_error_info
7178
if driver_error_num == ERR_CONNECTION_CLOSED:
7279
self.is_session_dead = True
7380
driver_error = _get_error_text(driver_error_num, **args)
7481
self.message = f"{driver_error}\n{self.message}"
82+
self.full_code = f"{ERR_PREFIX}-{driver_error_num:04}"
7583

7684
def __str__(self):
7785
return self.message

src/oracledb/impl/thin/messages.pyx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ cdef class Message:
152152
buf.skip_ub2() # skip chunk length
153153
info.batcherrors[i].message = \
154154
buf.read_str(TNS_CS_IMPLICIT).rstrip()
155+
info.batcherrors[i]._make_adjustments()
155156
buf.skip_raw_bytes(2) # ignore end marker
156157

157158
buf.read_ub4(&info.num) # error number (extended)

tests/test_3200_features_12_1.py

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -448,12 +448,10 @@ def test_3222_insert_with_batch_error(self):
448448
arraydmlrowcounts=True)
449449
user = test_env.get_main_user()
450450
expected_errors = [
451-
( 4, 1438, "ORA-01438: value larger than specified " \
452-
"precision allowed for this column" ),
453-
( 2, 1, "ORA-00001: unique constraint " \
454-
"(%s.TESTARRAYDML_PK) violated" % user.upper())
451+
(4, "ORA-01438"),
452+
(2, "ORA-00001")
455453
]
456-
actual_errors = [(e.offset, e.code, e.message) \
454+
actual_errors = [(e.offset, e.full_code) \
457455
for e in self.cursor.getbatcherrors()]
458456
self.assertEqual(actual_errors, expected_errors)
459457
self.assertEqual(self.cursor.getarraydmlrowcounts(), [1, 1, 0, 1, 0])
@@ -488,12 +486,8 @@ def test_3224_update_with_batch_error(self):
488486
sql = "insert into TestArrayDML (IntCol, StringCol, IntCol2) " \
489487
"values (:1, :2, :3)"
490488
self.cursor.executemany(sql, rows, batcherrors=True)
491-
user = test_env.get_main_user()
492-
expected_errors = [
493-
( 6, 1, "ORA-00001: unique constraint " \
494-
"(%s.TESTARRAYDML_PK) violated" % user.upper())
495-
]
496-
actual_errors = [(e.offset, e.code, e.message) \
489+
expected_errors = [(6, "ORA-00001")]
490+
actual_errors = [(e.offset, e.full_code) \
497491
for e in self.cursor.getbatcherrors()]
498492
self.assertEqual(actual_errors, expected_errors)
499493
rows = [
@@ -506,11 +500,8 @@ def test_3224_update_with_batch_error(self):
506500
sql = "update TestArrayDML set IntCol2 = :1 where StringCol = :2"
507501
self.cursor.executemany(sql, rows, arraydmlrowcounts=True,
508502
batcherrors=True)
509-
expected_errors = [
510-
(2, 1438, "ORA-01438: value larger than specified " \
511-
"precision allowed for this column")
512-
]
513-
actual_errors = [(e.offset, e.code, e.message) \
503+
expected_errors = [(2, "ORA-01438")]
504+
actual_errors = [(e.offset, e.full_code) \
514505
for e in self.cursor.getbatcherrors()]
515506
self.assertEqual(actual_errors, expected_errors)
516507
self.assertEqual(self.cursor.getarraydmlrowcounts(), [1, 2, 0, 0, 1])

0 commit comments

Comments
 (0)