server/session.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 18 Dec 2015 09:07:33 +0100
changeset 11030 c1fdd22232d1
parent 10752 c69f109293f2
child 11372 4482e94daabe
permissions -rw-r--r--
[server] always monkeypatch QuerierHelper to handle dates and times on SQLite The patch prevents problems due to a SQLite bug causing some values to be returned as strings instead of properly typed objects. This should probably be improved to use SQLite connection hooks. But the major improvement is that the monkeypatch is now done all the time, and not just for tests.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
     1
# copyright 2003-2015 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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    18
"""Repository users' and internal' sessions."""
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
    19
from __future__ import print_function
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
    20
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
import sys
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    24
from time import time
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    25
from uuid import uuid4
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
    26
from warnings import warn
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
    27
import functools
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
    28
from contextlib import contextmanager
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
10752
c69f109293f2 [server/session] unicode → six.text_type
Julien Cristau <julien.cristau@logilab.fr>
parents: 10737
diff changeset
    30
from six import text_type
c69f109293f2 [server/session] unicode → six.text_type
Julien Cristau <julien.cristau@logilab.fr>
parents: 10737
diff changeset
    31
2613
5e19c2bb370e R [all] logilab.common 0.44 provides only deprecated
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2466
diff changeset
    32
from logilab.common.deprecation import deprecated
7769
8af09eeee130 [session] take care of non-ascii characters in login and session id (closes: #1910849)
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 7757
diff changeset
    33
from logilab.common.textutils import unormalize
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    34
from logilab.common.registry import objectify_predicate
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
9468
39b7a91a3f4c [repo] pylint cleanup, mainly of imports, with a bit of style
Julien Cristau <julien.cristau@logilab.fr>
parents: 9466
diff changeset
    36
from cubicweb import QueryError, schema, server, ProgrammingError
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: 2788
diff changeset
    37
from cubicweb.req import RequestSessionBase
8542
7e264ce34cd4 [session / querier] reorganize code to building result set descriptions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8538
diff changeset
    38
from cubicweb.utils import make_uid
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3198
diff changeset
    39
from cubicweb.rqlrewrite import RQLRewriter
7119
8b29c4c2ffc6 [repository] fix crash in optimized [add|remove]_relation w/ inlined relation (broken by cw 3.10 refactoring)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7118
diff changeset
    40
from cubicweb.server.edition import EditedEntity
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    42
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    43
NO_UNDO_TYPES = schema.SCHEMA_TYPES.copy()
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    44
NO_UNDO_TYPES.add('CWCache')
5074
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    45
# is / is_instance_of are usually added by sql hooks except when using
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    46
# dataimport.NoHookRQLObjectStore, and we don't want to record them
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    47
# anyway in the later case
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    48
NO_UNDO_TYPES.add('is')
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    49
NO_UNDO_TYPES.add('is_instance_of')
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6401
diff changeset
    50
NO_UNDO_TYPES.add('cw_source')
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    51
# XXX rememberme,forgotpwd,apycot,vcsfile
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    52
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    53
@objectify_predicate
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    54
def is_user_session(cls, req, **kwargs):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    55
    """return 1 when session is not internal.
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    56
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    57
    This predicate can only be used repository side only. """
7330
584907154ce3 [session selector] missing not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7329
diff changeset
    58
    return not req.is_internal_session
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    59
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    60
@objectify_predicate
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    61
def is_internal_session(cls, req, **kwargs):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    62
    """return 1 when session is not internal.
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    63
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    64
    This predicate can only be used repository side only. """
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    65
    return req.is_internal_session
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    66
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    67
@objectify_predicate
7500
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    68
def repairing(cls, req, **kwargs):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    69
    """return 1 when repository is running in repair mode"""
7500
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    70
    return req.vreg.config.repairing
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    71
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
8840
bd5b5759c9b3 [session] make hook_control API private
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8817
diff changeset
    73
@deprecated('[3.17] use <object>.allow/deny_all_hooks_but instead')
8915
c5c6da8e42db [session] fix hooks_control backward compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8848
diff changeset
    74
def hooks_control(obj, mode, *categories):
c5c6da8e42db [session] fix hooks_control backward compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8848
diff changeset
    75
    assert mode in  (HOOKS_ALLOW_ALL, HOOKS_DENY_ALL)
c5c6da8e42db [session] fix hooks_control backward compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8848
diff changeset
    76
    if mode == HOOKS_ALLOW_ALL:
c5c6da8e42db [session] fix hooks_control backward compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8848
diff changeset
    77
        return obj.allow_all_hooks_but(*categories)
c5c6da8e42db [session] fix hooks_control backward compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8848
diff changeset
    78
    elif mode == HOOKS_DENY_ALL:
c5c6da8e42db [session] fix hooks_control backward compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8848
diff changeset
    79
        return obj.deny_all_hooks_but(*categories)
c5c6da8e42db [session] fix hooks_control backward compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8848
diff changeset
    80
7451
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
    81
10362
ec8c233ce54b [session] remove session-related bw compat code
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10361
diff changeset
    82
class _hooks_control(object):
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    83
    """context manager to control activated hooks categories.
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    84
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
    85
    If mode is `HOOKS_DENY_ALL`, given hooks categories will
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    86
    be enabled.
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    87
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    88
    If mode is `HOOKS_ALLOW_ALL`, given hooks categories will
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    89
    be disabled.
6147
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    90
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    91
    .. sourcecode:: python
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    92
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    93
       with _hooks_control(cnx, HOOKS_ALLOW_ALL, 'integrity'):
6147
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    94
           # ... do stuff with all but 'integrity' hooks activated
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    95
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    96
       with _hooks_control(cnx, HOOKS_DENY_ALL, 'integrity'):
6147
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    97
           # ... do stuff with none but 'integrity' hooks activated
8561
77ea3eed9946 [session] promote usage of [deny|all]_all_hooks_but session methods rather than hooks_control context manager directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8554
diff changeset
    98
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
    99
    This is an internal API, you should rather use
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   100
    :meth:`~cubicweb.server.session.Connection.deny_all_hooks_but` or
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   101
    :meth:`~cubicweb.server.session.Connection.allow_all_hooks_but`
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
   102
    Connection methods.
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   103
    """
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   104
    def __init__(self, cnx, mode, *categories):
8814
37fd037c0526 [session] move context manager logic in the hook controls context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8813
diff changeset
   105
        assert mode in (HOOKS_ALLOW_ALL, HOOKS_DENY_ALL)
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   106
        self.cnx = cnx
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   107
        self.mode = mode
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   108
        self.categories = categories
8814
37fd037c0526 [session] move context manager logic in the hook controls context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8813
diff changeset
   109
        self.oldmode = None
37fd037c0526 [session] move context manager logic in the hook controls context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8813
diff changeset
   110
        self.changes = ()
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   111
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   112
    def __enter__(self):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   113
        self.oldmode = self.cnx.hooks_mode
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   114
        self.cnx.hooks_mode = self.mode
8814
37fd037c0526 [session] move context manager logic in the hook controls context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8813
diff changeset
   115
        if self.mode is HOOKS_DENY_ALL:
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   116
            self.changes = self.cnx.enable_hook_categories(*self.categories)
8814
37fd037c0526 [session] move context manager logic in the hook controls context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8813
diff changeset
   117
        else:
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   118
            self.changes = self.cnx.disable_hook_categories(*self.categories)
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   119
        self.cnx.ctx_count += 1
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   120
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   121
    def __exit__(self, exctype, exc, traceback):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   122
        self.cnx.ctx_count -= 1
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   123
        try:
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   124
            if self.categories:
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   125
                if self.mode is HOOKS_DENY_ALL:
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   126
                    self.cnx.disable_hook_categories(*self.categories)
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   127
                else:
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   128
                    self.cnx.enable_hook_categories(*self.categories)
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   129
        finally:
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   130
            self.cnx.hooks_mode = self.oldmode
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   131
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   132
8841
f62fb831cfe6 [session] make security_enabled API private
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8840
diff changeset
   133
@deprecated('[3.17] use <object>.security_enabled instead')
f62fb831cfe6 [session] make security_enabled API private
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8840
diff changeset
   134
def security_enabled(obj, *args, **kwargs):
f62fb831cfe6 [session] make security_enabled API private
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8840
diff changeset
   135
    return obj.security_enabled(*args, **kwargs)
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   136
8841
f62fb831cfe6 [session] make security_enabled API private
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8840
diff changeset
   137
class _security_enabled(object):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   138
    """context manager to control security w/ session.execute,
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   139
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   140
    By default security is disabled on queries executed on the repository
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   141
    side.
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   142
    """
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   143
    def __init__(self, cnx, read=None, write=None):
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   144
        self.cnx = cnx
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   145
        self.read = read
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   146
        self.write = write
8816
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   147
        self.oldread = None
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   148
        self.oldwrite = None
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   149
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   150
    def __enter__(self):
8816
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   151
        if self.read is None:
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   152
            self.oldread = None
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   153
        else:
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   154
            self.oldread = self.cnx.read_security
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   155
            self.cnx.read_security = self.read
8816
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   156
        if self.write is None:
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   157
            self.oldwrite = None
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   158
        else:
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   159
            self.oldwrite = self.cnx.write_security
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   160
            self.cnx.write_security = self.write
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   161
        self.cnx.ctx_count += 1
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   162
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   163
    def __exit__(self, exctype, exc, traceback):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   164
        self.cnx.ctx_count -= 1
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   165
        if self.oldread is not None:
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   166
            self.cnx.read_security = self.oldread
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   167
        if self.oldwrite is not None:
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   168
            self.cnx.write_security = self.oldwrite
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   169
8765
9e9029ba2d4e [session] Move hook control constants out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8764
diff changeset
   170
HOOKS_ALLOW_ALL = object()
9e9029ba2d4e [session] Move hook control constants out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8764
diff changeset
   171
HOOKS_DENY_ALL = object()
8767
a75670ef2d87 [session] move security constant out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8766
diff changeset
   172
DEFAULT_SECURITY = object() # evaluated to true by design
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   173
8809
9ee4d0c65ad2 [session] use a dedicated class to track cnxset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8808
diff changeset
   174
class SessionClosedError(RuntimeError):
9ee4d0c65ad2 [session] use a dedicated class to track cnxset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8808
diff changeset
   175
    pass
9ee4d0c65ad2 [session] use a dedicated class to track cnxset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8808
diff changeset
   176
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   177
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   178
def _open_only(func):
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   179
    """decorator for Connection method that check it is open"""
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   180
    @functools.wraps(func)
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   181
    def check_open(cnx, *args, **kwargs):
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   182
        if not cnx._open:
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   183
            raise ProgrammingError('Closed Connection: %s'
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   184
                                    % cnx.connectionid)
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   185
        return func(cnx, *args, **kwargs)
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   186
    return check_open
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   187
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9629
diff changeset
   188
9073
9574df1cd054 [Connection] inherit from RequestSessionBase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   189
class Connection(RequestSessionBase):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   190
    """Repository Connection
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   191
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   192
    Holds all connection related data
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   193
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   194
    Database connection resources:
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   195
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   196
      :attr:`hooks_in_progress`, boolean flag telling if the executing
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   197
      query is coming from a repoapi connection or is a query from
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   198
      within the repository (e.g. started by hooks)
8805
d91285fe7242 [transaction] initialize dbapi_request in __init__
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8790
diff changeset
   199
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   200
      :attr:`cnxset`, the connections set to use to execute queries on sources.
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   201
      If the transaction is read only, the connection set may be freed between
9402
2c48c091b6a2 merge 3.18.0 in 3.19 branch
Julien Cristau <julien.cristau@logilab.fr>
parents: 9123 9396
diff changeset
   202
      actual queries. This allows multiple connections with a reasonably low
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   203
      connection set pool size.  Control mechanism is detailed below.
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   204
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   205
    .. automethod:: cubicweb.server.session.Connection.set_cnxset
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   206
    .. automethod:: cubicweb.server.session.Connection.free_cnxset
8843
ea05b8545dd8 [session/transaction] handle cnxset repository logic in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8842
diff changeset
   207
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   208
      :attr:`mode`, string telling the connections set handling mode, may be one
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   209
      of 'read' (connections set may be freed), 'write' (some write was done in
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   210
      the connections set, it can't be freed before end of the transaction),
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   211
      'transaction' (we want to keep the connections set during all the
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   212
      transaction, with or without writing)
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   213
10347
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   214
    Shared data:
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   215
10347
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   216
      :attr:`data` is a dictionary bound to the underlying session,
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   217
      who will be present for the life time of the session. This may
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   218
      be useful for web clients that rely on the server for managing
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   219
      bits of session-scoped data.
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   220
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   221
      :attr:`transaction_data` is a dictionary cleared at the end of
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   222
      the transaction. Hooks and operations may put arbitrary data in
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   223
      there.
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   224
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   225
    Internal state:
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   226
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   227
      :attr:`pending_operations`, ordered list of operations to be processed on
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   228
      commit/rollback
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   229
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   230
      :attr:`commit_state`, describing the transaction commit state, may be one
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   231
      of None (not yet committing), 'precommit' (calling precommit event on
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   232
      operations), 'postcommit' (calling postcommit event on operations),
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   233
      'uncommitable' (some :exc:`ValidationError` or :exc:`Unauthorized` error
9267
24d9b86dfa54 spelling: rollbacked -> rolled back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9240
diff changeset
   234
      has been raised during the transaction and so it must be rolled back).
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   235
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   236
    Hooks controls:
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   237
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   238
      :attr:`hooks_mode`, may be either `HOOKS_ALLOW_ALL` or `HOOKS_DENY_ALL`.
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   239
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   240
      :attr:`enabled_hook_cats`, when :attr:`hooks_mode` is
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   241
      `HOOKS_DENY_ALL`, this set contains hooks categories that are enabled.
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   242
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   243
      :attr:`disabled_hook_cats`, when :attr:`hooks_mode` is
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   244
      `HOOKS_ALLOW_ALL`, this set contains hooks categories that are disabled.
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   245
8768
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   246
    Security level Management:
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   247
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   248
      :attr:`read_security` and :attr:`write_security`, boolean flags telling if
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   249
      read/write security is currently activated.
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   250
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   251
    """
9085
af6085c9ac69 [connection] mark Connection as "not a request"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9084
diff changeset
   252
    is_request = False
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   253
    hooks_in_progress = False
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   254
    is_repo_in_memory = True # bw compat
9085
af6085c9ac69 [connection] mark Connection as "not a request"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9084
diff changeset
   255
10359
8e4ba1028f55 [session/cnx] remove `session_handled` logic
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10355
diff changeset
   256
    def __init__(self, session):
9073
9574df1cd054 [Connection] inherit from RequestSessionBase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   257
        # using super(Connection, self) confuse some test hack
9574df1cd054 [Connection] inherit from RequestSessionBase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   258
        RequestSessionBase.__init__(self, session.vreg)
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   259
        #: connection unique id
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   260
        self._open = None
10359
8e4ba1028f55 [session/cnx] remove `session_handled` logic
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10355
diff changeset
   261
        self.connectionid = '%s-%s' % (session.sessionid, uuid4().hex)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   262
        self.session = session
9493
852f5ac90cd9 [server/session] session.id → session.sessionid
Julien Cristau <julien.cristau@logilab.fr>
parents: 9482
diff changeset
   263
        self.sessionid = session.sessionid
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   264
        #: reentrance handling
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   265
        self.ctx_count = 0
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   266
8842
63fa6b02b241 [transaction] keep a reference to the repo object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8841
diff changeset
   267
        #: server.Repository object
63fa6b02b241 [transaction] keep a reference to the repo object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8841
diff changeset
   268
        self.repo = session.repo
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   269
        self.vreg = self.repo.vreg
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   270
        self._execute = self.repo.querier.execute
8842
63fa6b02b241 [transaction] keep a reference to the repo object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8841
diff changeset
   271
9089
b4c12d2873f6 [connection] Connection.execute touch Session timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9088
diff changeset
   272
        # other session utility
b4c12d2873f6 [connection] Connection.execute touch Session timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9088
diff changeset
   273
        self._session_timestamp = session._timestamp
8842
63fa6b02b241 [transaction] keep a reference to the repo object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8841
diff changeset
   274
9023
67f242261dd3 [connection] give access to is_internal_session boolean
pierre-yves
parents: 9022
diff changeset
   275
        # internal (root) session
10345
ef54ea75a642 [server] drop repo.internal_session and InternalSession
Julien Cristau <julien.cristau@logilab.fr>
parents: 10301
diff changeset
   276
        self.is_internal_session = isinstance(session.user, InternalManager)
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   277
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   278
        #: dict containing arbitrary data cleared at the end of the transaction
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   279
        self.transaction_data = {}
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   280
        self._session_data = session.data
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   281
        #: ordered list of operations to be processed on commit/rollback
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   282
        self.pending_operations = []
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   283
        #: (None, 'precommit', 'postcommit', 'uncommitable')
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   284
        self.commit_state = None
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   285
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   286
        ### hook control attribute
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   287
        self.hooks_mode = HOOKS_ALLOW_ALL
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   288
        self.disabled_hook_cats = set()
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   289
        self.enabled_hook_cats = set()
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   290
        self.pruned_hooks_cache = {}
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   291
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   292
8768
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   293
        ### security control attributes
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   294
        self._read_security = DEFAULT_SECURITY # handled by a property
8768
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   295
        self.write_security = DEFAULT_SECURITY
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   296
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   297
        # undo control
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   298
        config = session.repo.config
10345
ef54ea75a642 [server] drop repo.internal_session and InternalSession
Julien Cristau <julien.cristau@logilab.fr>
parents: 10301
diff changeset
   299
        if config.creating or config.repairing or self.is_internal_session:
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   300
            self.undo_actions = False
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   301
        else:
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   302
            self.undo_actions = config['undo-enabled']
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   303
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   304
        # RQLRewriter are not thread safe
9090
e33ff287f082 [connection] pass a Connection object to RQLRewriter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9089
diff changeset
   305
        self._rewriter = RQLRewriter(self)
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   306
9088
04ceb4268b3b [connection] Connection now call _set_user to CWUser object linked to itseld
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9087
diff changeset
   307
        # other session utility
04ceb4268b3b [connection] Connection now call _set_user to CWUser object linked to itseld
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9087
diff changeset
   308
        if session.user.login == '__internal_manager__':
04ceb4268b3b [connection] Connection now call _set_user to CWUser object linked to itseld
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9087
diff changeset
   309
            self.user = session.user
9764
e81facdef9b5 [connection] set language on new Connection for the internal manager
Julien Cristau <julien.cristau@logilab.fr>
parents: 9721
diff changeset
   310
            self.set_language(self.user.prefered_language())
9088
04ceb4268b3b [connection] Connection now call _set_user to CWUser object linked to itseld
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9087
diff changeset
   311
        else:
04ceb4268b3b [connection] Connection now call _set_user to CWUser object linked to itseld
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9087
diff changeset
   312
            self._set_user(session.user)
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   313
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   314
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   315
    def source_defs(self):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   316
        """Return the definition of sources used by the repository."""
10355
60b8204fcca3 [session] all cnx._session become cnx.session
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10352
diff changeset
   317
        return self.session.repo.source_defs()
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   318
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   319
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   320
    def get_schema(self):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   321
        """Return the schema currently used by the repository."""
10355
60b8204fcca3 [session] all cnx._session become cnx.session
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10352
diff changeset
   322
        return self.session.repo.source_defs()
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   323
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   324
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   325
    def get_option_value(self, option):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   326
        """Return the value for `option` in the configuration."""
10355
60b8204fcca3 [session] all cnx._session become cnx.session
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10352
diff changeset
   327
        return self.session.repo.get_option_value(option)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   328
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   329
    # transaction api
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   330
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   331
    @_open_only
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   332
    def undoable_transactions(self, ueid=None, **actionfilters):
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   333
        """Return a list of undoable transaction objects by the connection's
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   334
        user, ordered by descendant transaction time.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   335
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   336
        Managers may filter according to user (eid) who has done the transaction
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   337
        using the `ueid` argument. Others will only see their own transactions.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   338
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   339
        Additional filtering capabilities is provided by using the following
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   340
        named arguments:
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   341
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   342
        * `etype` to get only transactions creating/updating/deleting entities
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   343
          of the given type
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   344
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   345
        * `eid` to get only transactions applied to entity of the given eid
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   346
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   347
        * `action` to get only transactions doing the given action (action in
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   348
          'C', 'U', 'D', 'A', 'R'). If `etype`, action can only be 'C', 'U' or
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   349
          'D'.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   350
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   351
        * `public`: when additional filtering is provided, they are by default
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   352
          only searched in 'public' actions, unless a `public` argument is given
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   353
          and set to false.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   354
        """
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   355
        return self.repo.system_source.undoable_transactions(self, ueid,
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   356
                                                             **actionfilters)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   357
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   358
    @_open_only
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   359
    def transaction_info(self, txuuid):
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   360
        """Return transaction object for the given uid.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   361
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   362
        raise `NoSuchTransaction` if not found or if session's user is
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   363
        not allowed (eg not in managers group and the transaction
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   364
        doesn't belong to him).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   365
        """
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   366
        return self.repo.system_source.tx_info(self, txuuid)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   367
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   368
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   369
    def transaction_actions(self, txuuid, public=True):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   370
        """Return an ordered list of actions effectued during that transaction.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   371
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   372
        If public is true, return only 'public' actions, i.e. not ones
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   373
        triggered under the cover by hooks, else return all actions.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   374
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   375
        raise `NoSuchTransaction` if the transaction is not found or
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   376
        if the user is not allowed (eg not in managers group).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   377
        """
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   378
        return self.repo.system_source.tx_actions(self, txuuid, public)
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   379
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   380
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   381
    def undo_transaction(self, txuuid):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   382
        """Undo the given transaction. Return potential restoration errors.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   383
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   384
        raise `NoSuchTransaction` if not found or if user is not
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   385
        allowed (eg not in managers group).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   386
        """
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   387
        return self.repo.system_source.undo_transaction(self, txuuid)
9089
b4c12d2873f6 [connection] Connection.execute touch Session timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9088
diff changeset
   388
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   389
    # life cycle handling ####################################################
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   390
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   391
    def __enter__(self):
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   392
        assert self._open is None # first opening
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   393
        self._open = True
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   394
        self.cnxset = self.repo._get_cnxset()
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   395
        return self
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   396
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   397
    def __exit__(self, exctype=None, excvalue=None, tb=None):
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   398
        assert self._open # actually already open
10435
5b33ca2c61e0 [server/session] Roll back in connection exit
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10366
diff changeset
   399
        self.rollback()
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   400
        self._open = False
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   401
        self.cnxset.cnxset_freed()
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   402
        self.repo._free_cnxset(self.cnxset)
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   403
        self.cnxset = None
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   404
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   405
    @contextmanager
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   406
    def running_hooks_ops(self):
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   407
        """this context manager should be called whenever hooks or operations
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   408
        are about to be run (but after hook selection)
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   409
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   410
        It will help the undo logic record pertinent metadata or some
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   411
        hooks to run (or not) depending on who/what issued the query.
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   412
        """
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   413
        prevmode = self.hooks_in_progress
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   414
        self.hooks_in_progress = True
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   415
        yield
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   416
        self.hooks_in_progress = prevmode
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   417
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   418
    # shared data handling ###################################################
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   419
8779
9b2f68916474 [transaction] rename transaction_data to data
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8778
diff changeset
   420
    @property
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   421
    def data(self):
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   422
        return self._session_data
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   423
9083
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   424
    @property
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   425
    def rql_rewriter(self):
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   426
        return self._rewriter
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   427
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   428
    @_open_only
10171
f4f9bff9cf06 [server] Increase the stacklevel (due to @_open_only decorator)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10074
diff changeset
   429
    @deprecated('[3.19] use session or transaction data', stacklevel=3)
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   430
    def get_shared_data(self, key, default=None, pop=False, txdata=False):
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   431
        """return value associated to `key` in session data"""
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   432
        if txdata:
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   433
            data = self.transaction_data
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   434
        else:
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   435
            data = self._session_data
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   436
        if pop:
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   437
            return data.pop(key, default)
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   438
        else:
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   439
            return data.get(key, default)
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   440
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   441
    @_open_only
10171
f4f9bff9cf06 [server] Increase the stacklevel (due to @_open_only decorator)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10074
diff changeset
   442
    @deprecated('[3.19] use session or transaction data', stacklevel=3)
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   443
    def set_shared_data(self, key, value, txdata=False):
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   444
        """set value associated to `key` in session data"""
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   445
        if txdata:
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   446
            self.transaction_data[key] = value
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   447
        else:
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   448
            self._session_data[key] = value
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4834
diff changeset
   449
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   450
    def clear(self):
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   451
        """reset internal data"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   452
        self.transaction_data = {}
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   453
        #: ordered list of operations to be processed on commit/rollback
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   454
        self.pending_operations = []
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   455
        #: (None, 'precommit', 'postcommit', 'uncommitable')
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   456
        self.commit_state = None
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   457
        self.pruned_hooks_cache = {}
9082
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
   458
        self.local_perm_cache.clear()
9090
e33ff287f082 [connection] pass a Connection object to RQLRewriter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9089
diff changeset
   459
        self.rewriter = RQLRewriter(self)
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   460
9404
3e3e9b37e177 fix version number: we still target cw 3.19
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9403
diff changeset
   461
    @deprecated('[3.19] cnxset are automatically managed now.'
9123
c992811edec2 [connection] deprecated free_cnset and set_cnxset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9122
diff changeset
   462
                ' stop using explicit set and free.')
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   463
    def set_cnxset(self):
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   464
        pass
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   465
9404
3e3e9b37e177 fix version number: we still target cw 3.19
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9403
diff changeset
   466
    @deprecated('[3.19] cnxset are automatically managed now.'
9123
c992811edec2 [connection] deprecated free_cnset and set_cnxset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9122
diff changeset
   467
                ' stop using explicit set and free.')
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   468
    def free_cnxset(self, ignoremode=False):
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   469
        pass
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   470
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   471
    @property
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   472
    @contextmanager
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   473
    @_open_only
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   474
    @deprecated('[3.21] a cnxset is automatically set on __enter__ call now.'
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   475
                ' stop using .ensure_cnx_set')
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   476
    def ensure_cnx_set(self):
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   477
        yield
8843
ea05b8545dd8 [session/transaction] handle cnxset repository logic in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8842
diff changeset
   478
10485
9d2416a504d3 [server/session] bring anonymous_connection back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10435
diff changeset
   479
    @property
9d2416a504d3 [server/session] bring anonymous_connection back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10435
diff changeset
   480
    def anonymous_connection(self):
9d2416a504d3 [server/session] bring anonymous_connection back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10435
diff changeset
   481
        return self.session.anonymous_session
9d2416a504d3 [server/session] bring anonymous_connection back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10435
diff changeset
   482
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   483
    # Entity cache management #################################################
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   484
    #
9402
2c48c091b6a2 merge 3.18.0 in 3.19 branch
Julien Cristau <julien.cristau@logilab.fr>
parents: 9123 9396
diff changeset
   485
    # The connection entity cache as held in cnx.transaction_data is removed at the
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   486
    # end of the connection (commit and rollback)
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   487
    #
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   488
    # XXX connection level caching may be a pb with multiple repository
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   489
    # instances, but 1. this is probably not the only one :$ and 2. it may be
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   490
    # an acceptable risk. Anyway we could activate it or not according to a
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   491
    # configuration option
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   492
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   493
    def set_entity_cache(self, entity):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   494
        """Add `entity` to the connection entity cache"""
9113
af6efc15fc90 [repository] add an ``internal_cnx`` method to replace ``internal_session``
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9112
diff changeset
   495
        # XXX not using _open_only because before at creation time. _set_user
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   496
        # call this function to cache the Connection user.
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   497
        if entity.cw_etype != 'CWUser' and not self._open:
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   498
            raise ProgrammingError('Closed Connection: %s'
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   499
                                    % self.connectionid)
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   500
        ecache = self.transaction_data.setdefault('ecache', {})
8784
07f453bf72e8 [transaction] small simplification in ecache code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8783
diff changeset
   501
        ecache.setdefault(entity.eid, entity)
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   502
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   503
    @_open_only
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   504
    def entity_cache(self, eid):
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   505
        """get cache entity for `eid`"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   506
        return self.transaction_data['ecache'][eid]
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   507
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   508
    @_open_only
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   509
    def cached_entities(self):
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   510
        """return the whole entity cache"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   511
        return self.transaction_data.get('ecache', {}).values()
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   512
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   513
    @_open_only
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   514
    def drop_entity_cache(self, eid=None):
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   515
        """drop entity from the cache
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   516
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   517
        If eid is None, the whole cache is dropped"""
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   518
        if eid is None:
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   519
            self.transaction_data.pop('ecache', None)
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   520
        else:
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   521
            del self.transaction_data['ecache'][eid]
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   522
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   523
    # relations handling #######################################################
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   524
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   525
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   526
    def add_relation(self, fromeid, rtype, toeid):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   527
        """provide direct access to the repository method to add a relation.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   528
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   529
        This is equivalent to the following rql query:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   530
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   531
          SET X rtype Y WHERE X eid  fromeid, T eid toeid
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   532
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   533
        without read security check but also all the burden of rql execution.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   534
        You may use this in hooks when you know both eids of the relation you
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   535
        want to add.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   536
        """
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   537
        self.add_relations([(rtype, [(fromeid,  toeid)])])
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   538
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   539
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   540
    def add_relations(self, relations):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   541
        '''set many relation using a shortcut similar to the one in add_relation
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   542
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   543
        relations is a list of 2-uples, the first element of each
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   544
        2-uple is the rtype, and the second is a list of (fromeid,
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   545
        toeid) tuples
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   546
        '''
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   547
        edited_entities = {}
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   548
        relations_dict = {}
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   549
        with self.security_enabled(False, False):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   550
            for rtype, eids in relations:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   551
                if self.vreg.schema[rtype].inlined:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   552
                    for fromeid, toeid in eids:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   553
                        if fromeid not in edited_entities:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   554
                            entity = self.entity_from_eid(fromeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   555
                            edited = EditedEntity(entity)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   556
                            edited_entities[fromeid] = edited
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   557
                        else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   558
                            edited = edited_entities[fromeid]
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   559
                        edited.edited_attribute(rtype, toeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   560
                else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   561
                    relations_dict[rtype] = eids
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   562
            self.repo.glob_add_relations(self, relations_dict)
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10589
diff changeset
   563
            for edited in edited_entities.values():
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   564
                self.repo.glob_update_entity(self, edited)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   565
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   566
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   567
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   568
    def delete_relation(self, fromeid, rtype, toeid):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   569
        """provide direct access to the repository method to delete a relation.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   570
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   571
        This is equivalent to the following rql query:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   572
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   573
          DELETE X rtype Y WHERE X eid  fromeid, T eid toeid
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   574
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   575
        without read security check but also all the burden of rql execution.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   576
        You may use this in hooks when you know both eids of the relation you
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   577
        want to delete.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   578
        """
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   579
        with self.security_enabled(False, False):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   580
            if self.vreg.schema[rtype].inlined:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   581
                entity = self.entity_from_eid(fromeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   582
                entity.cw_attr_cache[rtype] = None
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   583
                self.repo.glob_update_entity(self, entity, set((rtype,)))
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   584
            else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   585
                self.repo.glob_delete_relation(self, fromeid, rtype, toeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   586
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   587
    # relations cache handling #################################################
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   588
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   589
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   590
    def update_rel_cache_add(self, subject, rtype, object, symmetric=False):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   591
        self._update_entity_rel_cache_add(subject, rtype, 'subject', object)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   592
        if symmetric:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   593
            self._update_entity_rel_cache_add(object, rtype, 'subject', subject)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   594
        else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   595
            self._update_entity_rel_cache_add(object, rtype, 'object', subject)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   596
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   597
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   598
    def update_rel_cache_del(self, subject, rtype, object, symmetric=False):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   599
        self._update_entity_rel_cache_del(subject, rtype, 'subject', object)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   600
        if symmetric:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   601
            self._update_entity_rel_cache_del(object, rtype, 'object', object)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   602
        else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   603
            self._update_entity_rel_cache_del(object, rtype, 'object', subject)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   604
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   605
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   606
    def _update_entity_rel_cache_add(self, eid, rtype, role, targeteid):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   607
        try:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   608
            entity = self.entity_cache(eid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   609
        except KeyError:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   610
            return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   611
        rcache = entity.cw_relation_cached(rtype, role)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   612
        if rcache is not None:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   613
            rset, entities = rcache
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   614
            rset = rset.copy()
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   615
            entities = list(entities)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   616
            rset.rows.append([targeteid])
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   617
            if not isinstance(rset.description, list): # else description not set
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   618
                rset.description = list(rset.description)
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9468
diff changeset
   619
            rset.description.append([self.entity_metas(targeteid)['type']])
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   620
            targetentity = self.entity_from_eid(targeteid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   621
            if targetentity.cw_rset is None:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   622
                targetentity.cw_rset = rset
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   623
                targetentity.cw_row = rset.rowcount
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   624
                targetentity.cw_col = 0
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   625
            rset.rowcount += 1
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   626
            entities.append(targetentity)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   627
            entity._cw_related_cache['%s_%s' % (rtype, role)] = (
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   628
                rset, tuple(entities))
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   629
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   630
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   631
    def _update_entity_rel_cache_del(self, eid, rtype, role, targeteid):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   632
        try:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   633
            entity = self.entity_cache(eid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   634
        except KeyError:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   635
            return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   636
        rcache = entity.cw_relation_cached(rtype, role)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   637
        if rcache is not None:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   638
            rset, entities = rcache
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   639
            for idx, row in enumerate(rset.rows):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   640
                if row[0] == targeteid:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   641
                    break
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   642
            else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   643
                # this may occurs if the cache has been filed by a hook
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   644
                # after the database update
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   645
                self.debug('cache inconsistency for %s %s %s %s', eid, rtype,
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   646
                           role, targeteid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   647
                return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   648
            rset = rset.copy()
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   649
            entities = list(entities)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   650
            del rset.rows[idx]
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   651
            if isinstance(rset.description, list): # else description not set
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   652
                del rset.description[idx]
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   653
            del entities[idx]
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   654
            rset.rowcount -= 1
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   655
            entity._cw_related_cache['%s_%s' % (rtype, role)] = (
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   656
                rset, tuple(entities))
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   657
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   658
    # Tracking of entities added of removed in the transaction ##################
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   659
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   660
    @_open_only
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   661
    def deleted_in_transaction(self, eid):
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   662
        """return True if the entity of the given eid is being deleted in the
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   663
        current transaction
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   664
        """
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   665
        return eid in self.transaction_data.get('pendingeids', ())
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   666
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   667
    @_open_only
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   668
    def added_in_transaction(self, eid):
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   669
        """return True if the entity of the given eid is being created in the
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   670
        current transaction
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   671
        """
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   672
        return eid in self.transaction_data.get('neweids', ())
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   673
8786
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   674
    # Operation management ####################################################
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   675
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   676
    @_open_only
8786
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   677
    def add_operation(self, operation, index=None):
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   678
        """add an operation to be executed at the end of the transaction"""
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   679
        if index is None:
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   680
            self.pending_operations.append(operation)
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   681
        else:
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   682
            self.pending_operations.insert(index, operation)
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   683
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   684
    # Hooks control ###########################################################
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   685
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   686
    @_open_only
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   687
    def allow_all_hooks_but(self, *categories):
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   688
        return _hooks_control(self, HOOKS_ALLOW_ALL, *categories)
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   689
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   690
    @_open_only
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   691
    def deny_all_hooks_but(self, *categories):
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   692
        return _hooks_control(self, HOOKS_DENY_ALL, *categories)
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   693
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   694
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   695
    def disable_hook_categories(self, *categories):
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   696
        """disable the given hook categories:
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   697
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   698
        - on HOOKS_DENY_ALL mode, ensure those categories are not enabled
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   699
        - on HOOKS_ALLOW_ALL mode, ensure those categories are disabled
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   700
        """
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   701
        changes = set()
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   702
        self.pruned_hooks_cache.clear()
8789
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   703
        categories = set(categories)
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   704
        if self.hooks_mode is HOOKS_DENY_ALL:
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   705
            enabledcats = self.enabled_hook_cats
8789
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   706
            changes = enabledcats & categories
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   707
            enabledcats -= changes # changes is small hence faster
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   708
        else:
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   709
            disabledcats = self.disabled_hook_cats
8789
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   710
            changes = categories - disabledcats
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   711
            disabledcats |= changes # changes is small hence faster
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   712
        return tuple(changes)
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   713
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   714
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   715
    def enable_hook_categories(self, *categories):
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   716
        """enable the given hook categories:
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   717
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   718
        - on HOOKS_DENY_ALL mode, ensure those categories are enabled
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   719
        - on HOOKS_ALLOW_ALL mode, ensure those categories are not disabled
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   720
        """
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   721
        changes = set()
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   722
        self.pruned_hooks_cache.clear()
8789
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   723
        categories = set(categories)
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   724
        if self.hooks_mode is HOOKS_DENY_ALL:
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   725
            enabledcats = self.enabled_hook_cats
8789
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   726
            changes = categories - enabledcats
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   727
            enabledcats |= changes # changes is small hence faster
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   728
        else:
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   729
            disabledcats = self.disabled_hook_cats
8789
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   730
            changes = disabledcats & categories
465a87e6a89a [transaction] use set operation in the hook control code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8788
diff changeset
   731
            disabledcats -= changes # changes is small hence faster
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   732
        return tuple(changes)
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   733
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   734
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   735
    def is_hook_category_activated(self, category):
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   736
        """return a boolean telling if the given category is currently activated
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   737
        or not
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   738
        """
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   739
        if self.hooks_mode is HOOKS_DENY_ALL:
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   740
            return category in self.enabled_hook_cats
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   741
        return category not in self.disabled_hook_cats
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   742
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   743
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   744
    def is_hook_activated(self, hook):
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   745
        """return a boolean telling if the given hook class is currently
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   746
        activated or not
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   747
        """
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   748
        return self.is_hook_category_activated(hook.category)
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   749
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   750
    # Security management #####################################################
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   751
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   752
    @_open_only
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   753
    def security_enabled(self, read=None, write=None):
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   754
        return _security_enabled(self, read=read, write=write)
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   755
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   756
    @property
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   757
    @_open_only
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   758
    def read_security(self):
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   759
        return self._read_security
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   760
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   761
    @read_security.setter
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   762
    @_open_only
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   763
    def read_security(self, activated):
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   764
        self._read_security = activated
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   765
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   766
    # undo support ############################################################
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   767
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   768
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   769
    def ertype_supports_undo(self, ertype):
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   770
        return self.undo_actions and ertype not in NO_UNDO_TYPES
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   771
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   772
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   773
    def transaction_uuid(self, set=True):
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   774
        uuid = self.transaction_data.get('tx_uuid')
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   775
        if set and uuid is None:
10752
c69f109293f2 [server/session] unicode → six.text_type
Julien Cristau <julien.cristau@logilab.fr>
parents: 10737
diff changeset
   776
            self.transaction_data['tx_uuid'] = uuid = text_type(uuid4().hex)
9075
8d36838ccb3e [connection] move last part of undo logic in connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9074
diff changeset
   777
            self.repo.system_source.start_undoable_transaction(self, uuid)
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   778
        return uuid
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   779
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   780
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   781
    def transaction_inc_action_counter(self):
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   782
        num = self.transaction_data.setdefault('tx_action_count', 0) + 1
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   783
        self.transaction_data['tx_action_count'] = num
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   784
        return num
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   785
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   786
    # db-api like interface ###################################################
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   787
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   788
    @_open_only
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   789
    def source_defs(self):
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   790
        return self.repo.source_defs()
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   791
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9468
diff changeset
   792
    @deprecated('[3.19] use .entity_metas(eid) instead')
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   793
    @_open_only
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   794
    def describe(self, eid, asdict=False):
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   795
        """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: 9468
diff changeset
   796
        etype, extid, source = self.repo.type_and_source_from_eid(eid, self)
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9468
diff changeset
   797
        metas = {'type': etype, 'source': source, 'extid': extid}
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   798
        if asdict:
10228
d8a208f7e3d1 [server/session] Fix typo "meta vs. metas" in describe()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10059
diff changeset
   799
            metas['asource'] = metas['source'] # XXX pre 3.19 client compat
d8a208f7e3d1 [server/session] Fix typo "meta vs. metas" in describe()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10059
diff changeset
   800
            return metas
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9468
diff changeset
   801
        return etype, source, extid
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   802
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   803
    @_open_only
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9468
diff changeset
   804
    def entity_metas(self, eid):
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9468
diff changeset
   805
        """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: 9468
diff changeset
   806
        etype, extid, source = self.repo.type_and_source_from_eid(eid, self)
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9468
diff changeset
   807
        return {'type': etype, 'source': source, 'extid': extid}
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   808
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   809
    # core method #############################################################
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   810
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   811
    @_open_only
10005
7769d0f61810 remove leftover pre 3.9 deprecation warnings
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9979
diff changeset
   812
    def execute(self, rql, kwargs=None, build_descr=True):
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   813
        """db-api like method directly linked to the querier execute method.
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   814
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   815
        See :meth:`cubicweb.dbapi.Cursor.execute` documentation.
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   816
        """
9089
b4c12d2873f6 [connection] Connection.execute touch Session timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9088
diff changeset
   817
        self._session_timestamp.touch()
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   818
        rset = self._execute(self, rql, kwargs, build_descr)
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   819
        rset.req = self
9089
b4c12d2873f6 [connection] Connection.execute touch Session timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9088
diff changeset
   820
        self._session_timestamp.touch()
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   821
        return rset
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   822
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   823
    @_open_only
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   824
    def rollback(self, free_cnxset=None, reset_pool=None):
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   825
        """rollback the current transaction"""
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   826
        if free_cnxset is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   827
            warn('[3.21] free_cnxset is now unneeded',
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   828
                 DeprecationWarning, stacklevel=2)
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   829
        if reset_pool is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   830
            warn('[3.13] reset_pool is now unneeded',
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   831
                 DeprecationWarning, stacklevel=2)
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   832
        cnxset = self.cnxset
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   833
        assert cnxset is not None
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   834
        try:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   835
            # by default, operations are executed with security turned off
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   836
            with self.security_enabled(False, False):
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   837
                while self.pending_operations:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   838
                    try:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   839
                        operation = self.pending_operations.pop(0)
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   840
                        operation.handle_event('rollback_event')
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   841
                    except BaseException:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   842
                        self.critical('rollback error', exc_info=sys.exc_info())
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   843
                        continue
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   844
                cnxset.rollback()
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   845
                self.debug('rollback for transaction %s done', self.connectionid)
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   846
        finally:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   847
            self._session_timestamp.touch()
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   848
            self.clear()
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   849
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   850
    @_open_only
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   851
    def commit(self, free_cnxset=None, reset_pool=None):
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   852
        """commit the current session's transaction"""
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   853
        if free_cnxset is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   854
            warn('[3.21] free_cnxset is now unneeded',
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   855
                 DeprecationWarning, stacklevel=2)
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   856
        if reset_pool is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   857
            warn('[3.13] reset_pool is now unneeded',
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   858
                 DeprecationWarning, stacklevel=2)
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   859
        assert self.cnxset is not None
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   860
        cstate = self.commit_state
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   861
        if cstate == 'uncommitable':
9403
d81207fb9499 Fix a couple merge errors
Julien Cristau <julien.cristau@logilab.fr>
parents: 9402
diff changeset
   862
            raise QueryError('transaction must be rolled back')
10059
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   863
        if cstate == 'precommit':
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   864
            self.warn('calling commit in precommit makes no sense; ignoring commit')
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   865
            return
10059
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   866
        if cstate == 'postcommit':
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   867
            self.critical('postcommit phase is not allowed to write to the db; ignoring commit')
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   868
            return
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   869
        assert cstate is None
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   870
        # on rollback, an operation should have the following state
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   871
        # information:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   872
        # - processed by the precommit/commit event or not
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   873
        # - if processed, is it the failed operation
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   874
        debug = server.DEBUG & server.DBG_OPS
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   875
        try:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   876
            # by default, operations are executed with security turned off
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   877
            with self.security_enabled(False, False):
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   878
                processed = []
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   879
                self.commit_state = 'precommit'
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   880
                if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   881
                    print(self.commit_state, '*' * 20)
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   882
                try:
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   883
                    with self.running_hooks_ops():
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   884
                        while self.pending_operations:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   885
                            operation = self.pending_operations.pop(0)
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   886
                            operation.processed = 'precommit'
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   887
                            processed.append(operation)
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   888
                            if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   889
                                print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   890
                            operation.handle_event('precommit_event')
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   891
                    self.pending_operations[:] = processed
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   892
                    self.debug('precommit transaction %s done', self.connectionid)
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   893
                except BaseException:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   894
                    # if error on [pre]commit:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   895
                    #
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   896
                    # * set .failed = True on the operation causing the failure
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   897
                    # * call revert<event>_event on processed operations
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   898
                    # * call rollback_event on *all* operations
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   899
                    #
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   900
                    # that seems more natural than not calling rollback_event
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   901
                    # for processed operations, and allow generic rollback
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   902
                    # instead of having to implements rollback, revertprecommit
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   903
                    # and revertcommit, that will be enough in mont case.
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   904
                    operation.failed = True
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   905
                    if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   906
                        print(self.commit_state, '*' * 20)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   907
                    with self.running_hooks_ops():
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   908
                        for operation in reversed(processed):
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   909
                            if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   910
                                print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   911
                            try:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   912
                                operation.handle_event('revertprecommit_event')
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   913
                            except BaseException:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   914
                                self.critical('error while reverting precommit',
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   915
                                              exc_info=True)
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   916
                    # XXX use slice notation since self.pending_operations is a
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   917
                    # read-only property.
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   918
                    self.pending_operations[:] = processed + self.pending_operations
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   919
                    self.rollback()
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   920
                    raise
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   921
                self.cnxset.commit()
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   922
                self.commit_state = 'postcommit'
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   923
                if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   924
                    print(self.commit_state, '*' * 20)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   925
                with self.running_hooks_ops():
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   926
                    while self.pending_operations:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   927
                        operation = self.pending_operations.pop(0)
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   928
                        if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   929
                            print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   930
                        operation.processed = 'postcommit'
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   931
                        try:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   932
                            operation.handle_event('postcommit_event')
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   933
                        except BaseException:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   934
                            self.critical('error while postcommit',
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   935
                                          exc_info=sys.exc_info())
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   936
                self.debug('postcommit transaction %s done', self.connectionid)
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   937
                return self.transaction_uuid(set=False)
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   938
        finally:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   939
            self._session_timestamp.touch()
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   940
            self.clear()
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   941
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   942
    # resource accessors ######################################################
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   943
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   944
    @_open_only
9093
e2f88df79efd [connection] move call_service on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9092
diff changeset
   945
    def call_service(self, regid, **kwargs):
9721
2f08bd4c813b [server/session] remove json dumps around call_service
Julien Cristau <julien.cristau@logilab.fr>
parents: 9707
diff changeset
   946
        self.debug('calling service %s', regid)
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   947
        service = self.vreg['services'].select(regid, self, **kwargs)
9721
2f08bd4c813b [server/session] remove json dumps around call_service
Julien Cristau <julien.cristau@logilab.fr>
parents: 9707
diff changeset
   948
        return service.call(**kwargs)
9093
e2f88df79efd [connection] move call_service on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9092
diff changeset
   949
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   950
    @_open_only
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   951
    def system_sql(self, sql, args=None, rollback_on_failure=True):
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   952
        """return a sql cursor on the system database"""
9463
d62e13eba033 [multi-sources-removal] Simplify ConnectionsSet internal structures and public methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   953
        source = self.repo.system_source
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   954
        try:
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   955
            return source.doexec(self, sql, args, rollback=rollback_on_failure)
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   956
        except (source.OperationalError, source.InterfaceError):
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   957
            if not rollback_on_failure:
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   958
                raise
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   959
            source.warning("trying to reconnect")
9482
5b97e69f9c29 [server] fix TypeErrors
Julien Cristau <julien.cristau@logilab.fr>
parents: 9479
diff changeset
   960
            self.cnxset.reconnect()
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   961
            return source.doexec(self, sql, args, rollback=rollback_on_failure)
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   962
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   963
    @_open_only
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   964
    def rtype_eids_rdef(self, rtype, eidfrom, eidto):
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   965
        # use type_and_source_from_eid instead of type_from_eid for optimization
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   966
        # (avoid two extra methods call)
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   967
        subjtype = self.repo.type_and_source_from_eid(eidfrom, self)[0]
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   968
        objtype = self.repo.type_and_source_from_eid(eidto, self)[0]
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   969
        return self.vreg.schema.rschema(rtype).rdefs[(subjtype, objtype)]
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   970
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   971
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   972
def cnx_attr(attr_name, writable=False):
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   973
    """return a property to forward attribute access to connection.
8782
ee675f0a9612 [session] have a nice helper function to forward access to session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8781
diff changeset
   974
ee675f0a9612 [session] have a nice helper function to forward access to session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8781
diff changeset
   975
    This is to be used by session"""
8787
1b3b7284377f [session] allow writable tx_attr and use it for commit_state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8786
diff changeset
   976
    args = {}
9404
3e3e9b37e177 fix version number: we still target cw 3.19
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9403
diff changeset
   977
    @deprecated('[3.19] use a Connection object instead')
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   978
    def attr_from_cnx(session):
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   979
        return getattr(session._cnx, attr_name)
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   980
    args['fget'] = attr_from_cnx
8787
1b3b7284377f [session] allow writable tx_attr and use it for commit_state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8786
diff changeset
   981
    if writable:
9404
3e3e9b37e177 fix version number: we still target cw 3.19
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9403
diff changeset
   982
        @deprecated('[3.19] use a Connection object instead')
8787
1b3b7284377f [session] allow writable tx_attr and use it for commit_state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8786
diff changeset
   983
        def write_attr(session, value):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   984
            return setattr(session._cnx, attr_name, value)
8787
1b3b7284377f [session] allow writable tx_attr and use it for commit_state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8786
diff changeset
   985
        args['fset'] = write_attr
1b3b7284377f [session] allow writable tx_attr and use it for commit_state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8786
diff changeset
   986
    return property(**args)
8782
ee675f0a9612 [session] have a nice helper function to forward access to session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8781
diff changeset
   987
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   988
9081
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   989
class Timestamp(object):
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   990
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   991
    def __init__(self):
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   992
        self.value = time()
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   993
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   994
    def touch(self):
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   995
        self.value = time()
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   996
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   997
    def __float__(self):
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
   998
        return float(self.value)
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   999
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
  1000
10346
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1001
class Session(object):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
  1002
    """Repository user session
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
  1003
9143
1890e0df68fa [book] fix sphinx documentation generation (closes #2991997)
Julien Cristau <julien.cristau@logilab.fr>
parents: 8999
diff changeset
  1004
    This ties all together:
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
  1005
     * session id,
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
  1006
     * user,
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
  1007
     * other session data.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1008
    """
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1009
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1010
    def __init__(self, user, repo, cnxprops=None, _id=None):
10737
c5b048ae4df5 [server] don't convert user.login to bytes to generate sessionid
Julien Cristau <julien.cristau@logilab.fr>
parents: 10663
diff changeset
  1011
        self.sessionid = _id or make_uid(unormalize(user.login))
9122
1d109fb9c67c [session] deprecate all Connection related method on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9121
diff changeset
  1012
        self.user = user # XXX repoapi: deprecated and store only a login.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1013
        self.repo = repo
10346
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1014
        self.vreg = repo.vreg
9081
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
  1015
        self._timestamp = Timestamp()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1016
        self.data = {}
10346
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1017
        self.closed = False
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1018
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1019
    def close(self):
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1020
        self.closed = True
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1021
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1022
    def __enter__(self):
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1023
        return self
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1024
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1025
    def __exit__(self, *args):
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1026
        pass
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1027
4703
4e803c30b7db [session] user.login is usually an unicode string, so implements __unicode__ instead of __str__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4533
diff changeset
  1028
    def __unicode__(self):
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: 8626
diff changeset
  1029
        return '<session %s (%s 0x%x)>' % (
9493
852f5ac90cd9 [server/session] session.id → session.sessionid
Julien Cristau <julien.cristau@logilab.fr>
parents: 9482
diff changeset
  1030
            unicode(self.user.login), self.sessionid, id(self))
10346
b926ff4ef4a8 [repoapi,session] remove all session-as-cnx backward compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10345
diff changeset
  1031
9081
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
  1032
    @property
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
  1033
    def timestamp(self):
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
  1034
        return float(self._timestamp)
2604
6b55a2a81fd8 [R repo session] add_relation method use in hooks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2603
diff changeset
  1035
9049
9d62d53b49df [server/session] allow access to session id using sessionid
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9048
diff changeset
  1036
    @property
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9629
diff changeset
  1037
    @deprecated('[3.19] session.id is deprecated, use session.sessionid')
9122
1d109fb9c67c [session] deprecate all Connection related method on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9121
diff changeset
  1038
    def id(self):
1d109fb9c67c [session] deprecate all Connection related method on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9121
diff changeset
  1039
        return self.sessionid
2604
6b55a2a81fd8 [R repo session] add_relation method use in hooks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2603
diff changeset
  1040
9050
635862b48485 [server/session] add a login property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9049
diff changeset
  1041
    @property
635862b48485 [server/session] add a login property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9049
diff changeset
  1042
    def login(self):
635862b48485 [server/session] add a login property
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9049
diff changeset
  1043
        return self.user.login
8777
4e72b78ea5aa [session] split session creation from default session assignation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8776
diff changeset
  1044
9110
ed8b383d94fd [session] add a new_cnx factory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9109
diff changeset
  1045
    def new_cnx(self):
ed8b383d94fd [session] add a new_cnx factory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9109
diff changeset
  1046
        """Return a new Connection object linked to the session
8777
4e72b78ea5aa [session] split session creation from default session assignation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8776
diff changeset
  1047
9110
ed8b383d94fd [session] add a new_cnx factory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9109
diff changeset
  1048
        The returned Connection will *not* be managed by the Session.
ed8b383d94fd [session] add a new_cnx factory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9109
diff changeset
  1049
        """
ed8b383d94fd [session] add a new_cnx factory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9109
diff changeset
  1050
        return Connection(self)
ed8b383d94fd [session] add a new_cnx factory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9109
diff changeset
  1051
9404
3e3e9b37e177 fix version number: we still target cw 3.19
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9403
diff changeset
  1052
    @deprecated('[3.19] use a Connection object instead')
8585
3f60f416dddb [dbapi] provide get_option_value over DBAPIRequest (closes #2515522)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8529
diff changeset
  1053
    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
  1054
        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
  1055
            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
  1056
                 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
  1057
        return self.repo.get_option_value(option)
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: 5802
diff changeset
  1058
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1059
    def _touch(self):
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1060
        """update latest session usage timestamp and reset mode to read"""
9081
7c9a6dc4ee5d [session] use a rich object for timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9079
diff changeset
  1061
        self._timestamp.touch()
9082
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
  1062
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
  1063
    local_perm_cache = cnx_attr('local_perm_cache')
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
  1064
    @local_perm_cache.setter
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
  1065
    def local_perm_cache(self, value):
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
  1066
        #base class assign an empty dict:-(
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
  1067
        assert value == {}
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
  1068
        pass
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1069
2855
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
  1070
    # deprecated ###############################################################
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
  1071
9048
8481fc6aa6dd [server/session] Implement anonymous_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9047
diff changeset
  1072
    @property
8481fc6aa6dd [server/session] Implement anonymous_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9047
diff changeset
  1073
    def anonymous_session(self):
9979
9ccdb3751fbe [server] fix anonymous_user predicate in tests
Julien Cristau <julien.cristau@logilab.fr>
parents: 9934
diff changeset
  1074
        # XXX for now, anonymous_user only exists in webconfig (and testconfig).
9048
8481fc6aa6dd [server/session] Implement anonymous_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9047
diff changeset
  1075
        # It will only be present inside all-in-one instance.
8481fc6aa6dd [server/session] Implement anonymous_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9047
diff changeset
  1076
        # there is plan to move it down to global config.
9979
9ccdb3751fbe [server] fix anonymous_user predicate in tests
Julien Cristau <julien.cristau@logilab.fr>
parents: 9934
diff changeset
  1077
        if not hasattr(self.repo.config, 'anonymous_user'):
9ccdb3751fbe [server] fix anonymous_user predicate in tests
Julien Cristau <julien.cristau@logilab.fr>
parents: 9934
diff changeset
  1078
            # not a web or test config, no anonymous user
9ccdb3751fbe [server] fix anonymous_user predicate in tests
Julien Cristau <julien.cristau@logilab.fr>
parents: 9934
diff changeset
  1079
            return False
9ccdb3751fbe [server] fix anonymous_user predicate in tests
Julien Cristau <julien.cristau@logilab.fr>
parents: 9934
diff changeset
  1080
        return self.user.login == self.repo.config.anonymous_user()[0]
9048
8481fc6aa6dd [server/session] Implement anonymous_session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9047
diff changeset
  1081
7502
e7190f7e850e [session] deprecates schema_rproperty in favor of more optimized rtype_eids_rdef which return the rdef (so reusable to gather other data)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7500
diff changeset
  1082
    @deprecated('[3.13] use getattr(session.rtype_eids_rdef(rtype, eidfrom, eidto), prop)')
e7190f7e850e [session] deprecates schema_rproperty in favor of more optimized rtype_eids_rdef which return the rdef (so reusable to gather other data)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7500
diff changeset
  1083
    def schema_rproperty(self, rtype, eidfrom, eidto, rprop):
e7190f7e850e [session] deprecates schema_rproperty in favor of more optimized rtype_eids_rdef which return the rdef (so reusable to gather other data)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7500
diff changeset
  1084
        return getattr(self.rtype_eids_rdef(rtype, eidfrom, eidto), rprop)
e7190f7e850e [session] deprecates schema_rproperty in favor of more optimized rtype_eids_rdef which return the rdef (so reusable to gather other data)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7500
diff changeset
  1085
7083
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7054
diff changeset
  1086
    # these are overridden by set_log_methods below
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7054
diff changeset
  1087
    # only defining here to prevent pylint from complaining
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7054
diff changeset
  1088
    info = warning = error = critical = exception = debug = lambda msg,*a,**kw: None
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7054
diff changeset
  1089
8765
9e9029ba2d4e [session] Move hook control constants out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8764
diff changeset
  1090
9e9029ba2d4e [session] Move hook control constants out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8764
diff changeset
  1091
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1092
class InternalManager(object):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1093
    """a manager user with all access rights used internally for task such as
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1094
    bootstrapping the repository or creating regular users according to
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1095
    repository content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1096
    """
10345
ef54ea75a642 [server] drop repo.internal_session and InternalSession
Julien Cristau <julien.cristau@logilab.fr>
parents: 10301
diff changeset
  1097
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
  1098
    def __init__(self, lang='en'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1099
        self.eid = -1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1100
        self.login = u'__internal_manager__'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1101
        self.properties = {}
9087
dd26b4f95f90 [server/session] better faking of user for InternalManager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9086
diff changeset
  1102
        self.groups = set(['managers'])
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
  1103
        self.lang = lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1104
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1105
    def matching_groups(self, groups):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1106
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1107
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1108
    def is_in_group(self, group):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1109
        return True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1110
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1111
    def owns(self, eid):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1112
        return True
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1113
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1114
    def property_value(self, key):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1115
        if key == 'ui.language':
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
  1116
            return self.lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1117
        return None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1118
8563
d28ccecb7bf5 mock ``CWUser.prefered_language()`` on InternalManager objects.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8562
diff changeset
  1119
    def prefered_language(self, language=None):
d28ccecb7bf5 mock ``CWUser.prefered_language()`` on InternalManager objects.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8562
diff changeset
  1120
        # mock CWUser.prefered_language, mainly for testing purpose
d28ccecb7bf5 mock ``CWUser.prefered_language()`` on InternalManager objects.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8562
diff changeset
  1121
        return self.property_value('ui.language')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1122
8579
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1123
    # CWUser compat for notification ###########################################
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1124
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1125
    def name(self):
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1126
        return 'cubicweb'
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1127
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1128
    class _IEmailable:
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1129
        @staticmethod
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1130
        def get_email():
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1131
            return ''
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1132
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1133
    def cw_adapt_to(self, iface):
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1134
        if iface == 'IEmailable':
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1135
            return self._IEmailable
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
  1136
        return None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1137
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1138
from logging import getLogger
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1139
from cubicweb import set_log_methods
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1140
set_log_methods(Session, getLogger('cubicweb.session'))
9021
d8806996ac01 [connection] add logging method on connection
pierre-yves
parents: 9020
diff changeset
  1141
set_log_methods(Connection, getLogger('cubicweb.session'))