888 if threading.currentThread() in self._pyro_sessions: |
888 if threading.currentThread() in self._pyro_sessions: |
889 self._pyro_sessions[threading.currentThread()] = None |
889 self._pyro_sessions[threading.currentThread()] = None |
890 del self._sessions[sessionid] |
890 del self._sessions[sessionid] |
891 self.info('closed session %s for user %s', sessionid, session.user.login) |
891 self.info('closed session %s for user %s', sessionid, session.user.login) |
892 |
892 |
893 def call_service(self, sessionid, regid, async, **kwargs): |
893 def call_service(self, sessionid, regid, **kwargs): |
894 """ |
894 """ |
895 See :class:`cubicweb.dbapi.Connection.call_service` |
895 See :class:`cubicweb.dbapi.Connection.call_service` |
896 and :class:`cubicweb.server.Service` |
896 and :class:`cubicweb.server.Service` |
897 """ |
897 """ |
898 session = self._get_session(sessionid) |
898 session = self._get_session(sessionid) |
899 return self._call_service_with_session(session, regid, async, **kwargs) |
899 return self._call_service_with_session(session, regid, **kwargs) |
900 |
900 |
901 def _call_service_with_session(self, session, regid, async, **kwargs): |
901 def _call_service_with_session(self, session, regid, **kwargs): |
902 if async: |
902 self.info('calling service %s synchronously', regid) |
903 self.info('calling service %s asynchronously', regid) |
903 session.set_cnxset() |
904 def task(): |
904 try: |
905 session.set_cnxset() |
905 service = session.vreg['services'].select(regid, session, **kwargs) |
906 try: |
906 return service.call(**kwargs) |
907 service = session.vreg['services'].select(regid, session, **kwargs) |
907 finally: |
908 return service.call(**kwargs) |
908 session.free_cnxset() |
909 finally: |
|
910 session.rollback() # free cnxset |
|
911 self.threaded_task(task) |
|
912 else: |
|
913 self.info('calling service %s synchronously', regid) |
|
914 session.set_cnxset() |
|
915 try: |
|
916 service = session.vreg['services'].select(regid, session, **kwargs) |
|
917 return service.call(**kwargs) |
|
918 finally: |
|
919 session.free_cnxset() |
|
920 |
909 |
921 def user_info(self, sessionid, props=None): |
910 def user_info(self, sessionid, props=None): |
922 """this method should be used by client to: |
911 """this method should be used by client to: |
923 * check session id validity |
912 * check session id validity |
924 * update user information on each user's request (i.e. groups and |
913 * update user information on each user's request (i.e. groups and |