iro/model/utils.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 27 Jan 2012 17:49:57 +0100
branchdevel
changeset 115 323d06431100
parent 114 1ed072cc6793
child 117 351a02310dd8
permissions -rw-r--r--
restructering validate
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
114
1ed072cc6793 reconstructing validate decorator
Sandro Knauß <knauss@netzguerilla.net>
parents: 112
diff changeset
     6
from functools import wraps
1ed072cc6793 reconstructing validate decorator
Sandro Knauß <knauss@netzguerilla.net>
parents: 112
diff changeset
     7
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
     8
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
     9
112
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    10
class Data:
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    11
    def __init__(self):
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    12
        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
    13
        self.reactor = None
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
d = Data()
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    16
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    17
def startPool(reactor): 
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    18
    d.pool.start()
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    19
    d.reactor = reactor
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    20
    d.reactor.addSystemEventTrigger('before', 'shutdown', d.pool.stop)
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    21
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    22
def run_in_db_thread(f):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    23
    """Decorator to run DB queries in Twisted's thread pool"""
114
1ed072cc6793 reconstructing validate decorator
Sandro Knauß <knauss@netzguerilla.net>
parents: 112
diff changeset
    24
    @wraps(f)
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    25
    def wrapper(*args, **kwargs):
112
ea437d1e7b65 reactor is now started my iro.main
Sandro Knauß <knauss@netzguerilla.net>
parents: 107
diff changeset
    26
        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
    27
    return wrapper
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    28
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    29
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    30
class WithSession(object):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    31
    '''a with statement for a database session connection'''
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    32
    def __init__(self, engine, autocommit=False):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    33
        self.engine = engine
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
        self.autocommit=autocommit
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    35
    
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
    def __enter__(self):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    37
        self.session = sessionmaker(bind=self.engine)()
92
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
        return self.session
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
    
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
    def __exit__(self,exc_type, exc_value, traceback):
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
        if exc_type is None:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
            if self.autocommit:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
                self.session.commit()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
        else:
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    45
            self.session.rollback()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    46
        self.session.close()
f479738b4879 umbau zu MVC
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    47
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    48
class DBDefer(object):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    49
    '''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
    50
    def __init__(self, engine, autocommit=False):
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    51
        self.autocommit=autocommit
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    52
        self.engine = engine
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    53
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    54
    def __call__(self, func):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    55
        @run_in_db_thread
114
1ed072cc6793 reconstructing validate decorator
Sandro Knauß <knauss@netzguerilla.net>
parents: 112
diff changeset
    56
        @wraps(func)
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    57
        def wrapper(*args, **kwargs):
107
f11520354165 controller.database -> model.utils
Sandro Knauß <knauss@netzguerilla.net>
parents: 106
diff changeset
    58
            with WithSession(self.engine, self.autocommit) as session:
96
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    59
                return func(*args, session=session, **kwargs)
883b25b0b760 using nonblocking api for sqlalchemy
Sandro Knauß <knauss@netzguerilla.net>
parents: 93
diff changeset
    60
        return wrapper
115
323d06431100 restructering validate
Sandro Knauß <knauss@netzguerilla.net>
parents: 114
diff changeset
    61
323d06431100 restructering validate
Sandro Knauß <knauss@netzguerilla.net>
parents: 114
diff changeset
    62
def vTyp(value,field):
323d06431100 restructering validate
Sandro Knauß <knauss@netzguerilla.net>
parents: 114
diff changeset
    63
    return value