diff options
author | Julien Danjou <julien@danjou.info> | 2015-03-26 17:15:35 +0100 |
---|---|---|
committer | Julien Danjou <julien@danjou.info> | 2015-03-26 17:36:03 +0100 |
commit | 3522ef758a58fed18bb2b1b210018d4f8a3bbb6d (patch) | |
tree | f8d9085f5d7c178681879f262a07adcc28290b25 | |
parent | 3cf218d0961cf1e0dc2c6f58602c307f43ac6ad9 (diff) | |
download | oslo-db-3522ef758a58fed18bb2b1b210018d4f8a3bbb6d.tar.gz |
Catch DBDuplicateError in MySQL if primary key is binary
In Gnocchi we use binary primary keys, and one a duplicate entry is
inserted the error is not catched. This patches fixes that.
Change-Id: I488628df1a3b91d842eb9fa76bc1878f12d37acd
Closes-Bug: #1368297
-rw-r--r-- | oslo_db/sqlalchemy/exc_filters.py | 6 | ||||
-rw-r--r-- | oslo_db/tests/sqlalchemy/test_exc_filters.py | 18 |
2 files changed, 23 insertions, 1 deletions
diff --git a/oslo_db/sqlalchemy/exc_filters.py b/oslo_db/sqlalchemy/exc_filters.py index 777fda6..f1f7f88 100644 --- a/oslo_db/sqlalchemy/exc_filters.py +++ b/oslo_db/sqlalchemy/exc_filters.py @@ -91,8 +91,12 @@ def _deadlock_error(operational_error, match, engine_name, is_disconnect): @filters("mysql", sqla_exc.IntegrityError, - r"^.*\b1062\b.*Duplicate entry '(?P<value>[^']+)'" + r"^.*\b1062\b.*Duplicate entry '(?P<value>.+)'" r" for key '(?P<columns>[^']+)'.*$") +# NOTE(jd) For binary types +@filters("mysql", sqla_exc.IntegrityError, + r"^.*\b1062\b.*Duplicate entry \\'(?P<value>.+)\\'" + r" for key \\'(?P<columns>.+)\\'.*$") # NOTE(pkholkin): the first regex is suitable only for PostgreSQL 9.x versions # the second regex is suitable for PostgreSQL 8.x versions @filters("postgresql", sqla_exc.IntegrityError, diff --git a/oslo_db/tests/sqlalchemy/test_exc_filters.py b/oslo_db/tests/sqlalchemy/test_exc_filters.py index aafdcfb..5053754 100644 --- a/oslo_db/tests/sqlalchemy/test_exc_filters.py +++ b/oslo_db/tests/sqlalchemy/test_exc_filters.py @@ -424,6 +424,24 @@ class TestDuplicate(TestsExceptionFilter): expected_value='2' ) + def test_mysql_binary(self): + self._run_dupe_constraint_test( + "mysql", + "(1062, \'Duplicate entry " + "\\\'\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E\\\' " + "for key \\\'PRIMARY\\\'\')", + expected_columns=['PRIMARY'], + expected_value="\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E" + ) + self._run_dupe_constraint_test( + "mysql", + "(1062, \'Duplicate entry " + "''\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E!,' " + "for key 'PRIMARY'\')", + expected_columns=['PRIMARY'], + expected_value="'\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E!," + ) + def test_postgresql_single(self): self._run_dupe_constraint_test( 'postgresql', |