# HG changeset patch # User Sandro Knauß # Date 1326172286 -3600 # Node ID aa6eb84d96ce53683248885e64c62111f0d55e7f # Parent a60d344e28b4f1aaafb0ba795f0b719a6b4f79f5# Parent 883b25b0b7603c1ff7b6e4afc148ecedfc7365a3 merging diff -r a60d344e28b4 -r aa6eb84d96ce iro/controller/database.py --- 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 diff -r a60d344e28b4 -r aa6eb84d96ce iro/controller/user.py --- 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