Fail gracefully when the db doesn't speak unicode
When sqlalchemy/mysql doesn't contain the charset=utf8 or use_unicode=1 parameters (and the default mysql connection charset is not utf8), sqlalchemy will connect to mysql in ascii mode; In ascii mode, it will attempt to reencode all input data to latin-1 regardless of the database/table collation setting. This catches that error and turns it into an invalid parameter. (The error message associated with this is something like UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2026' in position 30: ordinal not in range(256)) This fixes bug 944034 and is related to bug 898808 Change-Id: I082b7568ef9e9d2104e13aa58d207535ef201bd3
This commit is contained in:
@@ -88,6 +88,8 @@ def wrap_db_error(f):
|
|||||||
def _wrap(*args, **kwargs):
|
def _wrap(*args, **kwargs):
|
||||||
try:
|
try:
|
||||||
return f(*args, **kwargs)
|
return f(*args, **kwargs)
|
||||||
|
except UnicodeEncodeError:
|
||||||
|
raise InvalidUnicodeParameter()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
LOG.exception(_('DB exception wrapped.'))
|
LOG.exception(_('DB exception wrapped.'))
|
||||||
raise DBError(e)
|
raise DBError(e)
|
||||||
@@ -275,6 +277,11 @@ class InvalidRPCConnectionReuse(Invalid):
|
|||||||
message = _("Invalid reuse of an RPC connection.")
|
message = _("Invalid reuse of an RPC connection.")
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidUnicodeParameter(Invalid):
|
||||||
|
message = _("Invalid Parameter: "
|
||||||
|
"Unicode is not supported by the current database.")
|
||||||
|
|
||||||
|
|
||||||
# Cannot be templated as the error syntax varies.
|
# Cannot be templated as the error syntax varies.
|
||||||
# msg needs to be constructed when raised.
|
# msg needs to be constructed when raised.
|
||||||
class InvalidParameterValue(Invalid):
|
class InvalidParameterValue(Invalid):
|
||||||
|
Reference in New Issue
Block a user