+def session_wrapper(fn):
+ def wrapped(*args, **kwargs):
+ private_transaction = False
+ session = kwargs.get('session')
+
+ # No session specified as last argument or in kwargs, create one.
+ if session is None and len(args) <= len(getargspec(fn)[0]) - 1:
+ private_transaction = True
+ kwargs['session'] = DBConn().session()
+
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ if private_transaction:
+ # We created a session; close it.
+ kwargs['session'].close()
+
+ wrapped.__doc__ = fn.__doc__
+ wrapped.func_name = fn.func_name
+
+ return wrapped
+
+################################################################################
+