FileField)
import psycopg2
+import psycopg2.extensions
from pgwui_core.constants import (
CHECKED,
@attr.s
class ParameterExecutor():
'''Execute a parameterized pscopg2 statement
+ Must be mixed in with a DataLineProcessor.
'''
def param_execute(self, insert_stmt, udl):
try:
'Fewer columns than column headings',
f'The IndexError from psycopg2 is: ({exp})',
data=udl.raw)
+ except UnicodeEncodeError as exp:
+ self.raise_encoding_error(exp, udl)
+
+ def raise_encoding_error(self, exp, udl):
+ errors = []
+ cnt = 1
+ enc = psycopg2.extensions.encodings[self.cur.connection.encoding]
+ for col in udl.tuples:
+ try:
+ col.encode(encoding=enc)
+ except UnicodeEncodeError as detailed_exp:
+ errors.append(core_ex.EncodingError(
+ udl.lineno,
+ ("Data cannot be represented in the database's character"
+ " encoding"),
+ (f'The data ({col}) in column'
+ f' {cnt} contains an un-representable bit sequence;'
+ ' the reported error is:'),
+ str(detailed_exp),
+ data=udl.raw))
+ cnt += 1
+ if errors:
+ raise core_ex.MultiError(errors)
+ raise core_ex.EncodingError(
+ udl.lineno,
+ ("Data cannot be represented in the database's character"
+ " encoding"),
+ ('Cannot discover which column contains an un-representable'
+ ' bit sequence, the reported error is:'),
+ str(exp),
+ data=udl.raw)
class DataLineProcessor(object):
try:
self.upload_data(processor, self.data, errors)
# Let upload handler finish
- try:
- self.uh.cleanup()
- except core_ex.MultiError as ex:
- errors.extend(ex.errors)
- except core_ex.UploadError as ex:
- errors.append(ex)
+ 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
class TooFewColsError(DataLineError):
def __init__(self, lineno, e, descr='', detail='', data=''):
super().__init__(lineno, e, descr, detail, data)
+
+
+class EncodingError(DataLineError):
+ def __init__(self, lineno, e, descr='', detail='', data=''):
+ super().__init__(lineno, e, descr, detail, data)