iro/model/dbdefer.py
branchdevel
changeset 123 2d685c3c10b2
parent 117 351a02310dd8
child 151 ff8448fb07e7
equal deleted inserted replaced
122:b55754aa4f96 123:2d685c3c10b2
    11         self.autocommit=autocommit
    11         self.autocommit=autocommit
    12         self.engine = engine
    12         self.engine = engine
    13 
    13 
    14     def __call__(self, func):
    14     def __call__(self, func):
    15         @runInDBPool
    15         @runInDBPool
    16         def wrapper(func,*args, **kwargs):
    16         def wrapper(func,*a, **kw):
       
    17             pos = argspec.args.index("session")
       
    18             ab=list(a[:pos])
       
    19             ae=list(a[pos:])
    17             with WithSession(self.engine, self.autocommit) as session:
    20             with WithSession(self.engine, self.autocommit) as session:
    18                 return func(*args, session=session, **kwargs)
    21                 al = ab+[session]+ae
       
    22                 return func(*al, **kw)
    19 
    23 
    20         caller=func
    24         caller=func
    21         args =[i for i in inspect.getargspec(caller)[0] if i != "session" ]
    25         argspec = inspect.getargspec(caller)
       
    26         args =[i for i in argspec.args if i != "session" ]
    22         sargs=", ".join(args)        
    27         sargs=", ".join(args)        
    23         evaldict = caller.func_globals.copy()
    28         evaldict = caller.func_globals.copy()
    24         evaldict['_call_'] = func
    29         evaldict['_call_'] = func
    25         evaldict['decorator'] = wrapper
    30         evaldict['decorator'] = wrapper
    26         wrap = FunctionMaker.create(
    31         wrap = FunctionMaker.create(
    27               '%s(%s)' % (caller.__name__, sargs), 
    32               '%s(%s)' % (caller.__name__, sargs), 
    28               'return decorator(_call_, %s)' % sargs,
    33               'return decorator(_call_, %s)' % sargs,
    29               evaldict, undecorated=caller, __wrapped__=caller,
    34               evaldict, defaults=argspec.defaults, undecorated=caller, __wrapped__=caller,
    30               doc=caller.__doc__, module=caller.__module__, addsource=True)
    35               doc=caller.__doc__, module=caller.__module__, addsource=True)
    31         return wrap
    36         return wrap
    32 
    37 
    33 dbdefer=DBDefer(None)
    38 dbdefer=DBDefer(None)
    34 
    39