# HG changeset patch # User Sandro Knauß # Date 1329159001 -3600 # Node ID ff8448fb07e7571d3a74d92b3873daef9102d44c # Parent c6896c3374c4f32176f963f72b3901c202dc6627 runInDBThread and dbdefer can now handle if a valid session is an arg diff -r c6896c3374c4 -r ff8448fb07e7 iro/model/dbdefer.py --- a/iro/model/dbdefer.py Mon Feb 13 18:00:27 2012 +0100 +++ b/iro/model/dbdefer.py Mon Feb 13 19:50:01 2012 +0100 @@ -1,4 +1,5 @@ from decorator import FunctionMaker +import sqlalchemy from .pool import runInDBPool from .utils import WithSession @@ -14,24 +15,37 @@ def __call__(self, func): @runInDBPool def wrapper(func,*a, **kw): - pos = argspec.args.index("session") - ab=list(a[:pos]) - ae=list(a[pos:]) - with WithSession(self.engine, self.autocommit) as session: - al = ab+[session]+ae - return func(*al, **kw) + i = argspec.args.index("session") + ab = a[:i] + ae = a[i:-1] + if isinstance(a[-1],sqlalchemy.orm.session.Session): + al = ab + (a[-1],) + ae + ret = func(*al, **kw) + if self.autocommit: + a[-1].commit() + return ret + else: + with WithSession(self.engine, self.autocommit) as session: + al = ab + (session,) + ae + return func(*al, **kw) caller=func argspec = inspect.getargspec(caller) args =[i for i in argspec.args if i != "session" ] sargs=", ".join(args) + sargs+=", session" + defaults = argspec.defaults + if not defaults: + defaults = (None,) + else: + defaults += (None,) evaldict = caller.func_globals.copy() evaldict['_call_'] = func evaldict['decorator'] = wrapper wrap = FunctionMaker.create( '%s(%s)' % (caller.__name__, sargs), 'return decorator(_call_, %s)' % sargs, - evaldict, defaults=argspec.defaults, undecorated=caller, __wrapped__=caller, + evaldict, defaults=defaults, undecorated=caller, __wrapped__=caller, doc=caller.__doc__, module=caller.__module__, addsource=True) return wrap diff -r c6896c3374c4 -r ff8448fb07e7 iro/model/pool.py --- a/iro/model/pool.py Mon Feb 13 18:00:27 2012 +0100 +++ b/iro/model/pool.py Mon Feb 13 19:50:01 2012 +0100 @@ -1,5 +1,5 @@ from decorator import decorator - +import sqlalchemy class Data: def __init__(self): self.pool = None @@ -13,6 +13,9 @@ @decorator def runInDBPool(f,*args,**kwargs): """Decorator to run DB queries in Twisted's thread pool""" - return data.pool.run(f, *args, **kwargs) + if isinstance(args[-1],sqlalchemy.orm.session.Session): + return f(*args,**kwargs) + else: + return data.pool.run(f, *args, **kwargs)