X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=ca90ba8882bedaa6dc316d94efd44fb2c09086ae;hb=282d1ce6f56cb8ec1f37b6d9e5c2b9b856141a0e;hp=8ee9076874d09a0d785924cb4bf3eb891e9b41b9;hpb=46e78dc7379a831bcd05fe86f218d3f4753d26d5;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 8ee90768..ca90ba88 100755 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -59,21 +59,42 @@ __all__ = ['IntegrityError', 'SQLAlchemyError'] ################################################################################ def session_wrapper(fn): + """ + Wrapper around common ".., session=None):" handling. If the wrapped + function is called without passing 'session', we create a local one + and destroy it when the function ends. + + Also attaches a commit_or_flush method to the session; if we created a + local session, this is a synonym for session.commit(), otherwise it is a + synonym for session.flush(). + """ + 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() + # Find the session object + try: + session = kwargs['session'] + except KeyError: + if len(args) <= len(getargspec(fn)[0]) - 1: + # No session specified as last argument or in kwargs + private_transaction = True + session = kwargs['session'] = DBConn().session() + else: + # Session is last argument in args + session = args[-1] + + if private_transaction: + session.commit_or_flush = session.commit + else: + session.commit_or_flush = session.flush try: return fn(*args, **kwargs) finally: if private_transaction: # We created a session; close it. - kwargs['session'].close() + session.close() wrapped.__doc__ = fn.__doc__ wrapped.func_name = fn.func_name