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 |