gh-95132: Correctly relay *args and **kwds from sqlite3.connect to factory (#95146)

This PR partially reverts gh-24421 (PR) and fixes the remaining concerns
given in gh-93044 (issue):

- keyword arguments are passed as positional arguments to factory()
- if an argument is not passed to sqlite3.connect(), its default value
  is passed to factory()

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Erlend Egeberg Aasland 2022-07-23 09:51:28 +02:00 committed by GitHub
parent c1e929858a
commit a3d4d15f53
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 146 deletions

View file

@ -2,116 +2,6 @@
preserve
[clinic start generated code]*/
PyDoc_STRVAR(pysqlite_connect__doc__,
"connect($module, /, database, timeout=5.0, detect_types=0,\n"
" isolation_level=<unrepresentable>, check_same_thread=True,\n"
" factory=ConnectionType, cached_statements=128, uri=False)\n"
"--\n"
"\n"
"Opens a connection to the SQLite database file database.\n"
"\n"
"You can use \":memory:\" to open a database connection to a database that resides\n"
"in RAM instead of on disk.");
#define PYSQLITE_CONNECT_METHODDEF \
{"connect", _PyCFunction_CAST(pysqlite_connect), METH_FASTCALL|METH_KEYWORDS, pysqlite_connect__doc__},
static PyObject *
pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout,
int detect_types, PyObject *isolation_level,
int check_same_thread, PyObject *factory,
int cached_statements, int uri);
static PyObject *
pysqlite_connect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", "uri", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "connect", 0};
PyObject *argsbuf[8];
Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *database;
double timeout = 5.0;
int detect_types = 0;
PyObject *isolation_level = NULL;
int check_same_thread = 1;
PyObject *factory = (PyObject*)clinic_state()->ConnectionType;
int cached_statements = 128;
int uri = 0;
args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 8, 0, argsbuf);
if (!args) {
goto exit;
}
database = args[0];
if (!noptargs) {
goto skip_optional_pos;
}
if (args[1]) {
if (PyFloat_CheckExact(args[1])) {
timeout = PyFloat_AS_DOUBLE(args[1]);
}
else
{
timeout = PyFloat_AsDouble(args[1]);
if (timeout == -1.0 && PyErr_Occurred()) {
goto exit;
}
}
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (args[2]) {
detect_types = _PyLong_AsInt(args[2]);
if (detect_types == -1 && PyErr_Occurred()) {
goto exit;
}
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (args[3]) {
isolation_level = args[3];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (args[4]) {
check_same_thread = _PyLong_AsInt(args[4]);
if (check_same_thread == -1 && PyErr_Occurred()) {
goto exit;
}
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (args[5]) {
factory = args[5];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (args[6]) {
cached_statements = _PyLong_AsInt(args[6]);
if (cached_statements == -1 && PyErr_Occurred()) {
goto exit;
}
if (!--noptargs) {
goto skip_optional_pos;
}
}
uri = PyObject_IsTrue(args[7]);
if (uri < 0) {
goto exit;
}
skip_optional_pos:
return_value = pysqlite_connect_impl(module, database, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri);
exit:
return return_value;
}
PyDoc_STRVAR(pysqlite_complete_statement__doc__,
"complete_statement($module, /, statement)\n"
"--\n"
@ -292,4 +182,4 @@ skip_optional:
exit:
return return_value;
}
/*[clinic end generated code: output=9ac18606b0eaec03 input=a9049054013a1b77]*/
/*[clinic end generated code: output=d7f142e9a7a80468 input=a9049054013a1b77]*/