diff --git a/Modules/_sqlite/clinic/module.c.h b/Modules/_sqlite/clinic/module.c.h index f5278078a36a5f..a9006d084be5f7 100644 --- a/Modules/_sqlite/clinic/module.c.h +++ b/Modules/_sqlite/clinic/module.c.h @@ -46,6 +46,45 @@ pysqlite_complete_statement(PyObject *module, PyObject *const *args, Py_ssize_t return return_value; } + + +PyDoc_STRVAR(pysqlite_status__doc__, +"status($module, /, statement)\n" +"--\n" +"\n" +"Retrieve runtime status information about the performance of SQLite."); + +#define PYSQLITE_STATUS_METHODDEF \ + {"status", _PyCFunction_CAST(pysqlite_status), METH_FASTCALL|METH_KEYWORDS, pysqlite_status__doc__}, + +static PyObject * +pysqlite_status_impl(PyObject *module, int op, int resetFlag); + +static PyObject * +pysqlite_status(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"op", "resultFlag", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "status", 0}; + PyObject *argsbuf[2]; + int op; + int resultFlag; + + // TODO: handle kwargs + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + op = PyLong_AsLong(args[0]); + resultFlag = PyLong_AsLong(args[1]); + return_value = pysqlite_status_impl(module, op, resultFlag); + +exit: + return return_value; +} + + + PyDoc_STRVAR(pysqlite_enable_shared_cache__doc__, "enable_shared_cache($module, /, do_enable)\n" "--\n" diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index e633a63ae9e1bd..0c30b920cb9a67 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -28,6 +28,7 @@ #include "microprotocols.h" #include "row.h" #include "blob.h" +#include "util.h" #if SQLITE_VERSION_NUMBER < 3007015 #error "SQLite 3.7.15 or higher required" @@ -101,6 +102,35 @@ pysqlite_complete_statement_impl(PyObject *module, const char *statement) } } +/*[clinic input] +_sqlite3.status as pysqlite_status + + op: int + resetFlag: int + +# TODO update +Checks if a string contains a complete SQL statement. +[clinic start generated code]*/ + +static PyObject * +pysqlite_status_impl(PyObject *module, int op, int resetFlag) +/*[clinic end generated code: output=e55f1ff1952df558 input=ac45d257375bb828]*/ +{ + int statement = op; + int current = -1; + int highwater = -1; + + int rc = sqlite3_status(op, ¤t, &highwater, resetFlag); + +// if (rc != SQLITE_OK) { +// _pysqlite_seterror(state, db); +// return NULL; +// } + + // TODO: create a structure to return both + return PyLong_FromLong(current); +} + /*[clinic input] _sqlite3.enable_shared_cache as pysqlite_enable_shared_cache @@ -271,6 +301,7 @@ load_functools_lru_cache(PyObject *module) static PyMethodDef module_methods[] = { PYSQLITE_ADAPT_METHODDEF PYSQLITE_COMPLETE_STATEMENT_METHODDEF + PYSQLITE_STATUS_METHODDEF PYSQLITE_CONNECT_METHODDEF PYSQLITE_ENABLE_CALLBACK_TRACE_METHODDEF PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF @@ -535,6 +566,16 @@ add_integer_constants(PyObject *module) { #if SQLITE_VERSION_NUMBER >= 3008007 ADD_INT(SQLITE_LIMIT_WORKER_THREADS); #endif + ADD_INT(SQLITE_STATUS_MEMORY_USED); + ADD_INT(SQLITE_STATUS_PAGECACHE_USED); + ADD_INT(SQLITE_STATUS_PAGECACHE_OVERFLOW); + ADD_INT(SQLITE_STATUS_SCRATCH_USED); /* NOT USED */ + ADD_INT(SQLITE_STATUS_SCRATCH_OVERFLOW); /* NOT USED */ + ADD_INT(SQLITE_STATUS_MALLOC_SIZE); + ADD_INT(SQLITE_STATUS_PARSER_STACK); + ADD_INT(SQLITE_STATUS_PAGECACHE_SIZE); + ADD_INT(SQLITE_STATUS_SCRATCH_SIZE); /* NOT USED */ + ADD_INT(SQLITE_STATUS_MALLOC_COUNT); #undef ADD_INT return 0; }