iro/model/utils.py
author Sandro Knauß <knauss@netzguerilla.net>
Sun, 22 Jan 2012 23:29:18 +0100
branchdevel
changeset 107 f11520354165
parent 106 iro/controller/database.py@d2992f011930
child 112 ea437d1e7b65
permissions -rw-r--r--
controller.database -> model.utils cleaning up model.utils documenting model.utils
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
from sqlalchemy.orm import sessionmaker
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     2
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
     3
from twisted.internet import reactor
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     4
from twisted.internet import threads
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
     5
from twisted.python.threadpool import ThreadPool
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     6
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
     7
POOL_SIZE=5     #how many threads should the db connector pool should have
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     8
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
     9
dbpool = ThreadPool(minthreads=1, maxthreads=POOL_SIZE, name='database')
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    10
dbpool.start()
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    11
reactor.addSystemEventTrigger('before', 'shutdown', dbpool.stop)
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    13
def run_in_db_thread(f):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    14
    """Decorator to run DB queries in Twisted's thread pool"""
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    15
    def wrapper(*args, **kwargs):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    16
        return threads.deferToThreadPool(reactor, dbpool,f, *args, **kwargs)
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    17
    return wrapper
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    18
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    19
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    20
class WithSession(object):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    21
    '''a with statement for a database session connection'''
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    22
    def __init__(self, engine, autocommit=False):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    23
        self.engine = engine
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
        self.autocommit=autocommit
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    25
    
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
    def __enter__(self):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    27
        self.session = sessionmaker(bind=self.engine)()
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
        return self.session
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
    
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
    def __exit__(self,exc_type, exc_value, traceback):
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
        if exc_type is None:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
            if self.autocommit:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
                self.session.commit()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
        else:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
            self.session.rollback()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
        self.session.close()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    38
class DBDefer(object):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    39
    '''a twisted sqlalchemy connector this Decorator adds a session parameter, with a valid session connection'''
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    40
    def __init__(self, engine, autocommit=False):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    41
        self.autocommit=autocommit
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    42
        self.engine = engine
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    43
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    44
    def __call__(self, func):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    45
        @run_in_db_thread
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    46
        def wrapper(*args, **kwargs):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    47
            with WithSession(self.engine, self.autocommit) as session:
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    48
                return func(*args, session=session, **kwargs)
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    49
        return wrapper