iro/model/utils.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 26 Jan 2012 01:21:32 +0100
branchdevel
changeset 112 ea437d1e7b65
parent 107 f11520354165
child 114 1ed072cc6793
permissions -rw-r--r--
reactor is now started my iro.main
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
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     3
from twisted.internet import threads
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
     4
from twisted.python.threadpool import ThreadPool
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
     5
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
     6
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
     7
112
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
     8
class Data:
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
     9
    def __init__(self):
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    10
        self.pool =  ThreadPool(minthreads=1, maxthreads=POOL_SIZE, name='database')
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    11
        self.reactor = None
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    12
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    13
d = Data()
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    14
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    15
def startPool(reactor): 
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    16
    d.pool.start()
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    17
    d.reactor = reactor
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    18
    d.reactor.addSystemEventTrigger('before', 'shutdown', d.pool.stop)
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    19
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    20
def run_in_db_thread(f):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    21
    """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
    22
    def wrapper(*args, **kwargs):
112
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    23
        return threads.deferToThreadPool(d.reactor, d.pool, f, *args, **kwargs)
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    24
    return wrapper
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    25
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    26
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    27
class WithSession(object):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    28
    '''a with statement for a database session connection'''
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    29
    def __init__(self, engine, autocommit=False):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    30
        self.engine = engine
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
        self.autocommit=autocommit
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    32
    
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
    def __enter__(self):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    34
        self.session = sessionmaker(bind=self.engine)()
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
        return self.session
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
    
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
    def __exit__(self,exc_type, exc_value, traceback):
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
        if exc_type is None:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
            if self.autocommit:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
                self.session.commit()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
        else:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
            self.session.rollback()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
        self.session.close()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    45
class DBDefer(object):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    46
    '''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
    47
    def __init__(self, engine, autocommit=False):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    48
        self.autocommit=autocommit
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    49
        self.engine = engine
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    50
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    51
    def __call__(self, func):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    52
        @run_in_db_thread
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    53
        def wrapper(*args, **kwargs):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    54
            with WithSession(self.engine, self.autocommit) as session:
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    55
                return func(*args, session=session, **kwargs)
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    56
        return wrapper