dbapi.py
author Julien Cristau <julien.cristau@logilab.fr>
Fri, 20 Feb 2015 16:17:51 +0100
changeset 10317 b81adb5e32f9
parent 10236 ef3059a692cb
permissions -rw-r--r--
[web/views] add text/n3 rdf view Less shit than xml.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
     1
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5345
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    18
"""DB-API 2.0 compliant module
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
Take a look at http://www.python.org/peps/pep-0249.html
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
(most parts of this document are reported here in docstrings)
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
    23
"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    24
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
    27
from threading import currentThread
1132
96752791c2b6 pylint cleanup
sylvain.thenault@logilab.fr
parents: 322
diff changeset
    28
from logging import getLogger
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
from time import time, clock
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
    30
from itertools import count
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5100
diff changeset
    31
from warnings import warn
5507
3604c1c78295 [dbapi] missing import
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5500
diff changeset
    32
from os.path import join
7428
5338d895b891 [web session] fix session handling so we get a chance to have for instance the 'forgotpwd' feature working on a site where anonymous are not allowed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7140
diff changeset
    33
from uuid import uuid4
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
    34
from urlparse import  urlparse
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
1923
3802c2e37e72 handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1882
diff changeset
    36
from logilab.common.logging_ext import set_log_methods
9042
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
    37
from logilab.common.decorators import monkeypatch, cachedproperty
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
    38
from logilab.common.deprecation import deprecated
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    39
9046
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
    40
from cubicweb import (ETYPE_NAME_MAP, AuthenticationError, ProgrammingError,
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9045
diff changeset
    41
                      cwvreg, cwconfig)
9045
5378a738f333 [repoapi] move get_repository function into a new repoapi module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9042
diff changeset
    42
from cubicweb.repoapi import get_repository
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2770
diff changeset
    43
from cubicweb.req import RequestSessionBase
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2770
diff changeset
    44
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
    45
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
_MARKER = object()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
    48
def _fake_property_value(self, name):
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
    49
    try:
4716
55b6a3262071 fix some pylint detected errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4705
diff changeset
    50
        return super(DBAPIRequest, self).property_value(name)
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
    51
    except KeyError:
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
    52
        return ''
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
    53
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
    54
def fake(*args, **kwargs):
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
    55
    return None
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
    56
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    57
def multiple_connections_fix():
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    58
    """some monkey patching necessary when an application has to deal with
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    59
    several connections to different repositories. It tries to hide buggy class
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    60
    attributes since classes are not designed to be shared among multiple
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    61
    registries.
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    62
    """
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7962
diff changeset
    63
    defaultcls = cwvreg.CWRegistryStore.REGISTRY_FACTORY[None]
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    64
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7962
diff changeset
    65
    etypescls = cwvreg.CWRegistryStore.REGISTRY_FACTORY['etypes']
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    66
    orig_etype_class = etypescls.orig_etype_class = etypescls.etype_class
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    67
    @monkeypatch(defaultcls)
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    68
    def etype_class(self, etype):
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    69
        """return an entity class for the given entity type.
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    70
        Try to find out a specific class for this kind of entity or
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    71
        default to a dump of the class registered for 'Any'
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    72
        """
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    73
        usercls = orig_etype_class(self, etype)
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    74
        if etype == 'Any':
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    75
            return usercls
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    76
        usercls.e_schema = self.schema.eschema(etype)
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    77
        return usercls
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    78
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    79
def multiple_connections_unfix():
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7962
diff changeset
    80
    etypescls = cwvreg.CWRegistryStore.REGISTRY_FACTORY['etypes']
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    81
    etypescls.etype_class = etypescls.orig_etype_class
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2496
diff changeset
    82
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
    83
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
class ConnectionProperties(object):
8538
00597256de18 [request/session] refactor language handling: don't attempt to sync web/repo languages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8537
diff changeset
    85
    def __init__(self, cnxtype=None, close=True, log=False):
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
    86
        if cnxtype is not None:
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
    87
            warn('[3.16] cnxtype argument is deprecated', DeprecationWarning,
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
    88
                 stacklevel=2)
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
    89
        self.cnxtype = cnxtype
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    90
        self.log_queries = log
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    91
        self.close_on_del = close
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    92
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    93
9404
3e3e9b37e177 fix version number: we still target cw 3.19
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9402
diff changeset
    94
@deprecated('[3.19] the dbapi is deprecated. Have a look at the new repoapi.')
8673
8ea63a2cc2cc [db-api] rename repo_connect into _repo_connect to mark it private. Closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8670
diff changeset
    95
def _repo_connect(repo, login, **kwargs):
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
    96
    """Constructor to create a new connection to the given CubicWeb repository.
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
    97
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
    Returns a Connection instance.
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
    99
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   100
    Raises AuthenticationError if authentication failed
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   101
    """
3647
2941f4a0aab9 refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   102
    cnxid = repo.connect(unicode(login), **kwargs)
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   103
    cnx = Connection(repo, cnxid, kwargs.get('cnxprops'))
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   104
    if cnx.is_repo_in_memory:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
        cnx.vreg = repo.vreg
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
    return cnx
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   107
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   108
def connect(database, login=None,
3647
2941f4a0aab9 refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   109
            cnxprops=None, setvreg=True, mulcnx=True, initlog=True, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   110
    """Constructor for creating a connection to the CubicWeb repository.
5345
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   111
    Returns a :class:`Connection` object.
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   112
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   113
    Typical usage::
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   114
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   115
      cnx = connect('myinstance', login='me', password='toto')
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   116
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   117
    `database` may be:
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   118
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   119
    * a simple instance id for in-memory connection
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   120
10236
ef3059a692cb Remove the remote repository-access-through-zmq support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10235
diff changeset
   121
    * a uri like scheme://host:port/instanceid where scheme must be
ef3059a692cb Remove the remote repository-access-through-zmq support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10235
diff changeset
   122
      'inmemory'
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   123
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   124
    Other arguments:
5345
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   125
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   126
    :login:
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   127
      the user login to use to authenticate.
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   128
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   129
    :cnxprops:
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   130
      a :class:`ConnectionProperties` instance, allowing to specify
10236
ef3059a692cb Remove the remote repository-access-through-zmq support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10235
diff changeset
   131
      the connection method (eg in memory).
5345
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   132
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   133
    :setvreg:
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   134
      flag telling if a registry should be initialized for the connection.
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   135
      Don't change this unless you know what you're doing.
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   136
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   137
    :mulcnx:
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   138
      Will disappear at some point. Try to deal with connections to differents
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   139
      instances in the same process unless specified otherwise by setting this
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   140
      flag to False. Don't change this unless you know what you're doing.
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   141
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   142
    :initlog:
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   143
      flag telling if logging should be initialized. You usually don't want
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   144
      logging initialization when establishing the connection from a process
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   145
      where it's already initialized.
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   146
dc9afabbb45b [dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5307
diff changeset
   147
    :kwargs:
7004
9e142116d82f [dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6613
diff changeset
   148
      there goes authentication tokens. You usually have to specify a password
9e142116d82f [dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6613
diff changeset
   149
      for the given user, using a named 'password' argument.
10236
ef3059a692cb Remove the remote repository-access-through-zmq support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10235
diff changeset
   150
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   151
    """
8744
2091d275fe5c dbapi: try to restore compatibility of the connect api with 3.15
Julien Cristau <julien.cristau@logilab.fr>
parents: 8702
diff changeset
   152
    if not urlparse(database).scheme:
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   153
        warn('[3.16] give an qualified URI as database instead of using '
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   154
             'host/cnxprops to specify the connection method',
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   155
             DeprecationWarning, stacklevel=2)
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   156
    puri = urlparse(database)
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   157
    method = puri.scheme.lower()
10236
ef3059a692cb Remove the remote repository-access-through-zmq support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10235
diff changeset
   158
    assert method == 'inmemory'
ef3059a692cb Remove the remote repository-access-through-zmq support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10235
diff changeset
   159
    config = cwconfig.instance_configuration(puri.netloc)
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   160
    repo = get_repository(database, config=config)
10236
ef3059a692cb Remove the remote repository-access-through-zmq support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10235
diff changeset
   161
    vreg = repo.vreg
8673
8ea63a2cc2cc [db-api] rename repo_connect into _repo_connect to mark it private. Closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8670
diff changeset
   162
    cnx = _repo_connect(repo, login, cnxprops=cnxprops, **kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   163
    cnx.vreg = vreg
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   164
    return cnx
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   165
7056
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   166
def in_memory_repo(config):
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   167
    """Return and in_memory Repository object from a config (or vreg)"""
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7962
diff changeset
   168
    if isinstance(config, cwvreg.CWRegistryStore):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   169
        vreg = config
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   170
        config = None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   171
    else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   172
        vreg = None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   173
    # get local access to the repository
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   174
    return get_repository('inmemory://', config=config, vreg=vreg)
7056
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   175
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   176
def in_memory_repo_cnx(config, login, **kwargs):
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   177
    """useful method for testing and scripting to get a dbapi.Connection
7056
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   178
    object connected to an in-memory repository instance
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   179
    """
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   180
    # connection to the CubicWeb repository
51f88f13d6f3 [dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7004
diff changeset
   181
    repo = in_memory_repo(config)
8673
8ea63a2cc2cc [db-api] rename repo_connect into _repo_connect to mark it private. Closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8670
diff changeset
   182
    return repo, _repo_connect(repo, login, **kwargs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   183
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   184
# XXX web only method, move to webconfig?
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   185
def anonymous_session(vreg):
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   186
    """return a new anonymous session
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   187
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   188
    raises an AuthenticationError if anonymous usage is not allowed
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   189
    """
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   190
    anoninfo = vreg.config.anonymous_user()
9355
19ab31ea6ffb Fix use of vreg.config.anonymous_user()
Julien Cristau <julien.cristau@logilab.fr>
parents: 9297
diff changeset
   191
    if anoninfo[0] is None: # no anonymous user
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   192
        raise AuthenticationError('anonymous access is not authorized')
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   193
    anon_login, anon_password = anoninfo
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   194
    # use vreg's repository cache
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   195
    repo = vreg.config.repository(vreg)
8673
8ea63a2cc2cc [db-api] rename repo_connect into _repo_connect to mark it private. Closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8670
diff changeset
   196
    anon_cnx = _repo_connect(repo, anon_login, password=anon_password)
7876
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   197
    anon_cnx.vreg = vreg
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   198
    return DBAPISession(anon_cnx, anon_login)
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   199
df15d194a134 [views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7815
diff changeset
   200
5244
5467674ad101 [web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5223
diff changeset
   201
class _NeedAuthAccessMock(object):
5467674ad101 [web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5223
diff changeset
   202
    def __getattribute__(self, attr):
5467674ad101 [web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5223
diff changeset
   203
        raise AuthenticationError()
5467674ad101 [web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5223
diff changeset
   204
    def __nonzero__(self):
5467674ad101 [web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5223
diff changeset
   205
        return False
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   206
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   207
class DBAPISession(object):
6848
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6613
diff changeset
   208
    def __init__(self, cnx, login=None):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   209
        self.cnx = cnx
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   210
        self.data = {}
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   211
        self.login = login
5251
b675edd05c19 [web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5244
diff changeset
   212
        # dbapi session identifier is the same as the first connection
b675edd05c19 [web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5244
diff changeset
   213
        # identifier, but may later differ in case of auto-reconnection as done
b675edd05c19 [web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5244
diff changeset
   214
        # by the web authentication manager (in cw.web.views.authentication)
b675edd05c19 [web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5244
diff changeset
   215
        if cnx is not None:
b675edd05c19 [web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5244
diff changeset
   216
            self.sessionid = cnx.sessionid
b675edd05c19 [web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5244
diff changeset
   217
        else:
7428
5338d895b891 [web session] fix session handling so we get a chance to have for instance the 'forgotpwd' feature working on a site where anonymous are not allowed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7140
diff changeset
   218
            self.sessionid = uuid4().hex
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   219
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   220
    @property
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   221
    def anonymous_session(self):
5244
5467674ad101 [web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5223
diff changeset
   222
        return not self.cnx or self.cnx.anonymous_connection
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   223
7909
71c70bf482cf [web session] ProgrammingError may be raised, we should catch it (closes #1980076)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7879
diff changeset
   224
    def __repr__(self):
71c70bf482cf [web session] ProgrammingError may be raised, we should catch it (closes #1980076)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7879
diff changeset
   225
        return '<DBAPISession %r>' % self.sessionid
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   226
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   227
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2770
diff changeset
   228
class DBAPIRequest(RequestSessionBase):
8538
00597256de18 [request/session] refactor language handling: don't attempt to sync web/repo languages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8537
diff changeset
   229
    #: Request language identifier eg: 'en'
00597256de18 [request/session] refactor language handling: don't attempt to sync web/repo languages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8537
diff changeset
   230
    lang = None
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   231
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   232
    def __init__(self, vreg, session=None):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   233
        super(DBAPIRequest, self).__init__(vreg)
8274
aedb32d324ab [dbapi] some documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8268
diff changeset
   234
        #: 'language' => translation_function() mapping
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   235
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   236
            # no vreg or config which doesn't handle translations
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   237
            self.translations = vreg.config.translations
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   238
        except AttributeError:
8404
3dcb117fb3b0 [db-api] fix typo leading to crash on client connection (config has no translations). Closes #2357044
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8367
diff changeset
   239
            self.translations = {}
8274
aedb32d324ab [dbapi] some documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8268
diff changeset
   240
        #: cache entities built during the request
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   241
        self._eid_cache = {}
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   242
        if session is not None:
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   243
            self.set_session(session)
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   244
        else:
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   245
            # these args are initialized after a connection is
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   246
            # established
9040
3c85e734ce00 [webrequest] set DBAPISession without cnx at initialisation time
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9038
diff changeset
   247
            self.session = DBAPISession(None)
5271
94e16453a640 [dbapi] fix user handling on dbapi request. Avoid getting None as _user and remove the need for a property.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5251
diff changeset
   248
            self.cnx = self.user = _NeedAuthAccessMock()
8538
00597256de18 [request/session] refactor language handling: don't attempt to sync web/repo languages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8537
diff changeset
   249
        self.set_default_language(vreg)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   250
8585
3f60f416dddb [dbapi] provide get_option_value over DBAPIRequest (closes #2515522)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8572
diff changeset
   251
    def get_option_value(self, option, foreid=None):
9458
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   252
        if foreid is not None:
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   253
            warn('[3.19] foreid argument is deprecated', DeprecationWarning,
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   254
                 stacklevel=2)
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   255
        return self.cnx.get_option_value(option)
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   256
9038
1b972d81eda4 [request] drop the user argument for set_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9033
diff changeset
   257
    def set_session(self, session):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   258
        """method called by the session handler when the user is authenticated
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   259
        or an anonymous connection is open
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   260
        """
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   261
        self.session = session
5244
5467674ad101 [web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5223
diff changeset
   262
        if session.cnx:
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   263
            self.cnx = session.cnx
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   264
            self.execute = session.cnx.cursor(self).execute
9038
1b972d81eda4 [request] drop the user argument for set_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9033
diff changeset
   265
            self.user = self.cnx.user(self)
1b972d81eda4 [request] drop the user argument for set_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9033
diff changeset
   266
            self.set_entity_cache(self.user)
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   267
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
   268
    def execute(self, *args, **kwargs): # pylint: disable=E0202
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   269
        """overriden when session is set. By default raise authentication error
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   270
        so authentication is requested.
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   271
        """
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   272
        raise AuthenticationError()
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   273
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   274
    def set_default_language(self, vreg):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   275
        try:
8538
00597256de18 [request/session] refactor language handling: don't attempt to sync web/repo languages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8537
diff changeset
   276
            lang = vreg.property_value('ui.language')
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7665
diff changeset
   277
        except Exception: # property may not be registered
8538
00597256de18 [request/session] refactor language handling: don't attempt to sync web/repo languages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8537
diff changeset
   278
            lang = 'en'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   279
        try:
8538
00597256de18 [request/session] refactor language handling: don't attempt to sync web/repo languages
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8537
diff changeset
   280
            self.set_language(lang)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   281
        except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   282
            # this occurs usually during test execution
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   283
            self._ = self.__ = unicode
7960
981d2a6d95be [test] map pgettext to unicode as _
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7909
diff changeset
   284
            self.pgettext = lambda x, y: unicode(y)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   285
8367
fc59d2380c48 [service-api] Add unified service API on `_cw` attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8352
diff changeset
   286
    # server-side service call #################################################
fc59d2380c48 [service-api] Add unified service API on `_cw` attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8352
diff changeset
   287
9033
614bf73cc126 [service] drop the asynchronous execution possibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9022
diff changeset
   288
    def call_service(self, regid, **kwargs):
614bf73cc126 [service] drop the asynchronous execution possibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9022
diff changeset
   289
        return self.cnx.call_service(regid, **kwargs)
8367
fc59d2380c48 [service-api] Add unified service API on `_cw` attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8352
diff changeset
   290
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   291
    # entities cache management ###############################################
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   292
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   293
    def entity_cache(self, eid):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   294
        return self._eid_cache[eid]
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   295
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   296
    def set_entity_cache(self, entity):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   297
        self._eid_cache[entity.eid] = entity
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   298
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   299
    def cached_entities(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   300
        return self._eid_cache.values()
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   301
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   302
    def drop_entity_cache(self, eid=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   303
        if eid is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   304
            self._eid_cache = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   305
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   306
            del self._eid_cache[eid]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   307
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   308
    # low level session data management #######################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   309
9774
b7b71be569cf deprecate get/set_shared_data API
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9770
diff changeset
   310
    @deprecated('[3.19] use session or transaction data')
6013
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   311
    def get_shared_data(self, key, default=None, pop=False, txdata=False):
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   312
        """see :meth:`Connection.get_shared_data`"""
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   313
        return self.cnx.get_shared_data(key, default, pop, txdata)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   314
9774
b7b71be569cf deprecate get/set_shared_data API
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9770
diff changeset
   315
    @deprecated('[3.19] use session or transaction data')
6013
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   316
    def set_shared_data(self, key, value, txdata=False, querydata=None):
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   317
        """see :meth:`Connection.set_shared_data`"""
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   318
        if querydata is not None:
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   319
            txdata = querydata
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   320
            warn('[3.10] querydata argument has been renamed to txdata',
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   321
                 DeprecationWarning, stacklevel=2)
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6012
diff changeset
   322
        return self.cnx.set_shared_data(key, value, txdata)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   323
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   324
    # server session compat layer #############################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   325
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   326
    def entity_metas(self, eid):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   327
        """return a tuple (type, sourceuri, extid) for the entity with id <eid>"""
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   328
        return self.cnx.entity_metas(eid)
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   329
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   330
    def source_defs(self):
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   331
        """return the definition of sources used by the repository."""
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   332
        return self.cnx.source_defs()
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   333
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   334
    @deprecated('[3.19] use .entity_metas(eid) instead')
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   335
    def describe(self, eid, asdict=False):
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   336
        """return a tuple (type, sourceuri, extid) for the entity with id <eid>"""
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   337
        return self.cnx.describe(eid, asdict)
3110
757d36162235 enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2665
diff changeset
   338
7083
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7056
diff changeset
   339
    # these are overridden by set_log_methods below
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7056
diff changeset
   340
    # only defining here to prevent pylint from complaining
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7056
diff changeset
   341
    info = warning = error = critical = exception = debug = lambda msg,*a,**kw: None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   342
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   343
set_log_methods(DBAPIRequest, getLogger('cubicweb.dbapi'))
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   344
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   345
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   346
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   347
# cursor / connection objects ##################################################
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   348
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   349
class Cursor(object):
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   350
    """These objects represent a database cursor, which is used to manage the
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   351
    context of a fetch operation. Cursors created from the same connection are
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   352
    not isolated, i.e., any changes done to the database by a cursor are
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   353
    immediately visible by the other cursors. Cursors created from different
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   354
    connections are isolated.
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   355
    """
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   356
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   357
    def __init__(self, connection, repo, req=None):
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   358
        """This read-only attribute return a reference to the Connection
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   359
        object on which the cursor was created.
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   360
        """
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   361
        self.connection = connection
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   362
        """optionnal issuing request instance"""
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   363
        self.req = req
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   364
        self._repo = repo
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   365
        self._sessid = connection.sessionid
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   366
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   367
    def close(self):
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   368
        """no effect"""
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   369
        pass
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   370
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
   371
    def _txid(self):
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
   372
        return self.connection._txid(self)
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
   373
9255
46f41c3e1443 remove 3.8 bw compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8992
diff changeset
   374
    def execute(self, rql, args=None, build_descr=True):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   375
        """execute a rql query, return resulting rows and their description in
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   376
        a :class:`~cubicweb.rset.ResultSet` object
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   377
9701
46c8d8701240 an unicode string -> a unicode string
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9396
diff changeset
   378
        * `rql` should be a Unicode string or a plain ASCII string, containing
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   379
          the rql query
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   380
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   381
        * `args` the optional args dictionary associated to the query, with key
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   382
          matching named substitution in `rql`
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   383
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   384
        * `build_descr` is a boolean flag indicating if the description should
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   385
          be built on select queries (if false, the description will be en empty
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   386
          list)
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   387
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   388
        on INSERT queries, there will be one row for each inserted entity,
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   389
        containing its eid
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   390
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   391
        on SET queries, XXX describe
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   392
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   393
        DELETE queries returns no result.
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   394
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   395
        .. Note::
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   396
          to maximize the rql parsing/analyzing cache performance, you should
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   397
          always use substitute arguments in queries, i.e. avoid query such as::
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   398
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   399
            execute('Any X WHERE X eid 123')
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   400
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   401
          use::
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   402
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   403
            execute('Any X WHERE X eid %(x)s', {'x': 123})
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   404
        """
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
   405
        rset = self._repo.execute(self._sessid, rql, args,
5859
3da3574fe397 [dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5813
diff changeset
   406
                                  build_descr=build_descr, **self._txid())
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   407
        rset.req = self.req
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   408
        return rset
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   409
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   410
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   411
class LogCursor(Cursor):
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   412
    """override the standard cursor to log executed queries"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   413
10005
7769d0f61810 remove leftover pre 3.9 deprecation warnings
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9830
diff changeset
   414
    def execute(self, operation, parameters=None, build_descr=True):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   415
        """override the standard cursor to log executed queries"""
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   416
        tstart, cstart = time(), clock()
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   417
        rset = Cursor.execute(self, operation, parameters, build_descr=build_descr)
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   418
        self.connection.executed_queries.append((operation, parameters,
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   419
                                                 time() - tstart, clock() - cstart))
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   420
        return rset
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   421
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   422
def check_not_closed(func):
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   423
    def decorator(self, *args, **kwargs):
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   424
        if self._closed is not None:
7665
0cd299c16f12 [session] add session id to closed connection errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7650
diff changeset
   425
            raise ProgrammingError('Closed connection %s' % self.sessionid)
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   426
        return func(self, *args, **kwargs)
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   427
    return decorator
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   428
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   429
class Connection(object):
3258
6536ee4f37f7 update the documentation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3110
diff changeset
   430
    """DB-API 2.0 compatible Connection object for CubicWeb
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   431
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   432
    # make exceptions available through the connection object
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   433
    ProgrammingError = ProgrammingError
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   434
    # attributes that may be overriden per connection instance
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   435
    cursor_class = Cursor
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   436
    vreg = None
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5174
diff changeset
   437
    _closed = None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   438
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   439
    def __init__(self, repo, cnxid, cnxprops=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   440
        self._repo = repo
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   441
        self.sessionid = cnxid
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   442
        self._close_on_del = getattr(cnxprops, 'close_on_del', True)
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   443
        self._web_request = False
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   444
        if cnxprops and cnxprops.log_queries:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   445
            self.executed_queries = []
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   446
            self.cursor_class = LogCursor
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   447
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   448
    @property
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   449
    def is_repo_in_memory(self):
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   450
        """return True if this is a local, aka in-memory, connection to the
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   451
        repository
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   452
        """
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   453
        try:
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   454
            from cubicweb.server.repository import Repository
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   455
        except ImportError:
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   456
            # code not available, no way
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   457
            return False
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   458
        return isinstance(self._repo, Repository)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   459
9042
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
   460
    @property # could be a cached property but we want to prevent assigment to
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
   461
              # catch potential programming error.
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
   462
    def anonymous_connection(self):
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
   463
        login = self._repo.user_info(self.sessionid)[1]
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
   464
        anon_login = self.vreg.config.get('anonymous-user')
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
   465
        return login == anon_login
6cc13a0a9145 [dbapi] makes anonymous_connection a computed property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9040
diff changeset
   466
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   467
    def __repr__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   468
        if self.anonymous_connection:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   469
            return '<Connection %s (anonymous)>' % self.sessionid
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   470
        return '<Connection %s>' % self.sessionid
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   471
5100
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   472
    def __enter__(self):
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   473
        return self.cursor()
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   474
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   475
    def __exit__(self, exc_type, exc_val, exc_tb):
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   476
        if exc_type is None:
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   477
            self.commit()
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   478
        else:
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   479
            self.rollback()
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   480
            return False #propagate the exception
04c71ebf38a5 Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5032
diff changeset
   481
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   482
    def __del__(self):
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   483
        """close the remote connection if necessary"""
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   484
        if self._closed is None and self._close_on_del:
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   485
            try:
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   486
                self.close()
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7665
diff changeset
   487
            except Exception:
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   488
                pass
2245
7463e1a748dd new set_session_props method exposed by the repository, use it to be sure session language is in sync the request language
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2111
diff changeset
   489
8268
c9babe49c1c1 [repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents: 8239
diff changeset
   490
    # server-side service call #################################################
c9babe49c1c1 [repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents: 8239
diff changeset
   491
c9babe49c1c1 [repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents: 8239
diff changeset
   492
    @check_not_closed
9033
614bf73cc126 [service] drop the asynchronous execution possibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9022
diff changeset
   493
    def call_service(self, regid, **kwargs):
614bf73cc126 [service] drop the asynchronous execution possibility
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9022
diff changeset
   494
        return self._repo.call_service(self.sessionid, regid, **kwargs)
8268
c9babe49c1c1 [repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents: 8239
diff changeset
   495
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   496
    # connection initialization methods ########################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   497
5763
1bdddb7460a9 [vreg] register_objects lost its force_reload argument, fix dbapi.Connection.load_appobjects consequently
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5507
diff changeset
   498
    def load_appobjects(self, cubes=_MARKER, subpath=None, expand=True):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   499
        config = self.vreg.config
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   500
        if cubes is _MARKER:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   501
            cubes = self._repo.get_cubes()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   502
        elif cubes is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   503
            cubes = ()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   504
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   505
            if not isinstance(cubes, (list, tuple)):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   506
                cubes = (cubes,)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   507
            if expand:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   508
                cubes = config.expand_cubes(cubes)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   509
        if subpath is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   510
            subpath = esubpath = ('entities', 'views')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   511
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   512
            esubpath = subpath
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   513
        if 'views' in subpath:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   514
            esubpath = list(subpath)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   515
            esubpath.remove('views')
5500
55a40cc0ab9a replaced hardcoded 'web/view' by os.path.join('web', 'view') so views path is also valid under windows
egazoni
parents: 5429
diff changeset
   516
            esubpath.append(join('web', 'views'))
8571
7e5246889148 [dbapi] load_appobjects must attempt to load available cubicweb configurations to avoid error when some object use a persistent propery (CWProperty) defined there. Closes #2497697
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   517
        # first load available configs, necessary for proper persistent
7e5246889148 [dbapi] load_appobjects must attempt to load available cubicweb configurations to avoid error when some object use a persistent propery (CWProperty) defined there. Closes #2497697
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   518
        # properties initialization
7e5246889148 [dbapi] load_appobjects must attempt to load available cubicweb configurations to avoid error when some object use a persistent propery (CWProperty) defined there. Closes #2497697
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   519
        config.load_available_configs()
7e5246889148 [dbapi] load_appobjects must attempt to load available cubicweb configurations to avoid error when some object use a persistent propery (CWProperty) defined there. Closes #2497697
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   520
        # then init cubes
6494
70c87c717e4a [config] make config.cubes() available on NoAppCubicWebConfiguration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6333
diff changeset
   521
        config.init_cubes(cubes)
8571
7e5246889148 [dbapi] load_appobjects must attempt to load available cubicweb configurations to avoid error when some object use a persistent propery (CWProperty) defined there. Closes #2497697
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   522
        # then load appobjects into the registry
8537
e30d0a7f0087 [config] turn internal configuration methods building appobjects search path into normal method rather than class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   523
        vpath = config.build_appobjects_path(reversed(config.cubes_path()),
e30d0a7f0087 [config] turn internal configuration methods building appobjects search path into normal method rather than class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   524
                                             evobjpath=esubpath,
e30d0a7f0087 [config] turn internal configuration methods building appobjects search path into normal method rather than class method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8404
diff changeset
   525
                                             tvobjpath=subpath)
5763
1bdddb7460a9 [vreg] register_objects lost its force_reload argument, fix dbapi.Connection.load_appobjects consequently
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5507
diff changeset
   526
        self.vreg.register_objects(vpath)
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   527
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   528
    def use_web_compatible_requests(self, baseurl, sitetitle=None):
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   529
        """monkey patch DBAPIRequest to fake a cw.web.request, so you should
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   530
        able to call html views using rset from a simple dbapi connection.
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   531
2657
de974465d381 [appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2650
diff changeset
   532
        You should call `load_appobjects` at some point to register those views.
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   533
        """
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   534
        DBAPIRequest.property_value = _fake_property_value
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   535
        DBAPIRequest.next_tabindex = count().next
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   536
        DBAPIRequest.relative_path = fake
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   537
        DBAPIRequest.url = fake
3832
ce8dd861f442 #473188: missing get_page_data when patching bare db-api request for web compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3707
diff changeset
   538
        DBAPIRequest.get_page_data = fake
3833
5507aa75f601 add set_page_data as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3832
diff changeset
   539
        DBAPIRequest.set_page_data = fake
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   540
        # XXX could ask the repo for it's base-url configuration
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   541
        self.vreg.config.set_option('base-url', baseurl)
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   542
        self.vreg.config.uiprops = {}
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   543
        self.vreg.config.datadir_url = baseurl + '/data'
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   544
        # XXX why is this needed? if really needed, could be fetched by a query
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   545
        if sitetitle is not None:
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   546
            self.vreg['propertydefs']['ui.site-title'] = {'default': sitetitle}
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   547
        self._web_request = True
2496
fbd1fd2ca312 #343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2476
diff changeset
   548
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   549
    def request(self):
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   550
        if self._web_request:
9067
262d7874c6c7 [dbapi] explicitly use the DBAPI version of CubicwebRequestBase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9046
diff changeset
   551
            from cubicweb.web.request import DBAPICubicWebRequestBase
262d7874c6c7 [dbapi] explicitly use the DBAPI version of CubicwebRequestBase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9046
diff changeset
   552
            req = DBAPICubicWebRequestBase(self.vreg, False)
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   553
            req.get_header = lambda x, default=None: default
9038
1b972d81eda4 [request] drop the user argument for set_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9033
diff changeset
   554
            req.set_session = lambda session: DBAPIRequest.set_session(
1b972d81eda4 [request] drop the user argument for set_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9033
diff changeset
   555
                req, session)
6613
e7ff604491b2 [dbapi] web request compatibility fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6581
diff changeset
   556
            req.relative_path = lambda includeparams=True: ''
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   557
        else:
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   558
            req = DBAPIRequest(self.vreg)
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   559
        req.set_session(DBAPISession(self))
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   560
        return req
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   561
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   562
    @check_not_closed
322
0d9aca19b3d0 make req argument optional
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 169
diff changeset
   563
    def user(self, req=None, props=None):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   564
        """return the User object associated to this connection"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   565
        # cnx validity is checked by the call to .user_info
2245
7463e1a748dd new set_session_props method exposed by the repository, use it to be sure session language is in sync the request language
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2111
diff changeset
   566
        eid, login, groups, properties = self._repo.user_info(self.sessionid,
7463e1a748dd new set_session_props method exposed by the repository, use it to be sure session language is in sync the request language
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2111
diff changeset
   567
                                                              props)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   568
        if req is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   569
            req = self.request()
1923
3802c2e37e72 handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1882
diff changeset
   570
        rset = req.eid_rset(eid, 'CWUser')
5359
d83a227df75c [dbapi] take care vreg may not be set
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5347
diff changeset
   571
        if self.vreg is not None and 'etypes' in self.vreg:
6848
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6613
diff changeset
   572
            user = self.vreg['etypes'].etype_class('CWUser')(
f87cd875c6db [web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6613
diff changeset
   573
                req, rset, row=0, groups=groups, properties=properties)
5321
6bdca255985a [dbapi] fallback to Entity when etypes registry isn't initialized (weird we haven't catchi this pb before)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5271
diff changeset
   574
        else:
6bdca255985a [dbapi] fallback to Entity when etypes registry isn't initialized (weird we haven't catchi this pb before)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5271
diff changeset
   575
            from cubicweb.entity import Entity
6bdca255985a [dbapi] fallback to Entity when etypes registry isn't initialized (weird we haven't catchi this pb before)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5271
diff changeset
   576
            user = Entity(req, rset, row=0)
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6066
diff changeset
   577
        user.cw_attr_cache['login'] = login # cache login
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   578
        return user
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   579
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   580
    @check_not_closed
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   581
    def check(self):
6279
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   582
        """raise `BadConnectionId` if the connection is no more valid, else
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   583
        return its latest activity timestamp.
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   584
        """
6293
df44d7163582 [dbapi] Connection.check() must return the latest activity timestamp (dropped accidentally during latest merge)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6279
diff changeset
   585
        return self._repo.check_session(self.sessionid)
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   586
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
   587
    def _txid(self, cursor=None): # pylint: disable=E0202
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
   588
        # XXX could now handle various isolation level!
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   589
        # return a dict as bw compat trick
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   590
        return {'txid': currentThread().getName()}
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   591
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   592
    # session data methods #####################################################
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   593
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   594
    @check_not_closed
6279
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   595
    def get_shared_data(self, key, default=None, pop=False, txdata=False):
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   596
        """return value associated to key in the session's data dictionary or
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   597
        session's transaction's data if `txdata` is true.
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   598
8238
087bb529035c [spelling] fix dictionnary -> dictionary typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7962
diff changeset
   599
        If pop is True, value will be removed from the dictionary.
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   600
8238
087bb529035c [spelling] fix dictionnary -> dictionary typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7962
diff changeset
   601
        If key isn't defined in the dictionary, value specified by the
6279
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   602
        `default` argument will be returned.
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   603
        """
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   604
        return self._repo.get_shared_data(self.sessionid, key, default, pop, txdata)
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   605
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   606
    @check_not_closed
6279
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   607
    def set_shared_data(self, key, value, txdata=False):
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   608
        """set value associated to `key` in shared data
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   609
6279
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   610
        if `txdata` is true, the value will be added to the repository
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   611
        session's query data which are cleared on commit/rollback of the current
6279
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   612
        transaction.
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   613
        """
6279
42079f752a9c backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142 6257
diff changeset
   614
        return self._repo.set_shared_data(self.sessionid, key, value, txdata)
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   615
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   616
    # meta-data accessors ######################################################
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   617
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   618
    @check_not_closed
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   619
    def source_defs(self):
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   620
        """Return the definition of sources used by the repository."""
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   621
        return self._repo.source_defs()
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   622
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6494
diff changeset
   623
    @check_not_closed
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   624
    def get_schema(self):
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   625
        """Return the schema currently used by the repository."""
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   626
        return self._repo.get_schema()
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   627
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   628
    @check_not_closed
6308
c151c730a1ac [dbapi] get_option_value now has a foreid argument telling the option should be dereferenced to the entity's actual repository (necessary for apycot/local_cache handling)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6257
diff changeset
   629
    def get_option_value(self, option, foreid=None):
9458
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   630
        """Return the value for `option` in the configuration.
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   631
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   632
        `foreid` argument is deprecated and now useless (as of 3.19).
6308
c151c730a1ac [dbapi] get_option_value now has a foreid argument telling the option should be dereferenced to the entity's actual repository (necessary for apycot/local_cache handling)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6257
diff changeset
   633
        """
9458
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   634
        if foreid is not None:
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   635
            warn('[3.19] foreid argument is deprecated', DeprecationWarning,
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   636
                 stacklevel=2)
e2dfdd313dfe [multi-sources-removal] Drop foreid argument of repo.get_option_value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9404
diff changeset
   637
        return self._repo.get_option_value(option)
6257
7eb5f1aed728 [repo] new method on repo+dbapi.Connection to get a value from repository's configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6252
diff changeset
   638
7eb5f1aed728 [repo] new method on repo+dbapi.Connection to get a value from repository's configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6252
diff changeset
   639
7eb5f1aed728 [repo] new method on repo+dbapi.Connection to get a value from repository's configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6252
diff changeset
   640
    @check_not_closed
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   641
    def entity_metas(self, eid):
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   642
        """return a tuple (type, sourceuri, extid) for the entity with id <eid>"""
9830
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   643
        try:
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   644
            return self._repo.entity_metas(self.sessionid, eid, **self._txid())
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   645
        except AttributeError:
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   646
            # talking to pre 3.19 repository
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   647
            metas = self._repo.describe(self.sessionid, eid, **self._txid())
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   648
            if len(metas) == 3: # even older backward compat
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   649
                metas = list(metas)
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   650
                metas.append(metas[1])
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   651
            return dict(zip(('type', 'source', 'extid', 'asource'), metas))
465d8151b92d [dbapi] allow talking to a pre-3.19 remote repository
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
   652
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   653
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   654
    @deprecated('[3.19] use .entity_metas(eid) instead')
6257
7eb5f1aed728 [repo] new method on repo+dbapi.Connection to get a value from repository's configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6252
diff changeset
   655
    @check_not_closed
7543
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7428
diff changeset
   656
    def describe(self, eid, asdict=False):
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   657
        try:
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   658
            metas = self._repo.entity_metas(self.sessionid, eid, **self._txid())
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   659
        except AttributeError:
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   660
            metas = self._repo.describe(self.sessionid, eid, **self._txid())
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   661
            # talking to pre 3.19 repository
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   662
            if len(metas) == 3: # even older backward compat
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   663
                metas = list(metas)
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   664
                metas.append(metas[1])
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   665
            if asdict:
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   666
                return dict(zip(('type', 'source', 'extid', 'asource'), metas))
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   667
            return metas[:-1]
7543
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7428
diff changeset
   668
        if asdict:
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   669
            metas['asource'] = meta['source'] # XXX pre 3.19 client compat
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   670
            return metas
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   671
        return metas['type'], metas['source'], metas['extid']
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   672
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   673
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   674
    # db-api like interface ####################################################
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   675
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   676
    @check_not_closed
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   677
    def commit(self):
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   678
        """Commit pending transaction for this connection to the repository.
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   679
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   680
        may raises `Unauthorized` or `ValidationError` if we attempted to do
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   681
        something we're not allowed to for security or integrity reason.
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   682
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   683
        If the transaction is undoable, a transaction id will be returned.
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   684
        """
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   685
        return self._repo.commit(self.sessionid, **self._txid())
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   686
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   687
    @check_not_closed
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   688
    def rollback(self):
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   689
        """This method is optional since not all databases provide transaction
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   690
        support.
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   691
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   692
        In case a database does provide transactions this method causes the the
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   693
        database to roll back to the start of any pending transaction.  Closing
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   694
        a connection without committing the changes first will cause an implicit
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   695
        rollback to be performed.
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   696
        """
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   697
        self._repo.rollback(self.sessionid, **self._txid())
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   698
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   699
    @check_not_closed
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   700
    def cursor(self, req=None):
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   701
        """Return a new Cursor Object using the connection.
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   702
        """
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   703
        if req is None:
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   704
            req = self.request()
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   705
        return self.cursor_class(self, self._repo, req=req)
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   706
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   707
    @check_not_closed
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   708
    def close(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   709
        """Close the connection now (rather than whenever __del__ is called).
1524
1d7575f5deaf delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   710
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   711
        The connection will be unusable from this point forward; an Error (or
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   712
        subclass) exception will be raised if any operation is attempted with
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   713
        the connection. The same applies to all cursor objects trying to use the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   714
        connection.  Note that closing a connection without committing the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   715
        changes first will cause an implicit rollback to be performed.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   716
        """
5859
3da3574fe397 [dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5813
diff changeset
   717
        self._repo.close(self.sessionid, **self._txid())
4768
430b89aed996 delete pyro proxy on connection close, properly raise programming error when working on a closed connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4721
diff changeset
   718
        del self._repo # necessary for proper garbage collection
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   719
        self._closed = 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   720
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   721
    # undo support ############################################################
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   722
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   723
    @check_not_closed
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   724
    def undoable_transactions(self, ueid=None, req=None, **actionfilters):
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   725
        """Return a list of undoable transaction objects by the connection's
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   726
        user, ordered by descendant transaction time.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   727
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   728
        Managers may filter according to user (eid) who has done the transaction
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   729
        using the `ueid` argument. Others will only see their own transactions.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   730
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   731
        Additional filtering capabilities is provided by using the following
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   732
        named arguments:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   733
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   734
        * `etype` to get only transactions creating/updating/deleting entities
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   735
          of the given type
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   736
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   737
        * `eid` to get only transactions applied to entity of the given eid
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   738
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   739
        * `action` to get only transactions doing the given action (action in
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   740
          'C', 'U', 'D', 'A', 'R'). If `etype`, action can only be 'C', 'U' or
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   741
          'D'.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   742
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   743
        * `public`: when additional filtering is provided, their are by default
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   744
          only searched in 'public' actions, unless a `public` argument is given
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   745
          and set to false.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   746
        """
5859
3da3574fe397 [dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5813
diff changeset
   747
        actionfilters.update(self._txid())
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   748
        txinfos = self._repo.undoable_transactions(self.sessionid, ueid,
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   749
                                                   **actionfilters)
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   750
        if req is None:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   751
            req = self.request()
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   752
        for txinfo in txinfos:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   753
            txinfo.req = req
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   754
        return txinfos
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   755
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   756
    @check_not_closed
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   757
    def transaction_info(self, txuuid, req=None):
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   758
        """Return transaction object for the given uid.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   759
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   760
        raise `NoSuchTransaction` if not found or if session's user is not
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   761
        allowed (eg not in managers group and the transaction doesn't belong to
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   762
        him).
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   763
        """
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
   764
        txinfo = self._repo.transaction_info(self.sessionid, txuuid,
5859
3da3574fe397 [dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5813
diff changeset
   765
                                             **self._txid())
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   766
        if req is None:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   767
            req = self.request()
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   768
        txinfo.req = req
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   769
        return txinfo
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   770
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   771
    @check_not_closed
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   772
    def transaction_actions(self, txuuid, public=True):
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   773
        """Return an ordered list of action effectued during that transaction.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   774
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   775
        If public is true, return only 'public' actions, eg not ones triggered
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   776
        under the cover by hooks, else return all actions.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   777
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   778
        raise `NoSuchTransaction` if the transaction is not found or if
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   779
        session's user is not allowed (eg not in managers group and the
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   780
        transaction doesn't belong to him).
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   781
        """
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
   782
        return self._repo.transaction_actions(self.sessionid, txuuid, public,
5859
3da3574fe397 [dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5813
diff changeset
   783
                                              **self._txid())
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   784
6252
d33509b79efe [dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6061
diff changeset
   785
    @check_not_closed
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   786
    def undo_transaction(self, txuuid):
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   787
        """Undo the given transaction. Return potential restoration errors.
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   788
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   789
        raise `NoSuchTransaction` if not found or if session's user is not
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   790
        allowed (eg not in managers group and the transaction doesn't belong to
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   791
        him).
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4895
diff changeset
   792
        """
5813
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5812
diff changeset
   793
        return self._repo.undo_transaction(self.sessionid, txuuid,
5859
3da3574fe397 [dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5813
diff changeset
   794
                                           **self._txid())
8669
62213a34726e [db-api/configuration] simplify db-api and configuration so that all the connection information is in the repository url, closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8596
diff changeset
   795
8673
8ea63a2cc2cc [db-api] rename repo_connect into _repo_connect to mark it private. Closes #2521848
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8670
diff changeset
   796
in_memory_cnx = deprecated('[3.16] use _repo_connect instead)')(_repo_connect)