iro/model/utils.py
branchdevel
changeset 117 351a02310dd8
parent 115 323d06431100
child 122 b55754aa4f96
equal deleted inserted replaced
116:48c70425bf6c 117:351a02310dd8
     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