iro/model/dbdefer.py
author Sandro Knauß <knauss@netzguerilla.net>
Mon, 13 Feb 2012 15:38:50 +0100
branchdevel
changeset 144 1cc164bbb068
parent 123 2d685c3c10b2
child 151 ff8448fb07e7
permissions -rw-r--r--
adding reload tests (not implemented)
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
123
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    16
        def wrapper(func,*a, **kw):
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    17
            pos = argspec.args.index("session")
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    18
            ab=list(a[:pos])
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    19
            ae=list(a[pos:])
117
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    20
            with WithSession(self.engine, self.autocommit) as session:
123
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    21
                al = ab+[session]+ae
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    22
                return func(*al, **kw)
117
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
        caller=func
123
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    25
        argspec = inspect.getargspec(caller)
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    26
        args =[i for i in argspec.args if i != "session" ]
117
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
        sargs=", ".join(args)        
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
        evaldict = caller.func_globals.copy()
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
        evaldict['_call_'] = func
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
        evaldict['decorator'] = wrapper
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
        wrap = FunctionMaker.create(
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
              '%s(%s)' % (caller.__name__, sargs), 
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
              'return decorator(_call_, %s)' % sargs,
123
2d685c3c10b2 dbdefer now can handle session argument on different positions
Sandro Knauß <knauss@netzguerilla.net>
parents: 117
diff changeset
    34
              evaldict, defaults=argspec.defaults, undecorated=caller, __wrapped__=caller,
117
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
              doc=caller.__doc__, module=caller.__module__, addsource=True)
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
        return wrap
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
dbdefer=DBDefer(None)
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
def setEngine(engine,autocommit=False): 
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
    dbdefer.engine = engine
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
    dbdefer.autocommit = autocommit
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
351a02310dd8 model restructuring
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44