server/repository.py
changeset 10345 ef54ea75a642
parent 10342 28db21e0c8e5
child 10346 b926ff4ef4a8
equal deleted inserted replaced
10342:28db21e0c8e5 10345:ef54ea75a642
    47                       UnknownEid, AuthenticationError, ExecutionError,
    47                       UnknownEid, AuthenticationError, ExecutionError,
    48                       BadConnectionId, Unauthorized, ValidationError,
    48                       BadConnectionId, Unauthorized, ValidationError,
    49                       UniqueTogetherError, onevent)
    49                       UniqueTogetherError, onevent)
    50 from cubicweb import cwvreg, schema, server
    50 from cubicweb import cwvreg, schema, server
    51 from cubicweb.server import ShuttingDown, utils, hook, querier, sources
    51 from cubicweb.server import ShuttingDown, utils, hook, querier, sources
    52 from cubicweb.server.session import Session, InternalSession, InternalManager
    52 from cubicweb.server.session import Session, InternalManager
    53 from cubicweb.server.ssplanner import EditedEntity
    53 from cubicweb.server.ssplanner import EditedEntity
    54 
    54 
    55 NO_CACHE_RELATIONS = set( [('owned_by', 'object'),
    55 NO_CACHE_RELATIONS = set( [('owned_by', 'object'),
    56                            ('created_by', 'object'),
    56                            ('created_by', 'object'),
    57                            ('cw_source', 'object'),
    57                            ('cw_source', 'object'),
   625                                      if not rschema.meta)
   625                                      if not rschema.meta)
   626         cwuserattrs = self._cwuser_attrs
   626         cwuserattrs = self._cwuser_attrs
   627         for k in chain(fetch_attrs, query_attrs):
   627         for k in chain(fetch_attrs, query_attrs):
   628             if k not in cwuserattrs:
   628             if k not in cwuserattrs:
   629                 raise Exception('bad input for find_user')
   629                 raise Exception('bad input for find_user')
   630         with self.internal_session() as session:
   630         with self.internal_cnx() as cnx:
   631             varmaker = rqlvar_maker()
   631             varmaker = rqlvar_maker()
   632             vars = [(attr, varmaker.next()) for attr in fetch_attrs]
   632             vars = [(attr, varmaker.next()) for attr in fetch_attrs]
   633             rql = 'Any %s WHERE X is CWUser, ' % ','.join(var[1] for var in vars)
   633             rql = 'Any %s WHERE X is CWUser, ' % ','.join(var[1] for var in vars)
   634             rql += ','.join('X %s %s' % (var[0], var[1]) for var in vars) + ','
   634             rql += ','.join('X %s %s' % (var[0], var[1]) for var in vars) + ','
   635             rset = session.execute(rql + ','.join('X %s %%(%s)s' % (attr, attr)
   635             rset = cnx.execute(rql + ','.join('X %s %%(%s)s' % (attr, attr)
   636                                                   for attr in query_attrs),
   636                                               for attr in query_attrs),
   637                                    query_attrs)
   637                                query_attrs)
   638             return rset.rows
   638             return rset.rows
   639 
   639 
   640     def new_session(self, login, **kwargs):
   640     def new_session(self, login, **kwargs):
   641         """open a new session for a given user
   641         """open a new session for a given user
   642 
   642 
   708             if session.timestamp < mintime:
   708             if session.timestamp < mintime:
   709                 self.close(session.sessionid)
   709                 self.close(session.sessionid)
   710                 nbclosed += 1
   710                 nbclosed += 1
   711         return nbclosed
   711         return nbclosed
   712 
   712 
   713     @deprecated("[3.19] use internal_cnx now\n"
       
   714                 "(Beware that integrity hook are now enabled by default)")
       
   715     def internal_session(self, cnxprops=None, safe=False):
       
   716         """return a dbapi like connection/cursor using internal user which have
       
   717         every rights on the repository. The `safe` argument is a boolean flag
       
   718         telling if integrity hooks should be activated or not.
       
   719 
       
   720         /!\ the safe argument is False by default.
       
   721 
       
   722         *YOU HAVE TO* commit/rollback or close (rollback implicitly) the
       
   723         session once the job's done, else you'll leak connections set up to the
       
   724         time where no one is available, causing irremediable freeze...
       
   725         """
       
   726         session = InternalSession(self, cnxprops)
       
   727         if not safe:
       
   728             session.disable_hook_categories('integrity')
       
   729         session.disable_hook_categories('security')
       
   730         session._cnx.ctx_count += 1
       
   731         session.set_cnxset()
       
   732         return session
       
   733 
       
   734     @contextmanager
   713     @contextmanager
   735     def internal_cnx(self):
   714     def internal_cnx(self):
   736         """Context manager returning a Connection using internal user which have
   715         """Context manager returning a Connection using internal user which have
   737         every access rights on the repository.
   716         every access rights on the repository.
   738 
   717 
   739         Beware that unlike the older :meth:`internal_session`, internal
   718         Beware that unlike the older :meth:`internal_session`, internal
   740         connections have all hooks beside security enabled.
   719         connections have all hooks beside security enabled.
   741         """
   720         """
   742         with InternalSession(self) as session:
   721         with Session(InternalManager(), self) as session:
   743             with session.new_cnx() as cnx:
   722             with session.new_cnx() as cnx:
   744                 with cnx.security_enabled(read=False, write=False):
   723                 with cnx.security_enabled(read=False, write=False):
   745                     with cnx.ensure_cnx_set:
   724                     with cnx.ensure_cnx_set:
   746                         yield cnx
   725                         yield cnx
   747 
   726