--- 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
--- a/iro/controller/user.py Tue Jan 10 06:04:35 2012 +0100
+++ b/iro/controller/user.py Tue Jan 10 06:09:36 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