iro/model/dbdefer.py
branchdevel
changeset 117 351a02310dd8
child 123 2d685c3c10b2
equal deleted inserted replaced
116:48c70425bf6c 117:351a02310dd8
       
     1 from decorator import FunctionMaker
       
     2 
       
     3 from .pool import runInDBPool
       
     4 from .utils import WithSession
       
     5 
       
     6 import inspect
       
     7 
       
     8 class DBDefer(object):
       
     9     '''a twisted sqlalchemy connector this Decorator adds a session parameter, with a valid session connection'''
       
    10     def __init__(self, engine, autocommit=False):
       
    11         self.autocommit=autocommit
       
    12         self.engine = engine
       
    13 
       
    14     def __call__(self, func):
       
    15         @runInDBPool
       
    16         def wrapper(func,*args, **kwargs):
       
    17             with WithSession(self.engine, self.autocommit) as session:
       
    18                 return func(*args, session=session, **kwargs)
       
    19 
       
    20         caller=func
       
    21         args =[i for i in inspect.getargspec(caller)[0] if i != "session" ]
       
    22         sargs=", ".join(args)        
       
    23         evaldict = caller.func_globals.copy()
       
    24         evaldict['_call_'] = func
       
    25         evaldict['decorator'] = wrapper
       
    26         wrap = FunctionMaker.create(
       
    27               '%s(%s)' % (caller.__name__, sargs), 
       
    28               'return decorator(_call_, %s)' % sargs,
       
    29               evaldict, undecorated=caller, __wrapped__=caller,
       
    30               doc=caller.__doc__, module=caller.__module__, addsource=True)
       
    31         return wrap
       
    32 
       
    33 dbdefer=DBDefer(None)
       
    34 
       
    35 def setEngine(engine,autocommit=False): 
       
    36     dbdefer.engine = engine
       
    37     dbdefer.autocommit = autocommit
       
    38 
       
    39