Refactor encoding errors when using parameterized sql
authorKarl O. Pinc <kop@karlpinc.com>
Sat, 24 Feb 2024 02:14:02 +0000 (20:14 -0600)
committerKarl O. Pinc <kop@karlpinc.com>
Sat, 24 Feb 2024 02:14:02 +0000 (20:14 -0600)
src/pgwui_core/core.py

index c66940dfcb35e4bbf7d9d0af3ccbc468ba97cef7..3f6c91aece0e42d3181144822c7dd5b559ff4abe 100644 (file)
@@ -991,32 +991,21 @@ class ParameterExecutor():
     '''Execute a parameterized psycopg3 statement
     Must be mixed in with a DataLineProcessor.
     '''
-    def param_execute(self, insert_stmt, udl):
-        try:
-            self.cur.execute(insert_stmt, udl.tuples)
-        except IndexError as exp:
-            raise core_ex.TooFewColsError(
-                udl.lineno,
-                'Line has too few columns',
-                'Fewer columns than column headings',
-                f'The IndexError from psycopg3 is: ({exp})',
-                data=udl.raw)
-        except UnicodeEncodeError as exp:
-            self.raise_encoding_error(
-                exp, udl, self.cur.connection.encoding, False)
-        except psycopg.errors.UntranslateableCharacter as exp:
-            self.raise_encoding_error(
-                exp, udl, self.ue.server_encoding(), True)
-
-    def raise_encoding_error(self, exp, udl, encoding, server_side):
-        errors = []
-        cnt = 1
+    def connection_details(self, server_side):
         if server_side:
             description = ("Data cannot be represented in the"
                            " character encoding of the database")
+            encoding = self.ue.server_encoding()
         else:
             description = ("Data cannot be represented in the database"
                            " connection's client-side character encoding")
+            encoding = self.cur.connection.encoding
+        return (description, encoding)
+
+    def raise_encoding_error(self, exp, udl, server_side):
+        errors = []
+        cnt = 1
+        (description, encoding) = self.connection_details(server_side)
         for col in udl.tuples:
             try:
                 col.encode(encoding=encoding)
@@ -1050,6 +1039,21 @@ class ParameterExecutor():
             str(exp),
             data=udl.raw)
 
+    def param_execute(self, insert_stmt, udl):
+        try:
+            self.cur.execute(insert_stmt, udl.tuples)
+        except IndexError as exp:
+            raise core_ex.TooFewColsError(
+                udl.lineno,
+                'Line has too few columns',
+                'Fewer columns than column headings',
+                f'The IndexError from psycopg3 is: ({exp})',
+                data=udl.raw)
+        except UnicodeEncodeError as exp:
+            self.raise_encoding_error(exp, udl, False)
+        except psycopg.errors.UntranslateableCharacter as exp:
+            self.raise_encoding_error(exp, udl, True)
+
 
 class DataLineProcessor(object):
     '''