mirror of
https://github.com/PyMySQL/mysqlclient.git
synced 2025-08-14 18:12:35 +08:00
Do not use MYSQL_OPT_RECONNECT as possible. (#664)
MySQL 8.0.33+ shows deprecation warning to stderr. So we avoid using it as possible. In the future, we will deprecate `reconnect` option of the `Connection.ping()`.
This commit is contained in:
@ -25,13 +25,14 @@ USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|||||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
PERFORMANCE OF THIS SOFTWARE.
|
PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
#include <stdbool.h>
|
||||||
#include "mysql.h"
|
#include "mysql.h"
|
||||||
#include "mysqld_error.h"
|
#include "mysqld_error.h"
|
||||||
|
|
||||||
#if MYSQL_VERSION_ID >= 80000
|
#if MYSQL_VERSION_ID >= 80000
|
||||||
// https://github.com/mysql/mysql-server/commit/eb821c023cedc029ca0b06456dfae365106bee84
|
// https://github.com/mysql/mysql-server/commit/eb821c023cedc029ca0b06456dfae365106bee84
|
||||||
#define my_bool _Bool
|
// my_bool was typedef of char before MySQL 8.0.0.
|
||||||
|
#define my_bool bool
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ((MYSQL_VERSION_ID >= 50555 && MYSQL_VERSION_ID <= 50599) || \
|
#if ((MYSQL_VERSION_ID >= 50555 && MYSQL_VERSION_ID <= 50599) || \
|
||||||
@ -71,7 +72,8 @@ static PyObject *_mysql_NotSupportedError;
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
MYSQL connection;
|
MYSQL connection;
|
||||||
int open;
|
bool open;
|
||||||
|
bool reconnect;
|
||||||
PyObject *converter;
|
PyObject *converter;
|
||||||
} _mysql_ConnectionObject;
|
} _mysql_ConnectionObject;
|
||||||
|
|
||||||
@ -443,7 +445,8 @@ _mysql_ConnectionObject_Initialize(
|
|||||||
*auth_plugin=NULL;
|
*auth_plugin=NULL;
|
||||||
|
|
||||||
self->converter = NULL;
|
self->converter = NULL;
|
||||||
self->open = 0;
|
self->open = false;
|
||||||
|
self->reconnect = false;
|
||||||
|
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
|
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
|
||||||
"|ssssisOiiisssiOsiiiss:connect",
|
"|ssssisOiiisssiOsiiiss:connect",
|
||||||
@ -487,7 +490,7 @@ _mysql_ConnectionObject_Initialize(
|
|||||||
PyErr_SetNone(PyExc_MemoryError);
|
PyErr_SetNone(PyExc_MemoryError);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
self->open = 1;
|
self->open = true;
|
||||||
|
|
||||||
if (connect_timeout) {
|
if (connect_timeout) {
|
||||||
unsigned int timeout = connect_timeout;
|
unsigned int timeout = connect_timeout;
|
||||||
@ -686,7 +689,7 @@ _mysql_ConnectionObject_close(
|
|||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
mysql_close(&(self->connection));
|
mysql_close(&(self->connection));
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
self->open = 0;
|
self->open = false;
|
||||||
_mysql_ConnectionObject_clear(self);
|
_mysql_ConnectionObject_clear(self);
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
@ -1852,18 +1855,18 @@ _mysql_ResultObject_num_rows(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char _mysql_ConnectionObject_ping__doc__[] =
|
static char _mysql_ConnectionObject_ping__doc__[] =
|
||||||
"Checks whether or not the connection to the server is\n\
|
"Checks whether or not the connection to the server is working.\n\
|
||||||
working. If it has gone down, an automatic reconnection is\n\
|
|
||||||
attempted.\n\
|
|
||||||
\n\
|
\n\
|
||||||
This function can be used by clients that remain idle for a\n\
|
This function can be used by clients that remain idle for a\n\
|
||||||
long while, to check whether or not the server has closed the\n\
|
long while, to check whether or not the server has closed the\n\
|
||||||
connection and reconnect if necessary.\n\
|
connection.\n\
|
||||||
\n\
|
\n\
|
||||||
New in 1.2.2: Accepts an optional reconnect parameter. If True,\n\
|
New in 1.2.2: Accepts an optional reconnect parameter. If True,\n\
|
||||||
then the client will attempt reconnection. Note that this setting\n\
|
then the client will attempt reconnection. Note that this setting\n\
|
||||||
is persistent. By default, this is on in MySQL<5.0.3, and off\n\
|
is persistent. By default, this is on in MySQL<5.0.3, and off\n\
|
||||||
thereafter.\n\
|
thereafter.\n\
|
||||||
|
MySQL 8.0.33 deprecated the MYSQL_OPT_RECONNECT option so reconnect\n\
|
||||||
|
parameter is also deprecated in mysqlclient 2.2.1.\n\
|
||||||
\n\
|
\n\
|
||||||
Non-standard. You should assume that ping() performs an\n\
|
Non-standard. You should assume that ping() performs an\n\
|
||||||
implicit rollback; use only when starting a new transaction.\n\
|
implicit rollback; use only when starting a new transaction.\n\
|
||||||
@ -1875,17 +1878,24 @@ _mysql_ConnectionObject_ping(
|
|||||||
_mysql_ConnectionObject *self,
|
_mysql_ConnectionObject *self,
|
||||||
PyObject *args)
|
PyObject *args)
|
||||||
{
|
{
|
||||||
int r, reconnect = -1;
|
int reconnect = 0;
|
||||||
if (!PyArg_ParseTuple(args, "|I", &reconnect)) return NULL;
|
if (!PyArg_ParseTuple(args, "|p", &reconnect)) return NULL;
|
||||||
check_connection(self);
|
check_connection(self);
|
||||||
if (reconnect != -1) {
|
if (reconnect != (self->reconnect == true)) {
|
||||||
|
// libmysqlclient show warning to stderr when MYSQL_OPT_RECONNECT is used.
|
||||||
|
// so we avoid using it as possible for now.
|
||||||
|
// TODO: Warn when reconnect is true.
|
||||||
|
// MySQL 8.0.33 show warning to stderr already.
|
||||||
|
// We will emit Pytohn warning in future.
|
||||||
my_bool recon = (my_bool)reconnect;
|
my_bool recon = (my_bool)reconnect;
|
||||||
mysql_options(&self->connection, MYSQL_OPT_RECONNECT, &recon);
|
mysql_options(&self->connection, MYSQL_OPT_RECONNECT, &recon);
|
||||||
|
self->reconnect = (bool)reconnect;
|
||||||
}
|
}
|
||||||
|
int r;
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
r = mysql_ping(&(self->connection));
|
r = mysql_ping(&(self->connection));
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
if (r) return _mysql_Exception(self);
|
if (r) return _mysql_Exception(self);
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2165,7 +2175,7 @@ _mysql_ConnectionObject_dealloc(
|
|||||||
PyObject_GC_UnTrack(self);
|
PyObject_GC_UnTrack(self);
|
||||||
if (self->open) {
|
if (self->open) {
|
||||||
mysql_close(&(self->connection));
|
mysql_close(&(self->connection));
|
||||||
self->open = 0;
|
self->open = false;
|
||||||
}
|
}
|
||||||
Py_CLEAR(self->converter);
|
Py_CLEAR(self->converter);
|
||||||
MyFree(self);
|
MyFree(self);
|
||||||
|
@ -192,7 +192,9 @@ class Connection(_mysql.connection):
|
|||||||
|
|
||||||
super().__init__(*args, **kwargs2)
|
super().__init__(*args, **kwargs2)
|
||||||
self.cursorclass = cursorclass
|
self.cursorclass = cursorclass
|
||||||
self.encoders = {k: v for k, v in conv.items() if type(k) is not int}
|
self.encoders = {
|
||||||
|
k: v for k, v in conv.items() if type(k) is not int # noqa: E721
|
||||||
|
}
|
||||||
|
|
||||||
self._server_version = tuple(
|
self._server_version = tuple(
|
||||||
[numeric_part(n) for n in self.get_server_info().split(".")[:2]]
|
[numeric_part(n) for n in self.get_server_info().split(".")[:2]]
|
||||||
|
Reference in New Issue
Block a user