runInDBThread and dbdefer can now handle if a valid session is an arg devel
authorSandro Knauß <knauss@netzguerilla.net>
Mon, 13 Feb 2012 19:50:01 +0100
branchdevel
changeset 151 ff8448fb07e7
parent 150 c6896c3374c4
child 152 14c99c89edf4
runInDBThread and dbdefer can now handle if a valid session is an arg
iro/model/dbdefer.py
iro/model/pool.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
 
--- 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)