--- 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
--- 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)