iro/controller/database.py
author Sandro Knauß <knauss@netzguerilla.net>
Sun, 22 Jan 2012 02:36:12 +0100
branchdevel
changeset 102 85ac86f7ffc4
parent 96 883b25b0b760
child 106 d2992f011930
permissions -rw-r--r--
reactor & sqlalchemy threadpools aufeinander abstimmen keine prints mehr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     1
from sqlalchemy import create_engine, pool
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     2
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
from sqlalchemy.orm import sessionmaker
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     4
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     5
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     6
from twisted.internet import threads
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     7
93
ee10253258ad now right relative imports
Sandro Knauß <knauss@netzguerilla.net>
parents: 92
diff changeset
     8
from ..model import Base
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
engine = create_engine('sqlite:///:memory:', echo=True)
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
def createDatabase():
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
    Base.metadata.create_all(engine)
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    15
Session = sessionmaker(bind=engine)
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    16
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    17
def toThread(f):
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    18
    def wrapper(*args, **kwargs):
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    19
        return threads.deferToThread(f, *args, **kwargs)
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    20
    return wrapper
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    21
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    22
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
class WithSession():
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
    def __init__(self,autocommit=False):
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
        self.autocommit=autocommit
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    26
    
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
    def __enter__(self):
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
        self.conn = engine.connect()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
        self.session = Session(bind=self.conn)
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
        return self.session
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
    
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
    def __exit__(self,exc_type, exc_value, traceback):
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
        if exc_type is None:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
            if self.autocommit:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
                self.session.commit()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
        else:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
            self.session.rollback()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
        self.session.close()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
        self.conn.close()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    41
class DBDefer(object):
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    42
    def __init__(self, dsn, poolclass = pool.SingletonThreadPool, *args, **kargs):
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    43
        self.engine = create_engine(dsn, poolclass=poolclass, *args, **kargs)
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    44
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    45
    def __call__(self, func):
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    46
        @toThread
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    47
        def wrapper(*args, **kwargs):
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    48
            session = sessionmaker(bind=self.engine)()
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    49
            try:
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    50
                return func(*args, session=session, **kwargs)
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    51
            except:
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    52
                session.rollback()
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    53
                raise
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    54
            finally:
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    55
                session.close()
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    56
        return wrapper