diff --git a/pymysql/connections.py b/pymysql/connections.py index 3a04ddd6..5940ec2b 100644 --- a/pymysql/connections.py +++ b/pymysql/connections.py @@ -151,6 +151,7 @@ class Connection: (if no authenticate method) for returning a string from the user. (experimental) :param server_public_key: SHA256 authentication plugin public key value. (default: None) :param binary_prefix: Add _binary prefix on bytes and bytearray. (default: False) + :param timeout_on_ping: Set to true to re-use the connect_timeout for ping (default: False) :param compress: Not supported. :param named_pipe: Not supported. :param db: **DEPRECATED** Alias for database. @@ -204,6 +205,7 @@ def __init__( ssl_key_password=None, ssl_verify_cert=None, ssl_verify_identity=None, + timeout_on_ping=False, compress=None, # not supported named_pipe=None, # not supported passwd=None, # deprecated @@ -311,6 +313,7 @@ def _config(key, arg): if write_timeout is not None and write_timeout <= 0: raise ValueError("write_timeout should be > 0") self._write_timeout = write_timeout + self._timeout_on_ping = timeout_on_ping self.charset = charset or DEFAULT_CHARSET self.collation = collation @@ -590,7 +593,15 @@ def ping(self, reconnect=True): reconnect = False else: raise err.Error("Already closed") + + read_timeout = self._read_timeout + write_timeout = self._write_timeout + try: + if self._timeout_on_ping: + self._read_timeout = self.connect_timeout + self._write_timeout = self.connect_timeout + self._execute_command(COMMAND.COM_PING, "") self._read_ok_packet() except Exception: @@ -599,6 +610,10 @@ def ping(self, reconnect=True): self.ping(False) else: raise + finally: + if self._timeout_on_ping: + self._read_timeout = read_timeout + self._write_timeout = write_timeout def set_charset(self, charset): """Deprecated. Use set_character_set() instead."""