|
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 |