def connect()

in mysqlx-connector-python/lib/mysqlx/connection.py [0:0]


    def connect(self) -> None:
        """Attempt to connect to the MySQL server.

        Raises:
            :class:`mysqlx.InterfaceError`: If fails to connect to the MySQL
                                            server.
            :class:`mysqlx.TimeoutError`: If connect timeout was exceeded.
        """
        # Loop and check
        error = None
        while self.router_manager.can_failover():
            try:
                router = self.router_manager.get_next_router()
                self.stream.connect(
                    router.get_connection_params(), self._connect_timeout  # type: ignore[arg-type]
                )
                reader = MessageReader(self.stream)
                writer = MessageWriter(self.stream)
                self.protocol = Protocol(reader, writer)

                caps_data = self.protocol.get_capabilites().capabilities
                caps = (
                    {get_item_or_attr(cap, "name").lower(): cap for cap in caps_data}
                    if caps_data
                    else {}
                )

                # Set TLS capabilities
                self._set_tls_capabilities(caps)

                # Set connection attributes capabilities
                if "attributes" in self.settings:
                    conn_attrs = self.settings["attributes"]
                    self.protocol.set_capabilities(session_connect_attrs=conn_attrs)

                # Set compression capabilities
                compression = self.settings.get("compression", Compression.PREFERRED)
                algorithms = self.settings.get("compression-algorithms")
                algorithm = (
                    None
                    if compression == Compression.DISABLED
                    else self._set_compression_capabilities(
                        caps, compression, algorithms
                    )
                )
                self._authenticate()
                self.protocol.set_compression(algorithm)
                return
            except (OSError, RuntimeError) as err:
                error = err
                router.set_unavailable()

        # Python 2.7 does not raise a socket.timeout exception when using
        # settimeout(), but it raises a socket.error with errno.EAGAIN (11)
        # or errno.EINPROGRESS (115) if connect-timeout value is too low
        if error is not None and isinstance(error, socket.timeout):
            if len(self._routers) <= 1:
                raise TimeoutError(
                    "Connection attempt to the server was aborted. "
                    f"Timeout of {self._connect_timeout} ms was exceeded"
                )
            raise TimeoutError(
                "All server connection attempts were aborted. "
                f"Timeout of {self._connect_timeout} ms was exceeded for each "
                "selected server"
            )
        if len(self._routers) <= 1:
            raise InterfaceError(f"Cannot connect to host: {error}")
        raise InterfaceError("Unable to connect to any of the target hosts", 4001)