def _handle_create_session_request()

in ossdbtoolsservice/object_explorer/object_explorer_service.py [0:0]


    def _handle_create_session_request(self, request_context: RequestContext, params: ConnectionDetails) -> None:
        """Handle a create object explorer session request"""
        # Step 1: Create the session
        try:
            # Make sure we have the appropriate session params
            utils.validate.is_not_none('params', params)

            # Use the provider's default db if db name was not specified
            if params.database_name is None or params.database_name == '':
                if self._provider == utils.constants.MYSQL_PROVIDER_NAME:
                    params.database_name = self._service_provider[utils.constants.WORKSPACE_SERVICE_NAME].configuration.my_sql.default_database
                elif self._provider == utils.constants.PG_PROVIDER_NAME:
                    params.database_name = self._service_provider[utils.constants.WORKSPACE_SERVICE_NAME].configuration.pgsql.default_database

            # Use the provider's default port if port number was not specified
            if not params.port:
                params.port = utils.constants.DEFAULT_PORT[self._provider]

            # Generate the session ID and create/store the session
            session_id = self._generate_session_uri(params, self._provider)
            session: ObjectExplorerSession = ObjectExplorerSession(session_id, params)

            # Add the session to session map in a lock to prevent race conditions between check and add
            with self._session_lock:
                if session_id in self._session_map:
                    # Removed the exception for now. But we need to investigate why we would get this
                    if self._service_provider.logger is not None:
                        self._service_provider.logger.error(f'Object explorer session for {session_id} already exists!')
                    request_context.send_response(False)
                    return

                self._session_map[session_id] = session

            # Respond that the session was created
            response = CreateSessionResponse(session_id)
            request_context.send_response(response)

        except Exception as e:
            message = f'Failed to create OE session: {str(e)}'
            if self._service_provider.logger is not None:
                self._service_provider.logger.error(message)
            request_context.send_error(message)
            return

        # Step 2: Connect the session and lookup the root node asynchronously
        try:
            session.init_task = threading.Thread(target=self._initialize_session, args=(request_context, session))
            session.init_task.daemon = True
            session.init_task.start()
        except Exception as e:
            # TODO: Localize
            self._session_created_error(request_context, session, f'Failed to start OE init task: {str(e)}')