From 10295665615ae525caa06c42a3edf3b81db817b8 Mon Sep 17 00:00:00 2001 From: Chris Alfonso Date: Thu, 26 Apr 2012 09:33:01 -0400 Subject: [PATCH] Moving db error wrapping into heat session to avoid a nova import --- heat/db/sqlalchemy/session.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) 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 -- 2.45.2