Continue processing file after an encoding error is found
authorKarl O. Pinc <kop@karlpinc.com>
Thu, 3 Jun 2021 16:42:40 +0000 (11:42 -0500)
committerKarl O. Pinc <kop@karlpinc.com>
Thu, 3 Jun 2021 16:42:40 +0000 (11:42 -0500)
src/pgwui_core/core.py
src/pgwui_core/exceptions.py

index 39a34188a6342e339bfca522f306b282780d1c8f..7ad71d6f782147725718b4d9233886ed944ba025 100644 (file)
@@ -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;')
index 8fff49d2db0eb1d2da799cafb132167fa30370e2..b79bac933964f7386fc792eeed5b66de83debbca 100644 (file)
@@ -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.