merging devel
authorSandro Knauß <knauss@netzguerilla.net>
Tue, 10 Jan 2012 06:11:26 +0100
branchdevel
changeset 99 aa6eb84d96ce
parent 98 a60d344e28b4 (current diff)
parent 96 883b25b0b760 (diff)
child 100 2c94da9e7036
merging
--- a/iro/controller/database.py	Tue Jan 10 06:10:57 2012 +0100
+++ b/iro/controller/database.py	Tue Jan 10 06:11:26 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
--- a/iro/controller/user.py	Tue Jan 10 06:10:57 2012 +0100
+++ b/iro/controller/user.py	Tue Jan 10 06:11:26 2012 +0100
@@ -1,7 +1,5 @@
-import logging
 import re
 
-from .database import WithSession
 from ..model import User
 
 from ..error import UserNotFound, InterfaceException, ValidateException
@@ -24,30 +22,31 @@
             
 
 @validate(userhash=rehash)
-def getuser(userhash):
-    with WithSession() as session:
-        user = session.query(User).filter_by(apikey=userhash).first()
-        if user is None:
-            raise UserNotFound()
-        else:
-            return user
+def getuser(userhash, session):
+    user = session.query(User).filter_by(apikey=userhash).first()
+    if user is None:
+        raise UserNotFound()
+    else:
+        return user
 
 def with_user(f):
     def new_f(*args,**kargs):
         args=list(args)
-        logging.debug("Entering %s"%f.__name__)
         try:
-            kargs["user"]=getuser(userhash = kargs["apikey"])
+            userhash = kargs["apikey"]
             del kargs["apikey"]
         except KeyError:
             try:
-                kargs["user"]=getuser(userhash = args[1])
+                userhash = args[1]
+                del args[1]
             except IndexError:
                 raise InterfaceException() 
-            del args[1]
-        ret=f(*args,**kargs)
-        logging.debug("Exited %s"%f.__name__)
-        return ret
+        
+        def _gotResult(_user):
+            kargs["user"]=_user
+            return f(*args,**kargs)
+        return getuser(userhash=userhash).addCallback(_gotResult)
+
     new_f.__name__ = f.__name__
     return new_f