diff -r 4349f10d77a6 -r 883b25b0b760 iro/controller/database.py --- a/iro/controller/database.py Tue Jan 10 06:04:35 2012 +0100 +++ b/iro/controller/database.py Tue Jan 10 06:09:36 2012 +0100 @@ -1,5 +1,10 @@ -from sqlalchemy import create_engine +from sqlalchemy import create_engine, pool + from sqlalchemy.orm import sessionmaker + + +from twisted.internet import threads + from ..model import Base engine = create_engine('sqlite:///:memory:', echo=True) @@ -9,10 +14,16 @@ Session = sessionmaker(bind=engine) +def toThread(f): + def wrapper(*args, **kwargs): + return threads.deferToThread(f, *args, **kwargs) + return wrapper + + class WithSession(): def __init__(self,autocommit=False): self.autocommit=autocommit - + def __enter__(self): self.conn = engine.connect() self.session = Session(bind=self.conn) @@ -27,3 +38,20 @@ self.session.close() self.conn.close() +class DBDefer(object): + def __init__(self, dsn, poolclass = pool.SingletonThreadPool, *args, **kargs): + self.engine = create_engine(dsn, poolclass=poolclass, *args, **kargs) + + def __call__(self, func): + @toThread + def wrapper(*args, **kwargs): + session = sessionmaker(bind=self.engine)() + try: + print func,args, kwargs + return func(*args, session=session, **kwargs) + except: + session.rollback() + raise + finally: + session.close() + return wrapper