diff -r 48c70425bf6c -r 351a02310dd8 iro/model/dbdefer.py --- /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 + +