summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Danjou <julien@danjou.info>2015-03-26 17:15:35 +0100
committerJulien Danjou <julien@danjou.info>2015-03-26 17:36:03 +0100
commit3522ef758a58fed18bb2b1b210018d4f8a3bbb6d (patch)
treef8d9085f5d7c178681879f262a07adcc28290b25
parent3cf218d0961cf1e0dc2c6f58602c307f43ac6ad9 (diff)
downloadoslo-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.py6
-rw-r--r--oslo_db/tests/sqlalchemy/test_exc_filters.py18
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',