iro/controller/database.py
branchdevel
changeset 96 883b25b0b760
parent 93 ee10253258ad
child 102 85ac86f7ffc4
--- 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