From 1e2b6b23cbdc930b4643fe20c56ed4d3d2d95b99 Mon Sep 17 00:00:00 2001 From: "Karl O. Pinc" Date: Fri, 23 Feb 2024 20:14:02 -0600 Subject: [PATCH] Refactor encoding errors when using parameterized sql --- src/pgwui_core/core.py | 44 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/pgwui_core/core.py b/src/pgwui_core/core.py index c66940d..3f6c91a 100644 --- a/src/pgwui_core/core.py +++ b/src/pgwui_core/core.py @@ -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): ''' -- 2.34.1