repoapi.py
author Pierre-Yves David <pierre-yves.david@logilab.fr>
Thu, 27 Jun 2013 19:14:22 +0200
changeset 9124 d1d4b3669e41
parent 9116 57387c6482e5
child 9125 9aaf8472bad0
permissions -rw-r--r--
[testlib] deprecated the older api to access the repo.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9045
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     1
# copyright 2013-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
#
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
# This file is part of CubicWeb.
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
#
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     9
# any later version.
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    10
#
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    14
# details.
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    15
#
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    18
"""Official API to access the content of a repository
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    19
"""
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    20
from cubicweb.utils import parse_repo_uri
9062
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    21
from cubicweb import ConnectionError, ProgrammingError, AuthenticationError
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
    22
from uuid import uuid4
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
    23
from contextlib import contextmanager
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
    24
from cubicweb.req import RequestSessionBase
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
    25
from functools import wraps
9045
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    26
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    27
### private function for specific method ############################
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    28
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    29
def _get_inmemory_repo(config, vreg=None):
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    30
    from cubicweb.server.repository import Repository
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    31
    from cubicweb.server.utils import TasksManager
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    32
    return Repository(config, TasksManager(), vreg=vreg)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    33
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    34
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    35
### public API ######################################################
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    36
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    37
def get_repository(uri=None, config=None, vreg=None):
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    38
    """get a repository for the given URI or config/vregistry (in case we're
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    39
    loading the repository for a client, eg web server, configuration).
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    40
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    41
    The returned repository may be an in-memory repository or a proxy object
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    42
    using a specific RPC method, depending on the given URI (pyro or zmq).
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    43
    """
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    44
    if uri is None:
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    45
        return _get_inmemory_repo(config, vreg)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    46
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    47
    protocol, hostport, appid = parse_repo_uri(uri)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    48
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    49
    if protocol == 'inmemory':
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    50
        # me may have been called with a dummy 'inmemory://' uri ...
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    51
        return _get_inmemory_repo(config, vreg)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    52
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    53
    if protocol == 'pyroloc':  # direct connection to the instance
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    54
        from logilab.common.pyro_ext import get_proxy
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    55
        uri = uri.replace('pyroloc', 'PYRO')
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    56
        return get_proxy(uri)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    57
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    58
    if protocol == 'pyro':  # connection mediated through the pyro ns
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    59
        from logilab.common.pyro_ext import ns_get_proxy
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    60
        path = appid.strip('/')
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    61
        if not path:
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    62
            raise ConnectionError(
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    63
                "can't find instance name in %s (expected to be the path component)"
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    64
                % uri)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    65
        if '.' in path:
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    66
            nsgroup, nsid = path.rsplit('.', 1)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    67
        else:
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    68
            nsgroup = 'cubicweb'
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    69
            nsid = path
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    70
        return ns_get_proxy(nsid, defaultnsgroup=nsgroup, nshost=hostport)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    71
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    72
    if protocol.startswith('zmqpickle-'):
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    73
        from cubicweb.zmqclient import ZMQRepositoryClient
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    74
        return ZMQRepositoryClient(uri)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    75
    else:
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    76
        raise ConnectionError('unknown protocol: `%s`' % protocol)
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    77
9061
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    78
def connect(repo, login, **kwargs):
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    79
    """Take credential and return associated ClientConnection.
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    80
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    81
    The ClientConnection is associated to a new Session object that will be
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    82
    closed when the ClientConnection is closed.
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    83
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    84
    raise AuthenticationError if the credential are invalid."""
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    85
    sessionid = repo.connect(login, **kwargs)
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    86
    session = repo._get_session(sessionid)
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    87
    # XXX the autoclose_session should probably be handle on the session directly
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    88
    # this is something to consider once we have proper server side Connection.
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    89
    return ClientConnection(session, autoclose_session=True)
e86fdab3d296 [repoapi] add a connect function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9060
diff changeset
    90
9062
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    91
def anonymous_cnx(repo):
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    92
    """return a ClientConnection for Anonymous user.
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    93
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    94
    The ClientConnection is associated to a new Session object that will be
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    95
    closed when the ClientConnection is closed.
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    96
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    97
    raises an AuthenticationError if anonymous usage is not allowed
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    98
    """
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
    99
    anoninfo = getattr(repo.config, 'anonymous_user', lambda: None)()
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
   100
    if anoninfo is None: # no anonymous user
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
   101
        raise AuthenticationError('anonymous access is not authorized')
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
   102
    anon_login, anon_password = anoninfo
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
   103
    # use vreg's repository cache
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
   104
    return connect(repo, anon_login, password=anon_password)
fa5bc8aef7ed [repoapi] add an anonymous_cnx function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9061
diff changeset
   105
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   106
def _srv_cnx_func(name):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   107
    """Decorate ClientConnection method blindly forward to Connection
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   108
    THIS TRANSITIONAL PURPOSE
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   109
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   110
    will be dropped when we have standalone connection"""
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   111
    def proxy(clt_cnx, *args, **kwargs):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   112
        # the ``with`` dance is transitional. We do not have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   113
        # Connection yet so we use this trick to unsure the session have the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   114
        # proper cnx loaded. This can be simplified one we have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   115
        # Connection object
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   116
        if not clt_cnx._open:
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   117
            raise ProgrammingError('Closed client connection')
9101
e6d1df619949 [client-connection] remove the _srv_cnx usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9100
diff changeset
   118
        return getattr(clt_cnx._cnx, name)(*args, **kwargs)
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   119
    return proxy
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   120
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   121
def _open_only(func):
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   122
    """decorator for ClientConnection method that check it is open"""
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   123
    @wraps(func)
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   124
    def check_open(clt_cnx, *args, **kwargs):
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   125
        if not clt_cnx._open:
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   126
            raise ProgrammingError('Closed client connection')
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   127
        return func(clt_cnx, *args, **kwargs)
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   128
    return check_open
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   129
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   130
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   131
class ClientConnection(RequestSessionBase):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   132
    """A Connection object to be used Client side.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   133
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   134
    This object is aimed to be used client side (so potential communication
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   135
    with the repo through RTC) and aims to offer some compatibility with the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   136
    cubicweb.dbapi.Connection interface.
9060
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   137
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   138
    The autoclose_session paramenter informs the connection that this session
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   139
    have been open explictly and only for this client connection. The
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   140
    connection will close the session of exit.
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   141
    """
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   142
    # make exceptions available through the connection object
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   143
    ProgrammingError = ProgrammingError
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   144
    # attributes that may be overriden per connection instance
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   145
    anonymous_connection = False # XXX really needed ?
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   146
    is_repo_in_memory = True # BC, always true
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   147
9060
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   148
    def __init__(self, session, autoclose_session=False):
9096
9d1b5f07d9ca [ClientConnection] directly use the Connection object to access the database
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9062
diff changeset
   149
        self._session = session # XXX there is no real reason to keep the
9d1b5f07d9ca [ClientConnection] directly use the Connection object to access the database
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9062
diff changeset
   150
                                # session around function still using it should
9d1b5f07d9ca [ClientConnection] directly use the Connection object to access the database
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9062
diff changeset
   151
                                # be rewritten and migrated.
9d1b5f07d9ca [ClientConnection] directly use the Connection object to access the database
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9062
diff changeset
   152
        self._cnx = None
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   153
        self._open = None
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   154
        self._web_request = False
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   155
        self.vreg = session.vreg
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   156
        self._set_user(session.user)
9060
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   157
        self._autoclose_session = autoclose_session
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   158
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   159
    def __enter__(self):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   160
        assert self._open is None
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   161
        self._open = True
9111
9c867d852067 use standalone Connection to Client Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9105
diff changeset
   162
        self._cnx = self._session.new_cnx()
9c867d852067 use standalone Connection to Client Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9105
diff changeset
   163
        self._cnx.__enter__()
9096
9d1b5f07d9ca [ClientConnection] directly use the Connection object to access the database
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9062
diff changeset
   164
        self._cnx.ctx_count += 1
9116
57387c6482e5 [repoapi] make ClientConnection.__enter__ return self
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9111
diff changeset
   165
        return self
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   166
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   167
    def __exit__(self, exc_type, exc_val, exc_tb):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   168
        self._open = False
9096
9d1b5f07d9ca [ClientConnection] directly use the Connection object to access the database
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9062
diff changeset
   169
        self._cnx.ctx_count -= 1
9111
9c867d852067 use standalone Connection to Client Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9105
diff changeset
   170
        self._cnx.__exit__(exc_type, exc_val, exc_tb)
9096
9d1b5f07d9ca [ClientConnection] directly use the Connection object to access the database
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9062
diff changeset
   171
        self._cnx = None
9060
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   172
        if self._autoclose_session:
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   173
            # we have to call repo.close to unsure the repo properly forget the
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   174
            # session calling session.close() is not enought :-(
8c0016d7a091 [client-connection] add an auto-close property for ClientConnection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9058
diff changeset
   175
            self._session.repo.close(self._session.id)
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   176
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   177
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   178
    # begin silly BC
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   179
    @property
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   180
    def _closed(self):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   181
        return not self._open
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   182
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   183
    def close(self):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   184
        if self._open:
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   185
            self.__exit__(None, None, None)
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   186
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   187
    def __repr__(self):
9099
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   188
        # XXX we probably want to reference the user of the session here
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   189
        if self._open is None:
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   190
            return '<ClientConnection (not open yet)>'
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   191
        elif not self._open:
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   192
            return '<ClientConnection (closed)>'
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   193
        elif self.anonymous_connection:
9097
39be1e548270 [client-connection] explicit the client part in __repr__
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9096
diff changeset
   194
            return '<ClientConnection %s (anonymous)>' % self._cnx.connectionid
9099
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   195
        else:
b7f7aa1b1123 [client-connection] handle the lack of connection id while not open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9098
diff changeset
   196
            return '<ClientConnection %s>' % self._cnx.connectionid
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   197
    # end silly BC
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   198
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   199
    # Main Connection purpose in life #########################################
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   200
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   201
    call_service = _srv_cnx_func('call_service')
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   202
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   203
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   204
    def execute(self, *args, **kwargs):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   205
        # the ``with`` dance is transitional. We do not have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   206
        # Connection yet so we use this trick to unsure the session have the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   207
        # proper cnx loaded. This can be simplified one we have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   208
        # Connection object
9101
e6d1df619949 [client-connection] remove the _srv_cnx usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9100
diff changeset
   209
        rset = self._cnx.execute(*args, **kwargs)
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   210
        rset.req = self
9058
2f45e99ad753 [client-connect] drop rqlst on rset returned client side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9057
diff changeset
   211
        # XXX keep the same behavior as the old dbapi
2f45e99ad753 [client-connect] drop rqlst on rset returned client side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9057
diff changeset
   212
        # otherwise multiple tests break.
2f45e99ad753 [client-connect] drop rqlst on rset returned client side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9057
diff changeset
   213
        # The little internet kitten is very sad about this situation.
2f45e99ad753 [client-connect] drop rqlst on rset returned client side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9057
diff changeset
   214
        rset._rqlst = None
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   215
        return rset
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   216
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   217
    commit = _srv_cnx_func('commit')
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   218
    rollback = _srv_cnx_func('rollback')
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   219
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   220
    # session data methods #####################################################
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   221
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   222
    get_shared_data = _srv_cnx_func('get_shared_data')
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   223
    set_shared_data = _srv_cnx_func('set_shared_data')
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   224
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   225
    # meta-data accessors ######################################################
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   226
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   227
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   228
    def source_defs(self):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   229
        """Return the definition of sources used by the repository."""
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   230
        return self._session.repo.source_defs()
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   231
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   232
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   233
    def get_schema(self):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   234
        """Return the schema currently used by the repository."""
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   235
        return self._session.repo.source_defs()
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   236
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   237
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   238
    def get_option_value(self, option, foreid=None):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   239
        """Return the value for `option` in the configuration. If `foreid` is
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   240
        specified, the actual repository to which this entity belongs is
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   241
        dereferenced and the option value retrieved from it.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   242
        """
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   243
        return self._session.repo.get_option_value(option, foreid)
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   244
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   245
    describe = _srv_cnx_func('describe')
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   246
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   247
    # undo support ############################################################
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   248
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   249
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   250
    def undoable_transactions(self, ueid=None, req=None, **actionfilters):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   251
        """Return a list of undoable transaction objects by the connection's
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   252
        user, ordered by descendant transaction time.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   253
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   254
        Managers may filter according to user (eid) who has done the transaction
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   255
        using the `ueid` argument. Others will only see their own transactions.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   256
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   257
        Additional filtering capabilities is provided by using the following
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   258
        named arguments:
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   259
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   260
        * `etype` to get only transactions creating/updating/deleting entities
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   261
          of the given type
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   262
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   263
        * `eid` to get only transactions applied to entity of the given eid
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   264
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   265
        * `action` to get only transactions doing the given action (action in
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   266
          'C', 'U', 'D', 'A', 'R'). If `etype`, action can only be 'C', 'U' or
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   267
          'D'.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   268
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   269
        * `public`: when additional filtering is provided, their are by default
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   270
          only searched in 'public' actions, unless a `public` argument is given
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   271
          and set to false.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   272
        """
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   273
        # the ``with`` dance is transitional. We do not have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   274
        # Connection yet so we use this trick to unsure the session have the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   275
        # proper cnx loaded. This can be simplified one we have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   276
        # Connection object
9101
e6d1df619949 [client-connection] remove the _srv_cnx usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9100
diff changeset
   277
        source = self._cnx.repo.system_source
e6d1df619949 [client-connection] remove the _srv_cnx usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9100
diff changeset
   278
        txinfos = source.undoable_transactions(self._cnx, ueid, **actionfilters)
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   279
        for txinfo in txinfos:
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   280
            txinfo.req = req or self  # XXX mostly wrong
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   281
        return txinfos
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   282
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   283
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   284
    def transaction_info(self, txuuid, req=None):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   285
        """Return transaction object for the given uid.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   286
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   287
        raise `NoSuchTransaction` if not found or if session's user is not
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   288
        allowed (eg not in managers group and the transaction doesn't belong to
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   289
        him).
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   290
        """
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   291
        # the ``with`` dance is transitional. We do not have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   292
        # Connection yet so we use this trick to unsure the session have the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   293
        # proper cnx loaded. This can be simplified one we have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   294
        # Connection object
9101
e6d1df619949 [client-connection] remove the _srv_cnx usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9100
diff changeset
   295
        txinfo = self._cnx.repo.system_source.tx_info(self._cnx, txuuid)
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   296
        if req:
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   297
            txinfo.req = req
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   298
        else:
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   299
            txinfo.cnx = self
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   300
        return txinfo
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   301
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   302
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   303
    def transaction_actions(self, txuuid, public=True):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   304
        """Return an ordered list of action effectued during that transaction.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   305
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   306
        If public is true, return only 'public' actions, eg not ones triggered
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   307
        under the cover by hooks, else return all actions.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   308
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   309
        raise `NoSuchTransaction` if the transaction is not found or if
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   310
        session's user is not allowed (eg not in managers group and the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   311
        transaction doesn't belong to him).
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   312
        """
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   313
        # the ``with`` dance is transitional. We do not have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   314
        # Connection yet so we use this trick to unsure the session have the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   315
        # proper cnx loaded. This can be simplified one we have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   316
        # Connection object
9101
e6d1df619949 [client-connection] remove the _srv_cnx usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9100
diff changeset
   317
        return self._cnx.repo.system_source.tx_actions(self._cnx, txuuid, public)
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   318
9100
8a1132c7cbd1 [client-connection] explicitly check that the client-connection is open
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9099
diff changeset
   319
    @_open_only
9052
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   320
    def undo_transaction(self, txuuid):
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   321
        """Undo the given transaction. Return potential restoration errors.
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   322
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   323
        raise `NoSuchTransaction` if not found or if session's user is not
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   324
        allowed (eg not in managers group and the transaction doesn't belong to
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   325
        him).
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   326
        """
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   327
        # the ``with`` dance is transitional. We do not have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   328
        # Connection yet so we use this trick to unsure the session have the
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   329
        # proper cnx loaded. This can be simplified one we have Standalone
4cba5f2cd57b [repoapi] introduce a basic ClientConnection class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
   330
        # Connection object
9101
e6d1df619949 [client-connection] remove the _srv_cnx usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9100
diff changeset
   331
        return self._cnx.repo.system_source.undo_transaction(self._cnx, txuuid)
9053
862040061173 [client-connection] add a request() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   332
862040061173 [client-connection] add a request() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   333
    def request(self):
862040061173 [client-connection] add a request() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   334
        # XXX This is DBAPI compatibility method. Deprecate it ASAP.
862040061173 [client-connection] add a request() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   335
        return self
9054
d7e78645dab6 [client-connection] add a cursor() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9053
diff changeset
   336
d7e78645dab6 [client-connection] add a cursor() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9053
diff changeset
   337
    def cursor(self):
d7e78645dab6 [client-connection] add a cursor() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9053
diff changeset
   338
        # XXX This is DBAPI compatibility method. Deprecate it ASAP.
d7e78645dab6 [client-connection] add a cursor() method for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9053
diff changeset
   339
        return self
9055
2567b7d04e49 [client-connection] add a sessionid property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9054
diff changeset
   340
2567b7d04e49 [client-connection] add a sessionid property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9054
diff changeset
   341
    @ property
2567b7d04e49 [client-connection] add a sessionid property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9054
diff changeset
   342
    def sessionid(self):
2567b7d04e49 [client-connection] add a sessionid property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9054
diff changeset
   343
        # XXX This is DBAPI compatibility property. Deprecate it ASAP.
2567b7d04e49 [client-connection] add a sessionid property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9054
diff changeset
   344
        return self._session.id
9056
e777be2c5007 [client-connection] add a connection property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9055
diff changeset
   345
e777be2c5007 [client-connection] add a connection property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9055
diff changeset
   346
    @property
e777be2c5007 [client-connection] add a connection property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9055
diff changeset
   347
    def connection(self):
e777be2c5007 [client-connection] add a connection property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9055
diff changeset
   348
        # XXX This is DBAPI compatibility property. Deprecate it ASAP.
e777be2c5007 [client-connection] add a connection property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9055
diff changeset
   349
        return self
9057
99cd4761aee6 [client-connection] add a repo property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9056
diff changeset
   350
99cd4761aee6 [client-connection] add a repo property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9056
diff changeset
   351
    @property
99cd4761aee6 [client-connection] add a repo property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9056
diff changeset
   352
    def _repo(self):
99cd4761aee6 [client-connection] add a repo property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9056
diff changeset
   353
        # XXX This is DBAPI compatibility property. Deprecate it ASAP.
99cd4761aee6 [client-connection] add a repo property for dbapi compatibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9056
diff changeset
   354
        return self._session.repo