diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-04-10 11:54:33 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-04-10 11:54:33 +0000 |
commit | 88dd9b0856a6ce7017a41ab1dc9e0cd00f78bfe2 (patch) | |
tree | 97682253a88b26212e20458bc733d78cee442691 | |
parent | 7e747bf3633755629ce2166619e48f57c01acef9 (diff) | |
parent | af9a99b1b93fce7523be81860a6668cdbab03b49 (diff) | |
download | oslo-db-88dd9b0856a6ce7017a41ab1dc9e0cd00f78bfe2.tar.gz |
Merge "Add filters for DBDataError exception"
-rw-r--r-- | oslo_db/exception.py | 8 | ||||
-rw-r--r-- | oslo_db/sqlalchemy/exc_filters.py | 12 | ||||
-rw-r--r-- | oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py | 49 |
3 files changed, 69 insertions, 0 deletions
diff --git a/oslo_db/exception.py b/oslo_db/exception.py index f950f6a..111c4b5 100644 --- a/oslo_db/exception.py +++ b/oslo_db/exception.py @@ -155,6 +155,14 @@ class DBConnectionError(DBError): pass +class DBDataError(DBError): + """Raised for errors that are due to problems with the processed data. + + E.g. division by zero, numeric value out of range, incorrect data type, etc + + """ + + class InvalidSortKey(Exception): """A sort key destined for database query usage is invalid.""" diff --git a/oslo_db/sqlalchemy/exc_filters.py b/oslo_db/sqlalchemy/exc_filters.py index f1f7f88..75bd0fa 100644 --- a/oslo_db/sqlalchemy/exc_filters.py +++ b/oslo_db/sqlalchemy/exc_filters.py @@ -254,6 +254,18 @@ def _raise_mysql_table_doesnt_exist_asis( raise error +@filters("mysql", sqla_exc.OperationalError, + r".*(1292|1366).*Incorrect \w+ value.*") +@filters("mysql", sqla_exc.DataError, + r".*1265.*Data truncated for column.*") +@filters("mysql", sqla_exc.DataError, + r".*1264.*Out of range value for column.*") +def _raise_data_error(error, match, engine_name, is_disconnect): + """Raise DBDataError exception for different data errors.""" + + raise exception.DBDataError(error) + + @filters("*", sqla_exc.OperationalError, r".*") def _raise_operational_errors_directly_filter(operational_error, match, engine_name, diff --git a/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py b/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py index 4d4609a..77670be 100644 --- a/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py +++ b/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py @@ -78,6 +78,9 @@ class TestsExceptionFilter(_SQLAExceptionMatcher, oslo_test_base.BaseTestCase): class ProgrammingError(Error): pass + class DataError(Error): + pass + class TransactionRollbackError(OperationalError): """Special psycopg2-only error class. @@ -223,6 +226,52 @@ class TestFallthroughsAndNonDBAPI(TestsExceptionFilter): self.assertEqual("mysqldb has an attribute error", matched.args[0]) +class TestDataError(TestsExceptionFilter): + + def test_mysql_incorrect_value(self): + matched = self._run_test( + "mysql", "insert into testtbl (id, b) values (4242, 4242)", + self.OperationalError( + "ERROR 1292 (22007): Incorrect datetime value: '4242' " + "for column 'b' at row 1" + ), + exception.DBDataError + ) + self.assertInnerException( + matched, + "OperationalError", + ("ERROR 1292 (22007): Incorrect datetime value: '4242' for column " + "'b' at row 1"), + "insert into testtbl (id, b) values (4242, 4242)", ()) + + def test_mysql_data_truncated_for_column(self): + matched = self._run_test( + "mysql", "insert into testtbl (id, b) values (4242, '42aabbccdd')", + self.DataError( + "ERROR 1265 (01000): Data truncated for column 'b' at row 1"), + exception.DBDataError + ) + self.assertInnerException( + matched, + "DataError", + "ERROR 1265 (01000): Data truncated for column 'b' at row 1", + "insert into testtbl (id, b) values (4242, '42aabbccdd')", ()) + + def test_mysql_out_of_range_value(self): + matched = self._run_test( + "mysql", "insert into testtbl (id, b) values (4242, 424242424242)", + self.DataError( + "ERROR 1264 (22003): Out of range value for column 'b' " + "at row 1"), + exception.DBDataError + ) + self.assertInnerException( + matched, + "DataError", + "ERROR 1264 (22003): Out of range value for column 'b' at row 1", + "insert into testtbl (id, b) values (4242, 424242424242)", ()) + + class TestReferenceErrorSQLite(_SQLAExceptionMatcher, test_base.DbTestCase): def setUp(self): |