iro/model/dbdefer.py
branchdevel
changeset 151 ff8448fb07e7
parent 123 2d685c3c10b2
child 155 ff1edf7c1329
equal deleted inserted replaced
150:c6896c3374c4 151:ff8448fb07e7
     1 from decorator import FunctionMaker
     1 from decorator import FunctionMaker
       
     2 import sqlalchemy
     2 
     3 
     3 from .pool import runInDBPool
     4 from .pool import runInDBPool
     4 from .utils import WithSession
     5 from .utils import WithSession
     5 
     6 
     6 import inspect
     7 import inspect
    12         self.engine = engine
    13         self.engine = engine
    13 
    14 
    14     def __call__(self, func):
    15     def __call__(self, func):
    15         @runInDBPool
    16         @runInDBPool
    16         def wrapper(func,*a, **kw):
    17         def wrapper(func,*a, **kw):
    17             pos = argspec.args.index("session")
    18             i = argspec.args.index("session")
    18             ab=list(a[:pos])
    19             ab = a[:i]
    19             ae=list(a[pos:])
    20             ae = a[i:-1]
    20             with WithSession(self.engine, self.autocommit) as session:
    21             if isinstance(a[-1],sqlalchemy.orm.session.Session):
    21                 al = ab+[session]+ae
    22                 al = ab + (a[-1],) + ae
    22                 return func(*al, **kw)
    23                 ret = func(*al, **kw)
       
    24                 if self.autocommit:
       
    25                     a[-1].commit()
       
    26                 return ret
       
    27             else:
       
    28                 with WithSession(self.engine, self.autocommit) as session:
       
    29                     al = ab + (session,) + ae
       
    30                     return func(*al, **kw)
    23 
    31 
    24         caller=func
    32         caller=func
    25         argspec = inspect.getargspec(caller)
    33         argspec = inspect.getargspec(caller)
    26         args =[i for i in argspec.args if i != "session" ]
    34         args =[i for i in argspec.args if i != "session" ]
    27         sargs=", ".join(args)        
    35         sargs=", ".join(args)        
       
    36         sargs+=", session"
       
    37         defaults = argspec.defaults
       
    38         if not defaults:
       
    39             defaults = (None,)
       
    40         else:
       
    41             defaults += (None,)
    28         evaldict = caller.func_globals.copy()
    42         evaldict = caller.func_globals.copy()
    29         evaldict['_call_'] = func
    43         evaldict['_call_'] = func
    30         evaldict['decorator'] = wrapper
    44         evaldict['decorator'] = wrapper
    31         wrap = FunctionMaker.create(
    45         wrap = FunctionMaker.create(
    32               '%s(%s)' % (caller.__name__, sargs), 
    46               '%s(%s)' % (caller.__name__, sargs), 
    33               'return decorator(_call_, %s)' % sargs,
    47               'return decorator(_call_, %s)' % sargs,
    34               evaldict, defaults=argspec.defaults, undecorated=caller, __wrapped__=caller,
    48               evaldict, defaults=defaults, undecorated=caller, __wrapped__=caller,
    35               doc=caller.__doc__, module=caller.__module__, addsource=True)
    49               doc=caller.__doc__, module=caller.__module__, addsource=True)
    36         return wrap
    50         return wrap
    37 
    51 
    38 dbdefer=DBDefer(None)
    52 dbdefer=DBDefer(None)
    39 
    53