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