diff -r d2992f011930 -r f11520354165 iro/model/utils.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/model/utils.py Sun Jan 22 23:29:18 2012 +0100 @@ -0,0 +1,49 @@ +from sqlalchemy.orm import sessionmaker + +from twisted.internet import reactor +from twisted.internet import threads +from twisted.python.threadpool import ThreadPool + +POOL_SIZE=5 #how many threads should the db connector pool should have + +dbpool = ThreadPool(minthreads=1, maxthreads=POOL_SIZE, name='database') +dbpool.start() +reactor.addSystemEventTrigger('before', 'shutdown', dbpool.stop) + +def run_in_db_thread(f): + """Decorator to run DB queries in Twisted's thread pool""" + def wrapper(*args, **kwargs): + return threads.deferToThreadPool(reactor, dbpool,f, *args, **kwargs) + return wrapper + + +class WithSession(object): + '''a with statement for a database session connection''' + def __init__(self, engine, autocommit=False): + self.engine = engine + self.autocommit=autocommit + + def __enter__(self): + self.session = sessionmaker(bind=self.engine)() + return self.session + + def __exit__(self,exc_type, exc_value, traceback): + if exc_type is None: + if self.autocommit: + self.session.commit() + else: + self.session.rollback() + self.session.close() + +class DBDefer(object): + '''a twisted sqlalchemy connector this Decorator adds a session parameter, with a valid session connection''' + def __init__(self, engine, autocommit=False): + self.autocommit=autocommit + self.engine = engine + + def __call__(self, func): + @run_in_db_thread + def wrapper(*args, **kwargs): + with WithSession(self.engine, self.autocommit) as session: + return func(*args, session=session, **kwargs) + return wrapper