iro/model/dbdefer.py
branchdevel
changeset 117 351a02310dd8
child 123 2d685c3c10b2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/model/dbdefer.py	Fri Jan 27 21:21:41 2012 +0100
@@ -0,0 +1,39 @@
+from decorator import FunctionMaker
+
+from .pool import runInDBPool
+from .utils import WithSession
+
+import inspect
+
+class DBDefer(object):
+    '''a twisted sqlalchemy connector this Decorator adds a session parameter, with a valid session connection'''
+    def __init__(self, engine, autocommit=False):
+        self.autocommit=autocommit
+        self.engine = engine
+
+    def __call__(self, func):
+        @runInDBPool
+        def wrapper(func,*args, **kwargs):
+            with WithSession(self.engine, self.autocommit) as session:
+                return func(*args, session=session, **kwargs)
+
+        caller=func
+        args =[i for i in inspect.getargspec(caller)[0] if i != "session" ]
+        sargs=", ".join(args)        
+        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, undecorated=caller, __wrapped__=caller,
+              doc=caller.__doc__, module=caller.__module__, addsource=True)
+        return wrap
+
+dbdefer=DBDefer(None)
+
+def setEngine(engine,autocommit=False): 
+    dbdefer.engine = engine
+    dbdefer.autocommit = autocommit
+
+