summaryrefslogtreecommitdiff
path: root/oslo
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-07-25 13:44:10 +0000
committerGerrit Code Review <review@openstack.org>2014-07-25 13:44:10 +0000
commit50b8d1e8a1fbad5fa8f423229b993fb088282a15 (patch)
tree690a7fb14442a1bb804e887dae06ec00b3420027 /oslo
parent8dbba33f00c928e5349af967a28616044e1d788d (diff)
parenta9e3af2ebf9de4f771513283766d98c5f13dec24 (diff)
downloadoslo-db-50b8d1e8a1fbad5fa8f423229b993fb088282a15.tar.gz
Merge "Raise DBReferenceError on foreign key violation"
Diffstat (limited to 'oslo')
-rw-r--r--oslo/db/exception.py11
-rw-r--r--oslo/db/sqlalchemy/exc_filters.py37
2 files changed, 48 insertions, 0 deletions
diff --git a/oslo/db/exception.py b/oslo/db/exception.py
index 4adf350..4188481 100644
--- a/oslo/db/exception.py
+++ b/oslo/db/exception.py
@@ -35,6 +35,17 @@ class DBDuplicateEntry(DBError):
super(DBDuplicateEntry, self).__init__(inner_exception)
+class DBReferenceError(DBError):
+ """Wraps an implementation specific exception."""
+ def __init__(self, table, constraint, key, key_table,
+ inner_exception=None):
+ self.table = table
+ self.constraint = constraint
+ self.key = key
+ self.key_table = key_table
+ super(DBReferenceError, self).__init__(inner_exception)
+
+
class DBDeadlock(DBError):
def __init__(self, inner_exception=None):
super(DBDeadlock, self).__init__(inner_exception)
diff --git a/oslo/db/sqlalchemy/exc_filters.py b/oslo/db/sqlalchemy/exc_filters.py
index cf26bfd..da54ce3 100644
--- a/oslo/db/sqlalchemy/exc_filters.py
+++ b/oslo/db/sqlalchemy/exc_filters.py
@@ -161,6 +161,43 @@ def _sqlite_dupe_key_error(integrity_error, match, engine_name, is_disconnect):
raise exception.DBDuplicateEntry(columns, integrity_error)
+@filters("sqlite", sqla_exc.IntegrityError,
+ r".*SQL error: foreign key constraint failed")
+@filters("postgresql", sqla_exc.IntegrityError,
+ r".*on table \"(?P<table>[^\"]+)\" violates "
+ "foreign key constraint \"(?P<constraint>[^\"]+)\"\s*\n"
+ "DETAIL: Key \((?P<key>.+)\)=\(.+\) "
+ "is not present in table "
+ "\"(?P<key_table>[^\"]+)\".")
+@filters("mysql", sqla_exc.IntegrityError,
+ r".* Cannot add or update a child row: "
+ "a foreign key constraint fails "
+ "\((?P<table>.+), CONSTRAINT (?P<constraint>.+) "
+ "FOREIGN KEY \((?P<key>.+)\) "
+ "REFERENCES (?P<key_table>.+) \(.+\)\)")
+def _foreign_key_error(integrity_error, match, engine_name, is_disconnect):
+ """Filter for foreign key errors."""
+ try:
+ table = match.group("table")
+ except IndexError:
+ table = None
+ try:
+ constraint = match.group("constraint")
+ except IndexError:
+ constraint = None
+ try:
+ key = match.group("key")
+ except IndexError:
+ key = None
+ try:
+ key_table = match.group("key_table")
+ except IndexError:
+ key_table = None
+
+ raise exception.DBReferenceError(table, constraint, key, key_table,
+ integrity_error)
+
+
@filters("ibm_db_sa", sqla_exc.IntegrityError, r"^.*SQL0803N.*$")
def _db2_dupe_key_error(integrity_error, match, engine_name, is_disconnect):
"""Filter for DB2 duplicate key errors.