+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 or 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()
+
+ return wrapped
+
+################################################################################
+