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
_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
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