From: Chris Alfonso Date: Thu, 26 Apr 2012 13:33:01 +0000 (-0400) Subject: Moving db error wrapping into heat session to avoid a nova import X-Git-Tag: 2014.1~1924 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=10295665615ae525caa06c42a3edf3b81db817b8;p=openstack-build%2Fheat-build.git Moving db error wrapping into heat session to avoid a nova import --- diff --git a/heat/db/sqlalchemy/session.py b/heat/db/sqlalchemy/session.py index 066ebe68..73179ad9 100644 --- a/heat/db/sqlalchemy/session.py +++ b/heat/db/sqlalchemy/session.py @@ -16,7 +16,6 @@ import sqlalchemy.interfaces import sqlalchemy.orm from sqlalchemy.exc import DisconnectionError - from heat.openstack.common import cfg from heat.db import api as db_api @@ -24,6 +23,28 @@ _ENGINE = None _MAKER = None +class Error(Exception): + pass + +class DBError(Error): + """Wraps an implementation specific exception.""" + def __init__(self, inner_exception=None): + self.inner_exception = inner_exception + super(DBError, self).__init__(str(inner_exception)) + + +def _wrap_db_error(f): + def _wrap(*args, **kwargs): + try: + return f(*args, **kwargs) + except UnicodeEncodeError: + raise InvalidUnicodeParameter() + except Exception, e: + LOG.exception(_('DB exception wrapped.')) + raise DBError(e) + _wrap.func_name = f.func_name + return _wrap + def get_session(autocommit=True, expire_on_commit=False): """Return a SQLAlchemy session.""" global _ENGINE, _MAKER @@ -31,8 +52,9 @@ def get_session(autocommit=True, expire_on_commit=False): if _MAKER is None or _ENGINE is None: _ENGINE = get_engine() _MAKER = get_maker(_ENGINE, autocommit, expire_on_commit) - session = _MAKER() + session.query = _wrap_db_error(session.query) + session.flush = _wrap_db_error(session.flush) return session