From 650535d718c8a9736cc6ce33a51e98a3864b11e4 Mon Sep 17 00:00:00 2001 From: "Karl O. Pinc" Date: Thu, 3 Jun 2021 11:42:40 -0500 Subject: [PATCH] Continue processing file after an encoding error is found --- src/pgwui_core/core.py | 19 +++++++++++++------ src/pgwui_core/exceptions.py | 12 ++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/pgwui_core/core.py b/src/pgwui_core/core.py index 39a3418..7ad71d6 100644 --- a/src/pgwui_core/core.py +++ b/src/pgwui_core/core.py @@ -1023,7 +1023,7 @@ class ParameterExecutor(): data=udl.raw)) cnt += 1 if errors: - raise core_ex.MultiError(errors) + raise core_ex.MultiDataLineError(errors) raise core_ex.EncodingError( udl.lineno, ("Data cannot be represented in the database's character" @@ -1509,11 +1509,12 @@ class DBConnector(object): try: self.upload_data(processor, self.data, errors) # Let upload handler finish - self.uh.cleanup() - except core_ex.MultiError as ex: - errors.extend(ex.errors) - except core_ex.UploadError as ex: - errors.append(ex) + try: + self.uh.cleanup() + except core_ex.MultiError as ex: + errors.extend(ex.errors) + except core_ex.UploadError as ex: + errors.append(ex) finally: self.cur.close() return errors @@ -1701,6 +1702,8 @@ class NoTransactionEngine(DBConnector): errors.append(core_ex.DBDataLineError(udl, ex)) except (core_ex.DataLineError, core_ex.DBError) as ex: errors.append(ex) + except core_ex.MultiDataLineError as ex: + errors.extend(ex.errors) class UnsafeUploadEngine(DBConnector): @@ -1806,6 +1809,10 @@ class UnsafeUploadEngine(DBConnector): self.cur.execute( 'ROLLBACK TO line_savepoint;') errors.append(ex) + except core_ex.MultiDataLineError as ex: + self.cur.execute( + 'ROLLBACK TO line_savepoint;') + errors.extend(ex.errors) else: self.cur.execute( 'RELEASE line_savepoint;') diff --git a/src/pgwui_core/exceptions.py b/src/pgwui_core/exceptions.py index 8fff49d..b79bac9 100644 --- a/src/pgwui_core/exceptions.py +++ b/src/pgwui_core/exceptions.py @@ -37,6 +37,18 @@ class MultiError(PGWUIError): self.errors = errors +class MultiDataLineError(MultiError): + '''Multiple errors that are all DataLineErrors + ''' + def __init__(self, errors): + for error in errors: + if not isinstance(error, DataLineError): + raise TypeError( + f'unsupported exception type ({type(error)}) for a' + f' MultiDataLineError value: {error}') + super().__init__(errors) + + class UploadError(PGWUIError): ''' Module exceptions are derived from this class. -- 2.34.1