diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-07-25 13:44:10 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-07-25 13:44:10 +0000 |
commit | 50b8d1e8a1fbad5fa8f423229b993fb088282a15 (patch) | |
tree | 690a7fb14442a1bb804e887dae06ec00b3420027 /oslo | |
parent | 8dbba33f00c928e5349af967a28616044e1d788d (diff) | |
parent | a9e3af2ebf9de4f771513283766d98c5f13dec24 (diff) | |
download | oslo-db-50b8d1e8a1fbad5fa8f423229b993fb088282a15.tar.gz |
Merge "Raise DBReferenceError on foreign key violation"
Diffstat (limited to 'oslo')
-rw-r--r-- | oslo/db/exception.py | 11 | ||||
-rw-r--r-- | oslo/db/sqlalchemy/exc_filters.py | 37 |
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. |