server/session.py
author Anthony Truchet <anthony.truchet@logilab.fr>
Mon, 27 Feb 2012 09:43:15 +0100
changeset 8265 9747ab9230ad
parent 8190 2a3c1b787688
child 8306 4da49700b06a
permissions -rw-r--r--
[repo, undo] Finish repository-side implementation of the undo feature (closes #893940) 1) Changes API for undo_transaction in order to raise an exception: the previous API returned a sequence of error, the user of the API needed to be careful to check explicitly. We change this for it to raise an UndoException with the list of errors as an attribute. 2) The server-side support for undoing update actions is finished 3) The configuration for `undo-support` is now a simple boolean Beware of the costs, both in DB space and in number of requests on the RDBMS backend, once this feture is activated. 4) Adds a txuuid param/attribute to the existing NoSuchTransaction exception.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
     1
# copyright 2003-2012 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."""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
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
    20
from __future__ import with_statement
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
    21
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    24
import sys
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
import threading
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
from time import time
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    27
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
    28
from warnings import warn
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
2613
5e19c2bb370e R [all] logilab.common 0.44 provides only deprecated
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2466
diff changeset
    30
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
    31
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
    32
from logilab.common.registry import objectify_predicate
6582
8eb7883b4223 [pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6427
diff changeset
    33
from rql import CoercionError
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    34
from rql.nodes import ETYPE_PYOBJ_MAP, etype_from_pyobj
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
from yams import BASE_TYPES
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
6385
9f91d09ee5fa [repo transaction] fix rollback behaviour as discussed on the mailing-list: instead of rollbacking automatically on Unauthorized/ValidationError, mark the transaction as uncommitable and disallow commiting
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6071
diff changeset
    37
from cubicweb import Binary, UnknownEid, QueryError, schema
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
    38
from cubicweb.req import RequestSessionBase
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
from cubicweb.dbapi import ConnectionProperties
5069
135c5d7b89d0 [querier] introduce RepeatList class, used to optimize size of data returned for result set description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5046
diff changeset
    40
from cubicweb.utils import make_uid, RepeatList
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
    41
from cubicweb.rqlrewrite import RQLRewriter
7573
c8f8762c986d [repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7526
diff changeset
    42
from cubicweb.server import ShuttingDown
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
    43
from cubicweb.server.edition import EditedEntity
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    45
1016
26387b836099 use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents: 985
diff changeset
    46
ETYPE_PYOBJ_MAP[Binary] = 'Bytes'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    48
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
    49
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
    50
# 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
    51
# 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
    52
# anyway in the later case
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    53
NO_UNDO_TYPES.add('is')
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    54
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
    55
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
    56
# XXX rememberme,forgotpwd,apycot,vcsfile
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    57
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
def _make_description(selected, args, solution):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
    """return a description for a result set"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
    description = []
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
    for term in selected:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
        description.append(term.get_type(solution, args))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
    return description
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
7969
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    65
def selection_idx_type(i, rqlst, args):
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    66
    """try to return type of term at index `i` of the rqlst's selection"""
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    67
    for select in rqlst.children:
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    68
        term = select.selection[i]
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    69
        for solution in select.solutions:
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    70
            try:
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    71
                ttype = term.get_type(solution, args)
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    72
                if ttype is not None:
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    73
                    return ttype
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    74
            except CoercionError:
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    75
                return None
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
    76
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    77
@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
    78
def is_user_session(cls, req, **kwargs):
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    79
    """repository side only predicate returning 1 if the session is a regular
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    80
    user session and not an 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
    81
    """
7330
584907154ce3 [session selector] missing not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7329
diff changeset
    82
    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
    83
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    84
@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
    85
def is_internal_session(cls, req, **kwargs):
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    86
    """repository side only predicate returning 1 if the session is not a regular
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    87
    user session but an 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
    88
    """
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    89
    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
    90
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    91
@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
    92
def repairing(cls, req, **kwargs):
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    93
    """repository side only predicate returning 1 if the session is not a regular
7500
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    94
    user session but an internal session
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    95
    """
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    96
    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
    97
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
7451
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
    99
class transaction(object):
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   100
    """context manager to enter a transaction for a session: when exiting the
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   101
    `with` block on exception, call `session.rollback()`, else call
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   102
    `session.commit()` on normal exit
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   103
    """
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   104
    def __init__(self, session, free_cnxset=True):
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   105
        self.session = session
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   106
        self.free_cnxset = free_cnxset
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   107
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   108
    def __enter__(self):
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   109
        pass
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   110
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   111
    def __exit__(self, exctype, exc, traceback):
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   112
        if exctype:
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   113
            self.session.rollback(free_cnxset=self.free_cnxset)
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   114
        else:
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   115
            self.session.commit(free_cnxset=self.free_cnxset)
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   116
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   117
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
   118
class hooks_control(object):
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
   119
    """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
   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
    If mode is session.`HOOKS_DENY_ALL`, given hooks categories will
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
   122
    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
   123
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
   124
    If mode is session.`HOOKS_ALLOW_ALL`, given hooks categories will
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
   125
    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
   126
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
   127
    .. 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
   128
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
   129
       with hooks_control(self.session, self.session.HOOKS_ALLOW_ALL, 'integrity'):
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
   130
           # ... 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
   131
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
   132
       with hooks_control(self.session, self.session.HOOKS_DENY_ALL, 'integrity'):
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
   133
           # ... do stuff with none but 'integrity' hooks activated
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
   134
    """
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
   135
    def __init__(self, session, mode, *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
   136
        self.session = session
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
   137
        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
   138
        self.categories = 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
   139
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
   140
    def __enter__(self):
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
   141
        self.oldmode, self.changes = self.session.init_hooks_mode_categories(
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
   142
            self.mode, self.categories)
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
   143
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
   144
    def __exit__(self, exctype, exc, traceback):
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
   145
        self.session.reset_hooks_mode_categories(self.oldmode, self.mode, 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
   146
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
   147
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
   148
class security_enabled(object):
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
    """context manager to control security w/ session.execute, since by
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
    default security is disabled on queries executed on the repository
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
   151
    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
   152
    """
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
   153
    def __init__(self, session, read=None, write=None):
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
   154
        self.session = session
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
   155
        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
   156
        self.write = write
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
   157
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
   158
    def __enter__(self):
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
   159
        self.oldread, self.oldwrite = self.session.init_security(
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
   160
            self.read, self.write)
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
   161
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
    def __exit__(self, exctype, exc, traceback):
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
   163
        self.session.reset_security(self.oldread, self.oldwrite)
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
   164
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
   165
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
   166
class TransactionData(object):
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
   167
    def __init__(self, txid):
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
   168
        self.transactionid = txid
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
   169
        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
   170
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
   171
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
   172
class Session(RequestSessionBase):
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   173
    """Repository usersession, tie a session id, user, connections set and
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   174
    other session data all together.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   175
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   176
    About session storage / transactions
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   177
    ------------------------------------
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   178
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   179
    Here is a description of internal session attributes. Besides :attr:`data`
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   180
    and :attr:`transaction_data`, you should not have to use attributes
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   181
    described here but higher level APIs.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   182
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   183
      :attr:`data` is a dictionary containing shared data, used to communicate
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   184
      extra information between the client and the repository
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   185
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   186
      :attr:`_tx_data` is a dictionary of :class:`TransactionData` instance, one
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   187
      for each running transaction. The key is the transaction id. By default
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   188
      the transaction id is the thread name but it can be otherwise (per dbapi
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   189
      cursor for instance, or per thread name *from another process*).
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   190
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   191
      :attr:`__threaddata` is a thread local storage whose `txdata` attribute
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   192
      refers to the proper instance of :class:`TransactionData` according to the
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   193
      transaction.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   194
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   195
      :attr:`_threads_in_transaction` is a set of (thread, connections set)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   196
      referencing threads that currently hold a connections set for the session.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   197
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   198
    You should not have to use neither :attr:`_txdata` nor :attr:`__threaddata`,
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   199
    simply access transaction data transparently through the :attr:`_threaddata`
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   200
    property. Also, you usually don't have to access it directly since current
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   201
    transaction's data may be accessed/modified through properties / methods:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   202
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   203
      :attr:`transaction_data`, similarly to :attr:`data`, is a dictionary
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   204
      containing some shared data that should be cleared at the end of the
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   205
      transaction. Hooks and operations may put arbitrary data in there, and
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   206
      this may also be used as a communication channel between the client and
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   207
      the repository.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   208
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   209
      :attr:`cnxset`, the connections set to use to execute queries on sources.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   210
      During a transaction, the connection set may be freed so that is may be
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   211
      used by another session as long as no writing is done. This means we can
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   212
      have multiple sessions with a reasonably low connections set pool size.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   213
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   214
      :attr:`mode`, string telling the connections set handling mode, may be one
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   215
      of 'read' (connections set may be freed), 'write' (some write was done in
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   216
      the connections set, it can't be freed before end of the transaction),
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   217
      'transaction' (we want to keep the connections set during all the
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   218
      transaction, with or without writing)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   219
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   220
      :attr:`pending_operations`, ordered list of operations to be processed on
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   221
      commit/rollback
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   222
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   223
      :attr:`commit_state`, describing the transaction commit state, may be one
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   224
      of None (not yet committing), 'precommit' (calling precommit event on
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   225
      operations), 'postcommit' (calling postcommit event on operations),
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   226
      'uncommitable' (some :exc:`ValidationError` or :exc:`Unauthorized` error
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   227
      has been raised during the transaction and so it must be rollbacked).
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   228
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   229
      :attr:`read_security` and :attr:`write_security`, boolean flags telling if
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   230
      read/write security is currently activated.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   231
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   232
      :attr:`hooks_mode`, may be either `HOOKS_ALLOW_ALL` or `HOOKS_DENY_ALL`.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   233
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   234
      :attr:`enabled_hook_categories`, when :attr:`hooks_mode` is
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   235
      `HOOKS_DENY_ALL`, this set contains hooks categories that are enabled.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   236
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   237
      :attr:`disabled_hook_categories`, when :attr:`hooks_mode` is
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   238
      `HOOKS_ALLOW_ALL`, this set contains hooks categories that are disabled.
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   239
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   240
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   241
      :attr:`running_dbapi_query`, boolean flag telling if the executing query
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   242
      is coming from a dbapi connection or is a query from within the repository
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   243
    """
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
   244
    is_internal_session = False
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   245
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   246
    def __init__(self, user, repo, cnxprops=None, _id=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   247
        super(Session, self).__init__(repo.vreg)
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
   248
        self.id = _id or make_uid(unormalize(user.login).encode('UTF8'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   249
        cnxprops = cnxprops or ConnectionProperties('inmemory')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   250
        self.user = user
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   251
        self.repo = repo
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   252
        self.cnxtype = cnxprops.cnxtype
5792
e13aa4786a72 [session] update session's timestamp in session.execute, so long running transactions are not erroneously closed by the repository
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5791
diff changeset
   253
        self.timestamp = time()
2570
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   254
        self.default_mode = 'read'
8265
9747ab9230ad [repo, undo] Finish repository-side implementation of the undo feature (closes #893940)
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 8190
diff changeset
   255
        # undo support
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
   256
        if repo.config.creating or repo.config.repairing or self.is_internal_session:
8265
9747ab9230ad [repo, undo] Finish repository-side implementation of the undo feature (closes #893940)
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 8190
diff changeset
   257
            self.undo_actions = False
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
   258
        else:
8265
9747ab9230ad [repo, undo] Finish repository-side implementation of the undo feature (closes #893940)
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 8190
diff changeset
   259
            self.undo_actions = repo.config['undo-support']
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   260
        # short cut to querier .execute method
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   261
        self._execute = repo.querier.execute
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   262
        # shared data, used to communicate extra information between the client
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   263
        # and the rql server
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   264
        self.data = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   265
        # i18n initialization
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   266
        self.set_language(cnxprops.lang)
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   267
        # internals
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
   268
        self._tx_data = {}
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
   269
        self.__threaddata = threading.local()
1880
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
   270
        self._threads_in_transaction = set()
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
   271
        self._closed = False
7340
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   272
        self._closed_lock = threading.Lock()
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   273
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
   274
    def __unicode__(self):
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
   275
        return '<%ssession %s (%s 0x%x)>' % (
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
   276
            self.cnxtype, unicode(self.user.login), self.id, id(self))
2604
6b55a2a81fd8 [R repo session] add_relation method use in hooks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2603
diff changeset
   277
7451
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   278
    def transaction(self, free_cnxset=True):
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   279
        """return context manager to enter a transaction for the session: when
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   280
        exiting the `with` block on exception, call `session.rollback()`, else
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   281
        call `session.commit()` on normal exit.
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   282
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   283
        The `free_cnxset` will be given to rollback/commit methods to indicate
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   284
        wether the connections set should be freed or not.
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   285
        """
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   286
        return transaction(self, free_cnxset)
48ba5f0c11de [session] provide a simple transaction context manager for session. Closes #1725640
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7405
diff changeset
   287
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
   288
    def set_tx_data(self, txid=None):
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
   289
        if txid is None:
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
   290
            txid = threading.currentThread().getName()
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
   291
        try:
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
   292
            self.__threaddata.txdata = self._tx_data[txid]
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
   293
        except KeyError:
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
   294
            self.__threaddata.txdata = self._tx_data[txid] = TransactionData(txid)
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
   295
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
   296
    @property
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
   297
    def _threaddata(self):
0b250d72fcfa [transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5802
diff changeset
   298
        try:
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
   299
            return self.__threaddata.txdata
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
   300
        except AttributeError:
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
   301
            self.set_tx_data()
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
   302
            return self.__threaddata.txdata
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
   303
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
   304
3112
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   305
    def hijack_user(self, user):
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   306
        """return a fake request/session using specified user"""
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   307
        session = Session(user, self.repo)
4924
d2fc161bee3f [session] fix hijack_user: most transaction_data should be copied (everything but the entity cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4913
diff changeset
   308
        threaddata = session._threaddata
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   309
        threaddata.cnxset = self.cnxset
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   310
        # we attributed a connections set, need to update ctx_count else it will be freed
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
   311
        # while undesired
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
   312
        threaddata.ctx_count = 1
4992
398cc8b39aec backport pending_operations on hi-jacked session, see comment
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4987
diff changeset
   313
        # share pending_operations, else operation added in the hi-jacked
398cc8b39aec backport pending_operations on hi-jacked session, see comment
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4987
diff changeset
   314
        # session such as SendMailOp won't ever be processed
398cc8b39aec backport pending_operations on hi-jacked session, see comment
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4987
diff changeset
   315
        threaddata.pending_operations = self.pending_operations
4924
d2fc161bee3f [session] fix hijack_user: most transaction_data should be copied (everything but the entity cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4913
diff changeset
   316
        # everything in transaction_data should be copied back but the entity
d2fc161bee3f [session] fix hijack_user: most transaction_data should be copied (everything but the entity cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4913
diff changeset
   317
        # type cache we don't want to avoid security pb
d2fc161bee3f [session] fix hijack_user: most transaction_data should be copied (everything but the entity cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4913
diff changeset
   318
        threaddata.transaction_data = self.transaction_data.copy()
d2fc161bee3f [session] fix hijack_user: most transaction_data should be copied (everything but the entity cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4913
diff changeset
   319
        threaddata.transaction_data.pop('ecache', None)
3112
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   320
        return session
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   321
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   322
    def add_relation(self, fromeid, rtype, toeid):
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   323
        """provide direct access to the repository method to add a relation.
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   324
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   325
        This is equivalent to the following rql query:
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   326
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   327
          SET X rtype Y WHERE X eid  fromeid, T eid toeid
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   328
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   329
        without read security check but also all the burden of rql execution.
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   330
        You may use this in hooks when you know both eids of the relation you
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   331
        want to add.
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   332
        """
7237
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   333
        self.add_relations([(rtype, [(fromeid,  toeid)])])
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   334
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   335
    def add_relations(self, relations):
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   336
        '''set many relation using a shortcut similar to the one in add_relation
7526
ae31063f3274 cleanup and assert we don't import unexpected stuff
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7502
diff changeset
   337
7237
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   338
        relations is a list of 2-uples, the first element of each
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   339
        2-uple is the rtype, and the second is a list of (fromeid,
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   340
        toeid) tuples
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   341
        '''
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   342
        edited_entities = {}
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   343
        relations_dict = {}
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
   344
        with security_enabled(self, False, False):
7237
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   345
            for rtype, eids in relations:
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   346
                if self.vreg.schema[rtype].inlined:
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   347
                    for fromeid, toeid in eids:
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   348
                        if fromeid not in edited_entities:
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   349
                            entity = self.entity_from_eid(fromeid)
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   350
                            edited = EditedEntity(entity)
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   351
                            edited_entities[fromeid] = edited
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   352
                        else:
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   353
                            edited = edited_entities[fromeid]
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   354
                        edited.edited_attribute(rtype, toeid)
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   355
                else:
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   356
                    relations_dict[rtype] = eids
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   357
            self.repo.glob_add_relations(self, relations_dict)
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   358
            for edited in edited_entities.itervalues():
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
   359
                self.repo.glob_update_entity(self, edited)
7237
9f619715665b [server] improve the speed of setting relations between entities (closes #1625257)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7119
diff changeset
   360
3197
b27d19c0db1c [repo] take care of inlined relation in session.[add|delete]_relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3196
diff changeset
   361
3112
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   362
    def delete_relation(self, fromeid, rtype, toeid):
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   363
        """provide direct access to the repository method to delete a relation.
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   364
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   365
        This is equivalent to the following rql query:
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   366
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   367
          DELETE X rtype Y WHERE X eid  fromeid, T eid toeid
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   368
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   369
        without read security check but also all the burden of rql execution.
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   370
        You may use this in hooks when you know both eids of the relation you
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   371
        want to delete.
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   372
        """
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
   373
        with security_enabled(self, False, False):
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
   374
            if self.vreg.schema[rtype].inlined:
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
   375
                entity = self.entity_from_eid(fromeid)
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
   376
                entity.cw_attr_cache[rtype] = 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
   377
                self.repo.glob_update_entity(self, entity, set((rtype,)))
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
   378
            else:
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
   379
                self.repo.glob_delete_relation(self, fromeid, rtype, toeid)
3112
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   380
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   381
    # relations cache handling #################################################
873202e181bb enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3074
diff changeset
   382
4467
0e73d299730a fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   383
    def update_rel_cache_add(self, subject, rtype, object, symmetric=False):
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   384
        self._update_entity_rel_cache_add(subject, rtype, 'subject', object)
4467
0e73d299730a fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   385
        if symmetric:
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   386
            self._update_entity_rel_cache_add(object, rtype, 'subject', subject)
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   387
        else:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   388
            self._update_entity_rel_cache_add(object, rtype, 'object', subject)
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   389
4467
0e73d299730a fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   390
    def update_rel_cache_del(self, subject, rtype, object, symmetric=False):
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   391
        self._update_entity_rel_cache_del(subject, rtype, 'subject', object)
4467
0e73d299730a fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   392
        if symmetric:
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   393
            self._update_entity_rel_cache_del(object, rtype, 'object', object)
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   394
        else:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   395
            self._update_entity_rel_cache_del(object, rtype, 'object', subject)
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   396
3553
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   397
    def _update_entity_rel_cache_add(self, eid, rtype, role, targeteid):
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   398
        try:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   399
            entity = self.entity_cache(eid)
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   400
        except KeyError:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   401
            return
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   402
        rcache = entity.cw_relation_cached(rtype, role)
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   403
        if rcache is not None:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   404
            rset, entities = rcache
3553
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   405
            rset = rset.copy()
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   406
            entities = list(entities)
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   407
            rset.rows.append([targeteid])
2781
4e1ad9d6a3e7 [session cache] always append to description, turn it into a list if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2764
diff changeset
   408
            if not isinstance(rset.description, list): # else description not set
4e1ad9d6a3e7 [session cache] always append to description, turn it into a list if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2764
diff changeset
   409
                rset.description = list(rset.description)
4e1ad9d6a3e7 [session cache] always append to description, turn it into a list if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2764
diff changeset
   410
            rset.description.append([self.describe(targeteid)[0]])
3196
77936fa67ae6 [repo] set entity.rset & co when needed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3161
diff changeset
   411
            targetentity = self.entity_from_eid(targeteid)
3379
9192ba07890d use .cw_rset instead of rset on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3373
diff changeset
   412
            if targetentity.cw_rset is None:
3373
3cd644bfab12 use 3.6 attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   413
                targetentity.cw_rset = rset
3cd644bfab12 use 3.6 attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   414
                targetentity.cw_row = rset.rowcount
3cd644bfab12 use 3.6 attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   415
                targetentity.cw_col = 0
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   416
            rset.rowcount += 1
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   417
            entities.append(targetentity)
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   418
            entity._cw_related_cache['%s_%s' % (rtype, role)] = (
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   419
                rset, tuple(entities))
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   420
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   421
    def _update_entity_rel_cache_del(self, eid, rtype, role, targeteid):
3553
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   422
        try:
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   423
            entity = self.entity_cache(eid)
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   424
        except KeyError:
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   425
            return
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   426
        rcache = entity.cw_relation_cached(rtype, role)
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   427
        if rcache is not None:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   428
            rset, entities = rcache
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   429
            for idx, row in enumerate(rset.rows):
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   430
                if row[0] == targeteid:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   431
                    break
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   432
            else:
3074
141cfaac6b97 don't fail when trying to update relation cache for relation deletion, this may occurs regularly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2874
diff changeset
   433
                # this may occurs if the cache has been filed by a hook
141cfaac6b97 don't fail when trying to update relation cache for relation deletion, this may occurs regularly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2874
diff changeset
   434
                # after the database update
141cfaac6b97 don't fail when trying to update relation cache for relation deletion, this may occurs regularly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2874
diff changeset
   435
                self.debug('cache inconsistency for %s %s %s %s', eid, rtype,
141cfaac6b97 don't fail when trying to update relation cache for relation deletion, this may occurs regularly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2874
diff changeset
   436
                           role, targeteid)
141cfaac6b97 don't fail when trying to update relation cache for relation deletion, this may occurs regularly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2874
diff changeset
   437
                return
3553
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   438
            rset = rset.copy()
76b4a177a018 [session cache] ensure we're not modifying cached rset/entities, they may be used elsewhere
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3275
diff changeset
   439
            entities = list(entities)
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   440
            del rset.rows[idx]
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   441
            if isinstance(rset.description, list): # else description not set
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   442
                del rset.description[idx]
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   443
            del entities[idx]
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   444
            rset.rowcount -= 1
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   445
            entity._cw_related_cache['%s_%s' % (rtype, role)] = (
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   446
                rset, tuple(entities))
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   447
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   448
    # resource accessors ######################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   449
2623
e1f34b77290b oops, should have been in a earlier commit (give rollback_on_failure to doexec)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2616
diff changeset
   450
    def system_sql(self, sql, args=None, rollback_on_failure=True):
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   451
        """return a sql cursor on the system database"""
5226
2e215efcc3a6 [session] better readability
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5193
diff changeset
   452
        if sql.split(None, 1)[0].upper() != 'SELECT':
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   453
            self.mode = 'write'
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   454
        source = self.cnxset.source('system')
5108
8495d580a580 [session] try to reconnect on unexpected error in system_sql. We need this for proper reconnection of pool used by hooks or looping task doing sql queries (such as cw_cleanup_transaction)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5074
diff changeset
   455
        try:
8495d580a580 [session] try to reconnect on unexpected error in system_sql. We need this for proper reconnection of pool used by hooks or looping task doing sql queries (such as cw_cleanup_transaction)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5074
diff changeset
   456
            return source.doexec(self, sql, args, rollback=rollback_on_failure)
8495d580a580 [session] try to reconnect on unexpected error in system_sql. We need this for proper reconnection of pool used by hooks or looping task doing sql queries (such as cw_cleanup_transaction)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5074
diff changeset
   457
        except (source.OperationalError, source.InterfaceError):
5802
159b6a712d9d [session] when rollback_on_failure is false, we should not try to reconnect if the sql raised an error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5792
diff changeset
   458
            if not rollback_on_failure:
159b6a712d9d [session] when rollback_on_failure is false, we should not try to reconnect if the sql raised an error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5792
diff changeset
   459
                raise
5108
8495d580a580 [session] try to reconnect on unexpected error in system_sql. We need this for proper reconnection of pool used by hooks or looping task doing sql queries (such as cw_cleanup_transaction)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5074
diff changeset
   460
            source.warning("trying to reconnect")
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   461
            self.cnxset.reconnect(source)
5108
8495d580a580 [session] try to reconnect on unexpected error in system_sql. We need this for proper reconnection of pool used by hooks or looping task doing sql queries (such as cw_cleanup_transaction)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5074
diff changeset
   462
            return source.doexec(self, sql, args, rollback=rollback_on_failure)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   463
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   464
    def set_language(self, language):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   465
        """i18n configuration for translation"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   466
        language = language or self.user.property_value('ui.language')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   467
        try:
5444
f7fdb5dd82f6 [webconfig] introduce property sheets. Use them to replace external_resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5443
diff changeset
   468
            gettext, pgettext = self.vreg.config.translations[language]
3275
5247789df541 [gettext] provide GNU contexts to avoid translations ambiguities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3240
diff changeset
   469
            self._ = self.__ = gettext
5247789df541 [gettext] provide GNU contexts to avoid translations ambiguities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3240
diff changeset
   470
            self.pgettext = pgettext
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   471
        except KeyError:
5444
f7fdb5dd82f6 [webconfig] introduce property sheets. Use them to replace external_resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5443
diff changeset
   472
            language = self.vreg.property_value('ui.language')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   473
            try:
5444
f7fdb5dd82f6 [webconfig] introduce property sheets. Use them to replace external_resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5443
diff changeset
   474
                gettext, pgettext = self.vreg.config.translations[language]
3275
5247789df541 [gettext] provide GNU contexts to avoid translations ambiguities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3240
diff changeset
   475
                self._ = self.__ = gettext
5247789df541 [gettext] provide GNU contexts to avoid translations ambiguities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3240
diff changeset
   476
                self.pgettext = pgettext
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   477
            except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   478
                self._ = self.__ = unicode
4721
8f63691ccb7f pylint style fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4704
diff changeset
   479
                self.pgettext = lambda x, y: y
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   480
        self.lang = language
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   481
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   482
    def change_property(self, prop, value):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   483
        assert prop == 'lang' # this is the only one changeable property for now
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   484
        self.set_language(value)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   485
2840
06daf13195d4 [hooks] deprecates hookhelper module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   486
    def deleted_in_transaction(self, eid):
4842
3653e09024a1 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
   487
        """return True if the entity of the given eid is being deleted in the
3653e09024a1 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
   488
        current transaction
3653e09024a1 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
   489
        """
2840
06daf13195d4 [hooks] deprecates hookhelper module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   490
        return eid in self.transaction_data.get('pendingeids', ())
06daf13195d4 [hooks] deprecates hookhelper module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   491
06daf13195d4 [hooks] deprecates hookhelper module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   492
    def added_in_transaction(self, eid):
4842
3653e09024a1 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
   493
        """return True if the entity of the given eid is being created in the
3653e09024a1 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
   494
        current transaction
3653e09024a1 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
   495
        """
2840
06daf13195d4 [hooks] deprecates hookhelper module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   496
        return eid in self.transaction_data.get('neweids', ())
06daf13195d4 [hooks] deprecates hookhelper module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   497
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
   498
    def rtype_eids_rdef(self, rtype, eidfrom, eidto):
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
   499
        # use type_and_source_from_eid instead of type_from_eid for optimization
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
   500
        # (avoid two extra methods call)
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
   501
        subjtype = self.repo.type_and_source_from_eid(eidfrom, self)[0]
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
   502
        objtype = self.repo.type_and_source_from_eid(eidto, self)[0]
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
   503
        return self.vreg.schema.rschema(rtype).rdefs[(subjtype, objtype)]
2840
06daf13195d4 [hooks] deprecates hookhelper module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   504
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
   505
    # security control #########################################################
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
   506
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
   507
    DEFAULT_SECURITY = object() # evaluated to true by design
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
   508
7405
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   509
    def security_enabled(self, read=False, write=False):
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   510
        return security_enabled(self, read=read, write=write)
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   511
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
   512
    def init_security(self, read, write):
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
   513
        if read is None:
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
   514
            oldread = None
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
   515
        else:
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
   516
            oldread = self.set_read_security(read)
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
   517
        if write is None:
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
   518
            oldwrite = None
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
   519
        else:
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
   520
            oldwrite = self.set_write_security(write)
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
   521
        self._threaddata.ctx_count += 1
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
   522
        return oldread, oldwrite
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
   523
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
   524
    def reset_security(self, read, write):
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
   525
        txstore = self._threaddata
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
   526
        txstore.ctx_count -= 1
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
   527
        if txstore.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
   528
            self._clear_thread_storage(txstore)
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
   529
        else:
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
   530
            if read is not None:
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
   531
                self.set_read_security(read)
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
   532
            if write is not None:
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
   533
                self.set_write_security(write)
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
   534
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
   535
    @property
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
   536
    def read_security(self):
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
   537
        """return a boolean telling if read security is activated or not"""
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
   538
        txstore = self._threaddata
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
   539
        if txstore is None:
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
   540
            return self.DEFAULT_SECURITY
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
   541
        try:
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
   542
            return txstore.read_security
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
   543
        except AttributeError:
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
   544
            txstore.read_security = self.DEFAULT_SECURITY
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
   545
            return txstore.read_security
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
   546
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
   547
    def set_read_security(self, activated):
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
   548
        """[de]activate read security, returning the previous value set for
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
   549
        later restoration.
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
   550
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
   551
        you should usually use the `security_enabled` context manager instead
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
   552
        of this to change security settings.
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
   553
        """
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
   554
        txstore = self._threaddata
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
   555
        if txstore is None:
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
   556
            return self.DEFAULT_SECURITY
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
   557
        oldmode = getattr(txstore, 'read_security', self.DEFAULT_SECURITY)
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
   558
        txstore.read_security = activated
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
   559
        # dbapi_query used to detect hooks triggered by a 'dbapi' query (eg not
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
   560
        # issued on the session). This is tricky since we the execution model of
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
   561
        # a (write) user query is:
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
   562
        #
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
   563
        # repository.execute (security enabled)
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
   564
        #  \-> querier.execute
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
   565
        #       \-> repo.glob_xxx (add/update/delete entity/relation)
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
   566
        #            \-> deactivate security before calling hooks
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
   567
        #                 \-> WE WANT TO CHECK QUERY NATURE HERE
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
   568
        #                      \-> potentially, other calls to querier.execute
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
   569
        #
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
   570
        # so we can't rely on simply checking session.read_security, but
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
   571
        # recalling the first transition from DEFAULT_SECURITY to something
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
   572
        # else (False actually) is not perfect but should be enough
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
   573
        #
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
   574
        # also reset dbapi_query to true when we go back to DEFAULT_SECURITY
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
   575
        txstore.dbapi_query = (oldmode is self.DEFAULT_SECURITY
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
   576
                               or activated is self.DEFAULT_SECURITY)
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
   577
        return oldmode
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
   578
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
   579
    @property
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
   580
    def write_security(self):
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
   581
        """return a boolean telling if write security is activated or not"""
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
   582
        txstore = self._threaddata
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
   583
        if txstore is None:
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
   584
            return self.DEFAULT_SECURITY
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
   585
        try:
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
   586
            return txstore.write_security
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   587
        except AttributeError:
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
   588
            txstore.write_security = self.DEFAULT_SECURITY
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
   589
            return txstore.write_security
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
   590
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
   591
    def set_write_security(self, activated):
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
   592
        """[de]activate write security, returning the previous value set for
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
   593
        later restoration.
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
   594
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
   595
        you should usually use the `security_enabled` context manager instead
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
   596
        of this to change security settings.
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
   597
        """
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
   598
        txstore = self._threaddata
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
   599
        if txstore is None:
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
   600
            return self.DEFAULT_SECURITY
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
   601
        oldmode = getattr(txstore, 'write_security', self.DEFAULT_SECURITY)
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
   602
        txstore.write_security = activated
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
   603
        return oldmode
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
   604
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
   605
    @property
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
   606
    def running_dbapi_query(self):
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
   607
        """return a boolean telling if it's triggered by a db-api query or by
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
   608
        a session query.
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
   609
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
   610
        To be used in hooks, else may have a wrong value.
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
   611
        """
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
   612
        return getattr(self._threaddata, 'dbapi_query', True)
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
   613
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
   614
    # hooks activation control #################################################
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
   615
    # all hooks should be activated during normal execution
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
   616
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
   617
    HOOKS_ALLOW_ALL = object()
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
   618
    HOOKS_DENY_ALL = object()
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
   619
7405
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   620
    def allow_all_hooks_but(self, *categories):
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   621
        return hooks_control(self, self.HOOKS_ALLOW_ALL, *categories)
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   622
    def deny_all_hooks_but(self, *categories):
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   623
        return hooks_control(self, self.HOOKS_DENY_ALL, *categories)
8c752d113ebb [session] new methods on session to ease access to security/hooks control context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7340
diff changeset
   624
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
   625
    @property
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
   626
    def hooks_mode(self):
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
   627
        return getattr(self._threaddata, 'hooks_mode', self.HOOKS_ALLOW_ALL)
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
   628
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
   629
    def set_hooks_mode(self, 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
   630
        assert mode is self.HOOKS_ALLOW_ALL or mode is self.HOOKS_DENY_ALL
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
   631
        oldmode = getattr(self._threaddata, 'hooks_mode', self.HOOKS_ALLOW_ALL)
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
   632
        self._threaddata.hooks_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
   633
        return oldmode
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
   634
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
   635
    def init_hooks_mode_categories(self, mode, categories):
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
   636
        oldmode = self.set_hooks_mode(mode)
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
   637
        if mode is self.HOOKS_DENY_ALL:
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
   638
            changes = self.enable_hook_categories(*categories)
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
   639
        else:
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
   640
            changes = self.disable_hook_categories(*categories)
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
   641
        self._threaddata.ctx_count += 1
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
   642
        return oldmode, changes
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
   643
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
   644
    def reset_hooks_mode_categories(self, oldmode, mode, categories):
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
   645
        txstore = self._threaddata
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
   646
        txstore.ctx_count -= 1
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
   647
        if txstore.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
   648
            self._clear_thread_storage(txstore)
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
   649
        else:
7757
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   650
            try:
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   651
                if categories:
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   652
                    if mode is self.HOOKS_DENY_ALL:
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   653
                        return self.disable_hook_categories(*categories)
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   654
                    else:
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   655
                        return self.enable_hook_categories(*categories)
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   656
            finally:
5b3584c5a7c3 [hooks control] test and fix session.reset_hooks_mode_categories, closes #1908680
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7730
diff changeset
   657
                self.set_hooks_mode(oldmode)
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
   658
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
   659
    @property
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   660
    def disabled_hook_categories(self):
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
   661
        try:
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   662
            return getattr(self._threaddata, 'disabled_hook_cats')
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
   663
        except AttributeError:
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   664
            cats = self._threaddata.disabled_hook_cats = set()
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
   665
            return cats
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
   666
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
   667
    @property
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   668
    def enabled_hook_categories(self):
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
   669
        try:
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   670
            return getattr(self._threaddata, 'enabled_hook_cats')
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
   671
        except AttributeError:
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   672
            cats = self._threaddata.enabled_hook_cats = set()
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
   673
            return cats
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
   674
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   675
    def disable_hook_categories(self, *categories):
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   676
        """disable the given hook categories:
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   677
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   678
        - on HOOKS_DENY_ALL mode, ensure those categories are not enabled
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   679
        - on HOOKS_ALLOW_ALL mode, ensure those categories are disabled
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   680
        """
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
   681
        changes = set()
7387
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
   682
        self.pruned_hooks_cache.clear()
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
   683
        if self.hooks_mode is self.HOOKS_DENY_ALL:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   684
            enabledcats = self.enabled_hook_categories
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
   685
            for category in categories:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   686
                if category in enabledcats:
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   687
                    enabledcats.remove(category)
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
   688
                    changes.add(category)
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
   689
        else:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   690
            disabledcats = self.disabled_hook_categories
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
   691
            for category in categories:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   692
                if category not in disabledcats:
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   693
                    disabledcats.add(category)
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
   694
                    changes.add(category)
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
   695
        return tuple(changes)
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
   696
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   697
    def enable_hook_categories(self, *categories):
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   698
        """enable the given hook categories:
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   699
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   700
        - on HOOKS_DENY_ALL mode, ensure those categories are enabled
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   701
        - on HOOKS_ALLOW_ALL mode, ensure those categories are not disabled
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   702
        """
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
   703
        changes = set()
7387
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
   704
        self.pruned_hooks_cache.clear()
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
   705
        if self.hooks_mode is self.HOOKS_DENY_ALL:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   706
            enabledcats = self.enabled_hook_categories
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
   707
            for category in categories:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   708
                if category not in enabledcats:
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   709
                    enabledcats.add(category)
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
   710
                    changes.add(category)
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
   711
        else:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   712
            disabledcats = self.disabled_hook_categories
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
   713
            for category in categories:
7349
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   714
                if category in disabledcats:
43416f63eca9 [session] nicer local variable names
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   715
                    disabledcats.remove(category)
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
   716
                    changes.add(category)
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
   717
        return tuple(changes)
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
   718
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   719
    def is_hook_category_activated(self, category):
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   720
        """return a boolean telling if the given category is currently activated
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   721
        or not
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   722
        """
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
   723
        if self.hooks_mode is self.HOOKS_DENY_ALL:
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   724
            return category in self.enabled_hook_categories
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   725
        return category not in self.disabled_hook_categories
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
   726
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
   727
    def is_hook_activated(self, hook):
4843
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   728
        """return a boolean telling if the given hook class is currently
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   729
        activated or not
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   730
        """
5f7363416765 fix hooks control method name + other litle cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4835
diff changeset
   731
        return self.is_hook_category_activated(hook.category)
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
   732
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   733
    # connection management ###################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   734
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   735
    def keep_cnxset_mode(self, mode):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   736
        """set `mode`, e.g. how the session will keep its connections set:
2570
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   737
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   738
        * if mode == 'write', the connections set is freed after each ready
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   739
          query, but kept until the transaction's end (eg commit or rollback)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   740
          when a write query is detected (eg INSERT/SET/DELETE queries)
2570
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   741
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   742
        * if mode == 'transaction', the connections set is only freed after the
2570
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   743
          transaction's end
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   744
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   745
        notice that a repository has a limited set of connections sets, and a
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   746
        session has to wait for a free connections set to run any rql query
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   747
        (unless it already has one set).
2570
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   748
        """
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   749
        assert mode in ('transaction', 'write')
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   750
        if mode == 'transaction':
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   751
            self.default_mode = 'transaction'
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   752
        else: # mode == 'write'
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   753
            self.default_mode = 'read'
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   754
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   755
    def get_mode(self):
2570
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   756
        return getattr(self._threaddata, 'mode', self.default_mode)
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   757
    def set_mode(self, value):
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   758
        self._threaddata.mode = value
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   759
    mode = property(get_mode, set_mode,
2570
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   760
                    doc='transaction mode (read/write/transaction), resetted to'
80a996bb536d [repo session] ability to ask session to keep it's pool set even when only read queries are done, necessary at least during migration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2319
diff changeset
   761
                    ' default_mode on commit / rollback')
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   762
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   763
    def get_commit_state(self):
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   764
        return getattr(self._threaddata, 'commit_state', None)
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   765
    def set_commit_state(self, value):
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   766
        self._threaddata.commit_state = value
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   767
    commit_state = property(get_commit_state, set_commit_state)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   768
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   769
    @property
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   770
    def cnxset(self):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   771
        """connections set, set according to transaction mode for each query"""
5826
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   772
        if self._closed:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   773
            self.free_cnxset(True)
7665
0cd299c16f12 [session] add session id to closed connection errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7574
diff changeset
   774
            raise Exception('try to access connections set on a closed session %s' % self.id)
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   775
        return getattr(self._threaddata, 'cnxset', None)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   776
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   777
    def set_cnxset(self):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   778
        """the session need a connections set to execute some queries"""
7340
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   779
        with self._closed_lock:
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   780
            if self._closed:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   781
                self.free_cnxset(True)
7665
0cd299c16f12 [session] add session id to closed connection errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7574
diff changeset
   782
                raise Exception('try to set connections set on a closed session %s' % self.id)
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   783
            if self.cnxset is None:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   784
                # get connections set first to avoid race-condition
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   785
                self._threaddata.cnxset = cnxset = self.repo._get_cnxset()
7352
d68f9319bfda backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7350 7340
diff changeset
   786
                self._threaddata.ctx_count += 1
7340
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   787
                try:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   788
                    cnxset.cnxset_set()
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   789
                except Exception:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   790
                    self._threaddata.cnxset = None
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   791
                    self.repo._free_cnxset(cnxset)
7340
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   792
                    raise
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
   793
                self._threads_in_transaction.add(
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   794
                    (threading.currentThread(), cnxset) )
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   795
            return self._threaddata.cnxset
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   796
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   797
    def _free_thread_cnxset(self, thread, cnxset, force_close=False):
5826
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   798
        try:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   799
            self._threads_in_transaction.remove( (thread, cnxset) )
5826
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   800
        except KeyError:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   801
            # race condition on cnxset freeing (freed by commit or rollback vs
5826
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   802
            # close)
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   803
            pass
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   804
        else:
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   805
            if force_close:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   806
                cnxset.reconnect()
5826
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   807
            else:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   808
                cnxset.cnxset_freed()
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   809
            # free cnxset once everything is done to avoid race-condition
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   810
            self.repo._free_cnxset(cnxset)
5826
462435bf5457 [session] refactor session handling so that when calling session.close(), pool of long running transaction of the same session is properly freed
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5813
diff changeset
   811
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   812
    def free_cnxset(self, ignoremode=False):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   813
        """the session is no longer using its connections set, at least for some time"""
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   814
        # cnxset may be none if no operation has been done since last commit
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   815
        # or rollback
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   816
        cnxset = getattr(self._threaddata, 'cnxset', None)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   817
        if cnxset is not None and (ignoremode or self.mode == 'read'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   818
            # even in read mode, we must release the current transaction
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   819
            self._free_thread_cnxset(threading.currentThread(), cnxset)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   820
            del self._threaddata.cnxset
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
   821
            self._threaddata.ctx_count -= 1
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   822
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   823
    def _touch(self):
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   824
        """update latest session usage timestamp and reset mode to read"""
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   825
        self.timestamp = time()
5046
d010f749c21d add note
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5014
diff changeset
   826
        self.local_perm_cache.clear() # XXX simply move in transaction_data, no?
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   827
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   828
    # shared data handling ###################################################
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   829
6013
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   830
    def get_shared_data(self, key, default=None, pop=False, txdata=False):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   831
        """return value associated to `key` in session data"""
6013
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   832
        if txdata:
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   833
            data = self.transaction_data
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   834
        else:
6013
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   835
            data = self.data
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   836
        if pop:
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   837
            return data.pop(key, default)
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   838
        else:
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   839
            return data.get(key, default)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   840
6013
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   841
    def set_shared_data(self, key, value, txdata=False):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   842
        """set value associated to `key` in session data"""
6013
8ca424bc393b [dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5920
diff changeset
   843
        if txdata:
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
   844
            self.transaction_data[key] = value
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   845
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   846
            self.data[key] = value
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   847
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   848
    # request interface #######################################################
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   849
2855
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
   850
    @property
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
   851
    def cursor(self):
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
   852
        """return a rql cursor"""
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
   853
        return self
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
   854
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   855
    def set_entity_cache(self, entity):
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   856
        # XXX session level caching may be a pb with multiple repository
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   857
        #     instances, but 1. this is probably not the only one :$ and 2. it
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   858
        #     may be an acceptable risk. Anyway we could activate it or not
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   859
        #     according to a configuration option
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   860
        try:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   861
            self.transaction_data['ecache'].setdefault(entity.eid, entity)
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   862
        except KeyError:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   863
            self.transaction_data['ecache'] = ecache = {}
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   864
            ecache[entity.eid] = entity
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   865
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   866
    def entity_cache(self, eid):
5014
96bb4e7e3348 [cleanup] useless try except
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4992
diff changeset
   867
        return self.transaction_data['ecache'][eid]
2647
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   868
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   869
    def cached_entities(self):
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   870
        return self.transaction_data.get('ecache', {}).values()
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   871
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   872
    def drop_entity_cache(self, eid=None):
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   873
        if eid is None:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   874
            self.transaction_data.pop('ecache', None)
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   875
        else:
b0a2e779845c enable server side entity caching, 25% speedup on codenaf insertion. ALL CW TESTS OK
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2630
diff changeset
   876
            del self.transaction_data['ecache'][eid]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   877
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   878
    def from_controller(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   879
        """return the id (string) of the controller issuing the request (no
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   880
        sense here, always return 'view')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   881
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   882
        return 'view'
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   883
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   884
    def source_defs(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   885
        return self.repo.source_defs()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   886
7543
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   887
    def describe(self, eid, asdict=False):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   888
        """return a tuple (type, sourceuri, extid) for the entity with id <eid>"""
7543
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   889
        metas = self.repo.type_and_source_from_eid(eid, self)
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   890
        if asdict:
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   891
            return dict(zip(('type', 'source', 'extid', 'asource'), metas)) 
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   892
       # XXX :-1 for cw compat, use asdict=True for full information
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   893
        return metas[:-1]
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   894
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   895
    # db-api like interface ###################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   896
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   897
    def source_from_eid(self, eid):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   898
        """return the source where the entity with id <eid> is located"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   899
        return self.repo.source_from_eid(eid, self)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   900
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
   901
    def execute(self, rql, kwargs=None, eid_key=None, build_descr=True):
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   902
        """db-api like method directly linked to the querier execute method.
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   903
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   904
        See :meth:`cubicweb.dbapi.Cursor.execute` documentation.
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   905
        """
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   906
        if eid_key is not None:
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   907
            warn('[3.8] eid_key is deprecated, you can safely remove this argument',
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   908
                 DeprecationWarning, stacklevel=2)
5792
e13aa4786a72 [session] update session's timestamp in session.execute, so long running transactions are not erroneously closed by the repository
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5791
diff changeset
   909
        self.timestamp = time() # update timestamp
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
   910
        rset = self._execute(self, rql, kwargs, build_descr)
4850
bd640b137f50 [refactor] drop rset.vreg attribute, vreg should be accessed through rset.req. Also kill decorate_rset, simply set rset.req where we were calling this method.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4845
diff changeset
   911
        rset.req = self
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   912
        return rset
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   913
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   914
    def _clear_thread_data(self, free_cnxset=True):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   915
        """remove everything from the thread local storage, except connections set
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   916
        which is explicitly removed by free_cnxset, and mode which is set anyway
4704
a1ac5a453146 [session] fix memory leak: local thread data living in a thread that never finishes (eg, the main thread) may not be properly freed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4703
diff changeset
   917
        by _touch
a1ac5a453146 [session] fix memory leak: local thread data living in a thread that never finishes (eg, the main thread) may not be properly freed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4703
diff changeset
   918
        """
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
   919
        try:
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
   920
            txstore = self.__threaddata.txdata
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
   921
        except AttributeError:
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
   922
            pass
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
   923
        else:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   924
            if free_cnxset:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   925
                self.free_cnxset()
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
   926
                if txstore.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
   927
                    self._clear_thread_storage(txstore)
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
   928
                else:
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
   929
                    self._clear_tx_storage(txstore)
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
   930
            else:
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
   931
                self._clear_tx_storage(txstore)
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
   932
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
   933
    def _clear_thread_storage(self, txstore):
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
   934
        self._tx_data.pop(txstore.transactionid, None)
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
   935
        try:
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
   936
            del self.__threaddata.txdata
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
   937
        except AttributeError:
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
   938
            pass
4704
a1ac5a453146 [session] fix memory leak: local thread data living in a thread that never finishes (eg, the main thread) may not be properly freed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4703
diff changeset
   939
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
   940
    def _clear_tx_storage(self, txstore):
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
   941
        for name in ('commit_state', 'transaction_data',
7387
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
   942
                     'pending_operations', '_rewriter',
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
   943
                     'pruned_hooks_cache'):
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
   944
            try:
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
   945
                delattr(txstore, name)
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
   946
            except AttributeError:
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
   947
                continue
4704
a1ac5a453146 [session] fix memory leak: local thread data living in a thread that never finishes (eg, the main thread) may not be properly freed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4703
diff changeset
   948
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   949
    def commit(self, free_cnxset=True, reset_pool=None):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   950
        """commit the current session's transaction"""
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   951
        if reset_pool is not None:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   952
            warn('[3.13] use free_cnxset argument instead for reset_pool',
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   953
                 DeprecationWarning, stacklevel=2)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   954
            free_cnxset = reset_pool
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
   955
        if self.cnxset is None:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   956
            assert not self.pending_operations
4704
a1ac5a453146 [session] fix memory leak: local thread data living in a thread that never finishes (eg, the main thread) may not be properly freed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4703
diff changeset
   957
            self._clear_thread_data()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   958
            self._touch()
2200
25bb65dc4559 test fixes, all server tests ok, except unittest_migractions (due to inter-tests-side-effects...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2190
diff changeset
   959
            self.debug('commit session %s done (no db activity)', self.id)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   960
            return
6385
9f91d09ee5fa [repo transaction] fix rollback behaviour as discussed on the mailing-list: instead of rollbacking automatically on Unauthorized/ValidationError, mark the transaction as uncommitable and disallow commiting
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6071
diff changeset
   961
        cstate = self.commit_state
9f91d09ee5fa [repo transaction] fix rollback behaviour as discussed on the mailing-list: instead of rollbacking automatically on Unauthorized/ValidationError, mark the transaction as uncommitable and disallow commiting
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6071
diff changeset
   962
        if cstate == 'uncommitable':
9f91d09ee5fa [repo transaction] fix rollback behaviour as discussed on the mailing-list: instead of rollbacking automatically on Unauthorized/ValidationError, mark the transaction as uncommitable and disallow commiting
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6071
diff changeset
   963
            raise QueryError('transaction must be rollbacked')
9f91d09ee5fa [repo transaction] fix rollback behaviour as discussed on the mailing-list: instead of rollbacking automatically on Unauthorized/ValidationError, mark the transaction as uncommitable and disallow commiting
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6071
diff changeset
   964
        if cstate is not None:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   965
            return
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
   966
        # on rollback, an operation should have the following state
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
   967
        # information:
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
   968
        # - processed by the precommit/commit event or not
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
   969
        # - if processed, is it the failed operation
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
   970
        try:
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
   971
            # by default, operations are executed with security turned off
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
   972
            with security_enabled(self, False, False):
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   973
                processed = []
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   974
                self.commit_state = 'precommit'
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   975
                try:
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   976
                    while self.pending_operations:
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   977
                        operation = self.pending_operations.pop(0)
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   978
                        operation.processed = 'precommit'
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   979
                        processed.append(operation)
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   980
                        operation.handle_event('precommit_event')
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   981
                    self.pending_operations[:] = processed
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   982
                    self.debug('precommit session %s done', self.id)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   983
                except BaseException:
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   984
                    # if error on [pre]commit:
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   985
                    #
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   986
                    # * set .failed = True on the operation causing the failure
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   987
                    # * call revert<event>_event on processed operations
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   988
                    # * call rollback_event on *all* operations
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   989
                    #
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   990
                    # that seems more natural than not calling rollback_event
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   991
                    # for processed operations, and allow generic rollback
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   992
                    # instead of having to implements rollback, revertprecommit
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   993
                    # and revertcommit, that will be enough in mont case.
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   994
                    operation.failed = True
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   995
                    for operation in reversed(processed):
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   996
                        try:
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   997
                            operation.handle_event('revertprecommit_event')
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
   998
                        except BaseException:
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
   999
                            self.critical('error while reverting precommit',
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1000
                                          exc_info=True)
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1001
                    # XXX use slice notation since self.pending_operations is a
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1002
                    # read-only property.
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1003
                    self.pending_operations[:] = processed + self.pending_operations
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1004
                    self.rollback(free_cnxset)
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1005
                    raise
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1006
                self.cnxset.commit()
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1007
                self.commit_state = 'postcommit'
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
  1008
                while self.pending_operations:
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
  1009
                    operation = self.pending_operations.pop(0)
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1010
                    operation.processed = 'postcommit'
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
  1011
                    try:
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1012
                        operation.handle_event('postcommit_event')
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
  1013
                    except BaseException:
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1014
                        self.critical('error while postcommit',
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
  1015
                                      exc_info=sys.exc_info())
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6077
diff changeset
  1016
                self.debug('postcommit session %s done', self.id)
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1017
                return self.transaction_uuid(set=False)
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
  1018
        finally:
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
  1019
            self._touch()
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1020
            if free_cnxset:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1021
                self.free_cnxset(ignoremode=True)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1022
            self._clear_thread_data(free_cnxset)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1023
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1024
    def rollback(self, free_cnxset=True, reset_pool=None):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1025
        """rollback the current session's transaction"""
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1026
        if reset_pool is not None:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1027
            warn('[3.13] use free_cnxset argument instead for reset_pool',
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1028
                 DeprecationWarning, stacklevel=2)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1029
            free_cnxset = reset_pool
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1030
        # don't use self.cnxset, rollback may be called with _closed == True
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1031
        cnxset = getattr(self._threaddata, 'cnxset', None)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1032
        if cnxset is None:
4704
a1ac5a453146 [session] fix memory leak: local thread data living in a thread that never finishes (eg, the main thread) may not be properly freed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4703
diff changeset
  1033
            self._clear_thread_data()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1034
            self._touch()
2200
25bb65dc4559 test fixes, all server tests ok, except unittest_migractions (due to inter-tests-side-effects...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2190
diff changeset
  1035
            self.debug('rollback session %s done (no db activity)', self.id)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1036
            return
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
  1037
        try:
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
  1038
            # by default, operations are executed with security turned off
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
  1039
            with security_enabled(self, False, False):
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
  1040
                while self.pending_operations:
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
  1041
                    try:
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
  1042
                        operation = self.pending_operations.pop(0)
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
  1043
                        operation.handle_event('rollback_event')
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7782
diff changeset
  1044
                    except BaseException:
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
  1045
                        self.critical('rollback error', exc_info=sys.exc_info())
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
  1046
                        continue
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1047
                cnxset.rollback()
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
  1048
                self.debug('rollback for session %s done', self.id)
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
  1049
        finally:
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
  1050
            self._touch()
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1051
            if free_cnxset:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1052
                self.free_cnxset(ignoremode=True)
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1053
            self._clear_thread_data(free_cnxset)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1054
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1055
    def close(self):
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1056
        """do not close connections set on session close, since they are shared now"""
7340
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
  1057
        with self._closed_lock:
9303fd71c2ee [session] lock self._closed and session.close to avoid race conditions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7330
diff changeset
  1058
            self._closed = True
1880
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1059
        # copy since _threads_in_transaction maybe modified while waiting
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1060
        for thread, cnxset in self._threads_in_transaction.copy():
1880
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1061
            if thread is threading.currentThread():
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1062
                continue
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1063
            self.info('waiting for thread %s', thread)
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1064
            # do this loop/break instead of a simple join(10) in case thread is
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1065
            # the main thread (in which case it will be removed from
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1066
            # self._threads_in_transaction but still be alive...)
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1067
            for i in xrange(10):
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1068
                thread.join(1)
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1069
                if not (thread.isAlive() and
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1070
                        (thread, cnxset) in self._threads_in_transaction):
1880
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1071
                    break
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1072
            else:
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1073
                self.error('thread %s still alive after 10 seconds, will close '
293fe4b49e28 two in one: #343320: Logging out while deleting a CWUser blocks the cw server / #342692: ensure transaction state when Ctrl-C or other stop signal is received
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1660
diff changeset
  1074
                           'session anyway', thread)
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1075
                self._free_thread_cnxset(thread, cnxset, force_close=True)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1076
        self.rollback()
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
  1077
        del self.__threaddata
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
  1078
        del self._tx_data
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1079
7054
c8f12ab250b7 Add a "closed" property on session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6582
diff changeset
  1080
    @property
c8f12ab250b7 Add a "closed" property on session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6582
diff changeset
  1081
    def closed(self):
c8f12ab250b7 Add a "closed" property on session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6582
diff changeset
  1082
        return not hasattr(self, '_tx_data')
c8f12ab250b7 Add a "closed" property on session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6582
diff changeset
  1083
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1084
    # transaction data/operations management ##################################
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1085
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1086
    @property
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1087
    def transaction_data(self):
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1088
        try:
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1089
            return self._threaddata.transaction_data
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1090
        except AttributeError:
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1091
            self._threaddata.transaction_data = {}
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1092
            return self._threaddata.transaction_data
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1093
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1094
    @property
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1095
    def pending_operations(self):
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1096
        try:
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1097
            return self._threaddata.pending_operations
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1098
        except AttributeError:
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1099
            self._threaddata.pending_operations = []
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1100
            return self._threaddata.pending_operations
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1101
7387
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1102
    @property
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1103
    def pruned_hooks_cache(self):
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1104
        try:
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1105
            return self._threaddata.pruned_hooks_cache
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1106
        except AttributeError:
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1107
            self._threaddata.pruned_hooks_cache = {}
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1108
            return self._threaddata.pruned_hooks_cache
d240cff2d8ba [hooks selection optimization] prune hooks when multiple entities are concerned by a hm.call_hooks() (closes: #1672022)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7352
diff changeset
  1109
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1110
    def add_operation(self, operation, index=None):
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1111
        """add an operation"""
4767
74b8e39d4825 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
  1112
        if index is None:
74b8e39d4825 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
  1113
            self.pending_operations.append(operation)
74b8e39d4825 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4759
diff changeset
  1114
        else:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1115
            self.pending_operations.insert(index, operation)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1116
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1117
    # undo support ############################################################
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1118
8265
9747ab9230ad [repo, undo] Finish repository-side implementation of the undo feature (closes #893940)
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 8190
diff changeset
  1119
    def ertype_supports_undo(self, ertype):
9747ab9230ad [repo, undo] Finish repository-side implementation of the undo feature (closes #893940)
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 8190
diff changeset
  1120
        return self.undo_actions  and ertype not in NO_UNDO_TYPES
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1121
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1122
    def transaction_uuid(self, set=True):
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1123
        try:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1124
            return self.transaction_data['tx_uuid']
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1125
        except KeyError:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1126
            if not set:
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1127
                return
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1128
            self.transaction_data['tx_uuid'] = uuid = uuid4().hex
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1129
            self.repo.system_source.start_undoable_transaction(self, uuid)
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1130
            return uuid
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1131
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1132
    def transaction_inc_action_counter(self):
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1133
        num = self.transaction_data.setdefault('tx_action_count', 0) + 1
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1134
        self.transaction_data['tx_action_count'] = num
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1135
        return num
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1136
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1137
    # querier helpers #########################################################
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1138
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1139
    @property
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1140
    def rql_rewriter(self):
4704
a1ac5a453146 [session] fix memory leak: local thread data living in a thread that never finishes (eg, the main thread) may not be properly freed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4703
diff changeset
  1141
        # in thread local storage since the rewriter isn't thread safe
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1142
        try:
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1143
            return self._threaddata._rewriter
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1144
        except AttributeError:
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
  1145
            self._threaddata._rewriter = RQLRewriter(self)
2100
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1146
            return self._threaddata._rewriter
89b825cdec74 simplify transaction data api, reorganize code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2063
diff changeset
  1147
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1148
    def build_description(self, rqlst, args, result):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1149
        """build a description for a given result"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1150
        if len(rqlst.children) == 1 and len(rqlst.children[0].solutions) == 1:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1151
            # easy, all lines are identical
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1152
            selected = rqlst.children[0].selection
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1153
            solution = rqlst.children[0].solutions[0]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1154
            description = _make_description(selected, args, solution)
5069
135c5d7b89d0 [querier] introduce RepeatList class, used to optimize size of data returned for result set description
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5046
diff changeset
  1155
            return RepeatList(len(result), tuple(description))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1156
        # hard, delegate the work :o)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1157
        return self.manual_build_descr(rqlst, args, result)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1158
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1159
    def manual_build_descr(self, rqlst, args, result):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1160
        """build a description for a given result by analysing each row
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1161
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1162
        XXX could probably be done more efficiently during execution of query
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1163
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1164
        # not so easy, looks for variable which changes from one solution
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1165
        # to another
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1166
        unstables = rqlst.get_variable_indices()
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1167
        basedescr = []
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1168
        todetermine = []
7969
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1169
        for i in xrange(len(rqlst.children[0].selection)):
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1170
            ttype = selection_idx_type(i, rqlst, args)
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1171
            if ttype is None or ttype == 'Any':
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1172
                ttype = None
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1173
                isfinal = True
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1174
            else:
7969
d43569aaf5d6 [rset] don't only consider a sample select node / solution to compute rset description. Closes #2036499
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7815
diff changeset
  1175
                isfinal = ttype in BASE_TYPES
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1176
            if ttype is None or i in unstables:
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1177
                basedescr.append(None)
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1178
                todetermine.append( (i, isfinal) )
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1179
            else:
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1180
                basedescr.append(ttype)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1181
        if not todetermine:
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1182
            return RepeatList(len(result), tuple(basedescr))
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1183
        return self._build_descr(result, basedescr, todetermine)
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1184
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1185
    def _build_descr(self, result, basedescription, todetermine):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1186
        description = []
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1187
        etype_from_eid = self.describe
7730
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1188
        todel = []
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1189
        for i, row in enumerate(result):
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1190
            row_descr = basedescription[:]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1191
            for index, isfinal in todetermine:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1192
                value = row[index]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1193
                if value is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1194
                    # None value inserted by an outer join, no type
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1195
                    row_descr[index] = None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1196
                    continue
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1197
                if isfinal:
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1198
                    row_descr[index] = etype_from_pyobj(value)
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1199
                else:
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1200
                    try:
1169
52058e8a3af9 somewhat handle corrupted database when manually building a database
sylvain.thenault@logilab.fr
parents: 974
diff changeset
  1201
                        row_descr[index] = etype_from_eid(value)[0]
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1202
                    except UnknownEid:
7730
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1203
                        self.error('wrong eid %s in repository, you should '
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1204
                                   'db-check the database' % value)
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1205
                        todel.append(i)
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1206
                        break
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1207
            else:
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1208
                description.append(tuple(row_descr))
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1209
        for i in reversed(todel):
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7706
diff changeset
  1210
            del result[i]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1211
        return description
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1212
2855
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
  1213
    # deprecated ###############################################################
1d9be3dffa94 [repo] more deprecation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2840
diff changeset
  1214
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
  1215
    @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
  1216
    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
  1217
        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
  1218
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1219
    @property
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1220
    @deprecated("[3.13] use .cnxset attribute instead of .pool")
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1221
    def pool(self):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1222
        return self.cnxset
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1223
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1224
    @deprecated("[3.13] use .set_cnxset() method instead of .set_pool()")
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1225
    def set_pool(self):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1226
        return self.set_cnxset()
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1227
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1228
    @deprecated("[3.13] use .free_cnxset() method instead of .reset_pool()")
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1229
    def reset_pool(self):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1230
        return self.free_cnxset()
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
  1231
4987
ec93dd82c83f [repo] fix warning message and implementation of bw compat unsafe_execute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4924
diff changeset
  1232
    @deprecated("[3.7] execute is now unsafe by default in hooks/operation. You"
5130
929984f017e6 nicer warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5108
diff changeset
  1233
                " can also control security with the security_enabled context "
929984f017e6 nicer warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5108
diff changeset
  1234
                "manager")
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
  1235
    def unsafe_execute(self, rql, kwargs=None, eid_key=None, build_descr=True,
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
  1236
                       propagate=False):
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
  1237
        """like .execute but with security checking disabled (this method is
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
  1238
        internal to the server, it's not part of the db-api)
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
  1239
        """
4987
ec93dd82c83f [repo] fix warning message and implementation of bw compat unsafe_execute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4924
diff changeset
  1240
        with security_enabled(self, read=False, write=False):
ec93dd82c83f [repo] fix warning message and implementation of bw compat unsafe_execute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4924
diff changeset
  1241
            return self.execute(rql, kwargs, eid_key, build_descr)
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
  1242
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
  1243
    @property
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
  1244
    @deprecated("[3.7] is_super_session is deprecated, test "
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
  1245
                "session.read_security and or session.write_security")
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
  1246
    def is_super_session(self):
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
  1247
        return not self.read_security or not self.write_security
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
  1248
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
  1249
    @deprecated("[3.7] session is actual session")
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
  1250
    def actual_session(self):
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
  1251
        """return the original parent session if any, else self"""
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
  1252
        return self
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
  1253
7083
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7054
diff changeset
  1254
    # 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
  1255
    # 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
  1256
    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
  1257
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1258
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1259
class InternalSession(Session):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1260
    """special session created internaly by the repository"""
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
  1261
    is_internal_session = True
5193
c9671feff5e2 [session] no way for queries from an InternalSession to be a dbapi query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
  1262
    running_dbapi_query = False
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1263
7706
359bc86d2827 [session] safe internal sessions don't deactivate integrity hooks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7665
diff changeset
  1264
    def __init__(self, repo, cnxprops=None, safe=False):
2891
60afb9705035 [session] temporary fix, need .req on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2880
diff changeset
  1265
        super(InternalSession, self).__init__(InternalManager(), repo, cnxprops,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1266
                                              _id='internal')
6071
c7a9e25153c2 [session] should be _cw, not req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6028
diff changeset
  1267
        self.user._cw = self # XXX remove when "vreg = user._cw.vreg" hack in entity.py is gone
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1268
        self.cnxtype = 'inmemory'
7706
359bc86d2827 [session] safe internal sessions don't deactivate integrity hooks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7665
diff changeset
  1269
        if not safe:
359bc86d2827 [session] safe internal sessions don't deactivate integrity hooks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7665
diff changeset
  1270
            self.disable_hook_categories('integrity')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1271
5906
d40ced753291 [repository] fix so that when repository is shutting down, internal session in transaction are interrupted
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5826
diff changeset
  1272
    @property
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1273
    def cnxset(self):
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1274
        """connections set, set according to transaction mode for each query"""
5906
d40ced753291 [repository] fix so that when repository is shutting down, internal session in transaction are interrupted
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5826
diff changeset
  1275
        if self.repo.shutting_down:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1276
            self.free_cnxset(True)
7573
c8f8762c986d [repo, looping task] raise a custom exception when repository is shuting down, avoid looping task to be restarted in such case. Closes #1021276
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7526
diff changeset
  1277
            raise ShuttingDown('repository is shutting down')
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7387
diff changeset
  1278
        return getattr(self._threaddata, 'cnxset', None)
5906
d40ced753291 [repository] fix so that when repository is shutting down, internal session in transaction are interrupted
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5826
diff changeset
  1279
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1280
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1281
class InternalManager(object):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1282
    """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
  1283
    bootstrapping the repository or creating regular users according to
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1284
    repository content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1285
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1286
    def __init__(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1287
        self.eid = -1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1288
        self.login = u'__internal_manager__'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1289
        self.properties = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1290
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1291
    def matching_groups(self, groups):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1292
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1293
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1294
    def is_in_group(self, group):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1295
        return True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1296
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1297
    def owns(self, eid):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1298
        return True
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
  1299
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1300
    def property_value(self, key):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1301
        if key == 'ui.language':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1302
            return 'en'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1303
        return None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1304
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1305
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1306
from logging import getLogger
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1307
from cubicweb import set_log_methods
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1308
set_log_methods(Session, getLogger('cubicweb.session'))