gh-93057: Deprecate positional use of optional sqlite3.connect() params (#107948)

This commit is contained in:
Erlend E. Aasland 2023-08-15 10:09:56 +02:00 committed by GitHub
parent a482e5bf00
commit 13c36dc9ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 92 additions and 5 deletions

View file

@ -18,8 +18,14 @@ PyDoc_STRVAR(pysqlite_connect__doc__,
"Open a connection to the SQLite database file \'database\'.\n"
"\n"
"You can use \":memory:\" to open a database connection to a database that\n"
"resides in RAM instead of on disk.");
"resides in RAM instead of on disk.\n"
"\n"
"Note: Passing more than 1 positional argument to _sqlite3.connect() is\n"
"deprecated. Parameters \'timeout\', \'detect_types\', \'isolation_level\',\n"
"\'check_same_thread\', \'factory\', \'cached_statements\' and \'uri\' will\n"
"become keyword-only parameters in Python 3.15.\n"
"");
#define PYSQLITE_CONNECT_METHODDEF \
{"connect", _PyCFunction_CAST(pysqlite_connect), METH_FASTCALL|METH_KEYWORDS, pysqlite_connect__doc__},
/*[clinic end generated code: output=6a8458c9edf8fb7f input=a9049054013a1b77]*/
/*[clinic end generated code: output=8d49736db880f09a input=a9049054013a1b77]*/

View file

@ -59,6 +59,39 @@ pysqlite_connection_init(PyObject *self, PyObject *args, PyObject *kwargs)
int uri = 0;
enum autocommit_mode autocommit = LEGACY_TRANSACTION_CONTROL;
// Emit compiler warnings when we get to Python 3.15.
#if PY_VERSION_HEX >= 0x030f00C0
# error \
"In connection.c, update parameter(s) 'timeout', 'detect_types', " \
"'isolation_level', 'check_same_thread', 'factory', " \
"'cached_statements' and 'uri' in the clinic input of " \
"'_sqlite3.Connection.__init__' to be keyword-only."
#elif PY_VERSION_HEX >= 0x030f00A0
# ifdef _MSC_VER
# pragma message ( \
"In connection.c, update parameter(s) 'timeout', 'detect_types', " \
"'isolation_level', 'check_same_thread', 'factory', " \
"'cached_statements' and 'uri' in the clinic input of " \
"'_sqlite3.Connection.__init__' to be keyword-only.")
# else
# warning \
"In connection.c, update parameter(s) 'timeout', 'detect_types', " \
"'isolation_level', 'check_same_thread', 'factory', " \
"'cached_statements' and 'uri' in the clinic input of " \
"'_sqlite3.Connection.__init__' to be keyword-only."
# endif
#endif
if (nargs > 1 && nargs <= 8) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing more than 1 positional argument to _sqlite3.Connection()"
" is deprecated. Parameters 'timeout', 'detect_types', "
"'isolation_level', 'check_same_thread', 'factory', "
"'cached_statements' and 'uri' will become keyword-only "
"parameters in Python 3.15.", 1))
{
goto exit;
}
}
fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 8, 0, argsbuf);
if (!fastargs) {
goto exit;
@ -1659,4 +1692,4 @@ exit:
#ifndef DESERIALIZE_METHODDEF
#define DESERIALIZE_METHODDEF
#endif /* !defined(DESERIALIZE_METHODDEF) */
/*[clinic end generated code: output=d3c6cb9326736ea5 input=a9049054013a1b77]*/
/*[clinic end generated code: output=5a05e5294ad9d2ce input=a9049054013a1b77]*/