iro/model/dbdefer.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 27 Jan 2012 21:21:41 +0100
branchdevel
changeset 117 351a02310dd8
child 123 2d685c3c10b2
permissions -rw-r--r--
model restructuring
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
117
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
from decorator import FunctionMaker
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     2
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
from .pool import runInDBPool
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     4
from .utils import WithSession
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
import inspect
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     7
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     8
class DBDefer(object):
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
    '''a twisted sqlalchemy connector this Decorator adds a session parameter, with a valid session connection'''
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
    def __init__(self, engine, autocommit=False):
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
        self.autocommit=autocommit
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
        self.engine = engine
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
    def __call__(self, func):
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    15
        @runInDBPool
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    16
        def wrapper(func,*args, **kwargs):
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    17
            with WithSession(self.engine, self.autocommit) as session:
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    18
                return func(*args, session=session, **kwargs)
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    19
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    20
        caller=func
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    21
        args =[i for i in inspect.getargspec(caller)[0] if i != "session" ]
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
        sargs=", ".join(args)        
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
        evaldict = caller.func_globals.copy()
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
        evaldict['_call_'] = func
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
        evaldict['decorator'] = wrapper
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
        wrap = FunctionMaker.create(
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
              '%s(%s)' % (caller.__name__, sargs), 
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
              'return decorator(_call_, %s)' % sargs,
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
              evaldict, undecorated=caller, __wrapped__=caller,
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
              doc=caller.__doc__, module=caller.__module__, addsource=True)
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
        return wrap
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
dbdefer=DBDefer(None)
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
def setEngine(engine,autocommit=False): 
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
    dbdefer.engine = engine
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
    dbdefer.autocommit = autocommit
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39