equal
deleted
inserted
replaced
1 from sqlalchemy.orm import sessionmaker |
1 from sqlalchemy.orm import sessionmaker |
2 |
|
3 from twisted.internet import threads |
|
4 from twisted.python.threadpool import ThreadPool |
|
5 |
|
6 from functools import wraps |
|
7 |
|
8 POOL_SIZE=5 #how many threads should the db connector pool should have |
|
9 |
|
10 class Data: |
|
11 def __init__(self): |
|
12 self.pool = ThreadPool(minthreads=1, maxthreads=POOL_SIZE, name='database') |
|
13 self.reactor = None |
|
14 |
|
15 d = Data() |
|
16 |
|
17 def startPool(reactor): |
|
18 d.pool.start() |
|
19 d.reactor = reactor |
|
20 d.reactor.addSystemEventTrigger('before', 'shutdown', d.pool.stop) |
|
21 |
|
22 def run_in_db_thread(f): |
|
23 """Decorator to run DB queries in Twisted's thread pool""" |
|
24 @wraps(f) |
|
25 def wrapper(*args, **kwargs): |
|
26 return threads.deferToThreadPool(d.reactor, d.pool, f, *args, **kwargs) |
|
27 return wrapper |
|
28 |
|
29 |
2 |
30 class WithSession(object): |
3 class WithSession(object): |
31 '''a with statement for a database session connection''' |
4 '''a with statement for a database session connection''' |
32 def __init__(self, engine, autocommit=False): |
5 def __init__(self, engine, autocommit=False): |
33 self.engine = engine |
6 self.engine = engine |
43 self.session.commit() |
16 self.session.commit() |
44 else: |
17 else: |
45 self.session.rollback() |
18 self.session.rollback() |
46 self.session.close() |
19 self.session.close() |
47 |
20 |
48 class DBDefer(object): |
|
49 '''a twisted sqlalchemy connector this Decorator adds a session parameter, with a valid session connection''' |
|
50 def __init__(self, engine, autocommit=False): |
|
51 self.autocommit=autocommit |
|
52 self.engine = engine |
|
53 |
21 |
54 def __call__(self, func): |
|
55 @run_in_db_thread |
|
56 @wraps(func) |
|
57 def wrapper(*args, **kwargs): |
|
58 with WithSession(self.engine, self.autocommit) as session: |
|
59 return func(*args, session=session, **kwargs) |
|
60 return wrapper |
|
61 |
22 |
62 def vTyp(value,field): |
|
63 return value |
|