]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Moving db error wrapping into heat session to avoid a nova import
authorChris Alfonso <calfonso@redhat.com>
Thu, 26 Apr 2012 13:33:01 +0000 (09:33 -0400)
committerChris Alfonso <calfonso@redhat.com>
Thu, 26 Apr 2012 13:33:14 +0000 (09:33 -0400)
heat/db/sqlalchemy/session.py

index 066ebe68a596af74b0ad4229d49ef52498cba66a..73179ad9a9da796de2d9bc883514023fe3483880 100644 (file)
@@ -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