LCOV - code coverage report
Current view: top level - Modules/_sqlite - connection.c (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 802 891 90.0 %
Date: 2022-07-20 13:12:14 Functions: 60 60 100.0 %
Branches: 392 521 75.2 %

           Branch data     Line data    Source code
       1                 :            : /* connection.c - the connection type
       2                 :            :  *
       3                 :            :  * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de>
       4                 :            :  *
       5                 :            :  * This file is part of pysqlite.
       6                 :            :  *
       7                 :            :  * This software is provided 'as-is', without any express or implied
       8                 :            :  * warranty.  In no event will the authors be held liable for any damages
       9                 :            :  * arising from the use of this software.
      10                 :            :  *
      11                 :            :  * Permission is granted to anyone to use this software for any purpose,
      12                 :            :  * including commercial applications, and to alter it and redistribute it
      13                 :            :  * freely, subject to the following restrictions:
      14                 :            :  *
      15                 :            :  * 1. The origin of this software must not be misrepresented; you must not
      16                 :            :  *    claim that you wrote the original software. If you use this software
      17                 :            :  *    in a product, an acknowledgment in the product documentation would be
      18                 :            :  *    appreciated but is not required.
      19                 :            :  * 2. Altered source versions must be plainly marked as such, and must not be
      20                 :            :  *    misrepresented as being the original software.
      21                 :            :  * 3. This notice may not be removed or altered from any source distribution.
      22                 :            :  */
      23                 :            : 
      24                 :            : #include "module.h"
      25                 :            : #include "structmember.h"         // PyMemberDef
      26                 :            : #include "connection.h"
      27                 :            : #include "statement.h"
      28                 :            : #include "cursor.h"
      29                 :            : #include "blob.h"
      30                 :            : #include "prepare_protocol.h"
      31                 :            : #include "util.h"
      32                 :            : 
      33                 :            : #if SQLITE_VERSION_NUMBER >= 3014000
      34                 :            : #define HAVE_TRACE_V2
      35                 :            : #endif
      36                 :            : 
      37                 :            : #if SQLITE_VERSION_NUMBER >= 3025000
      38                 :            : #define HAVE_WINDOW_FUNCTIONS
      39                 :            : #endif
      40                 :            : 
      41                 :            : static const char *
      42                 :        536 : get_isolation_level(const char *level)
      43                 :            : {
      44                 :            :     assert(level != NULL);
      45                 :            :     static const char *const allowed_levels[] = {
      46                 :            :         "",
      47                 :            :         "DEFERRED",
      48                 :            :         "IMMEDIATE",
      49                 :            :         "EXCLUSIVE",
      50                 :            :         NULL
      51                 :            :     };
      52         [ +  + ]:        658 :     for (int i = 0; allowed_levels[i] != NULL; i++) {
      53                 :        640 :         const char *candidate = allowed_levels[i];
      54         [ +  + ]:        640 :         if (sqlite3_stricmp(level, candidate) == 0) {
      55                 :        518 :             return candidate;
      56                 :            :         }
      57                 :            :     }
      58                 :         18 :     PyErr_SetString(PyExc_ValueError,
      59                 :            :                     "isolation_level string must be '', 'DEFERRED', "
      60                 :            :                     "'IMMEDIATE', or 'EXCLUSIVE'");
      61                 :         18 :     return NULL;
      62                 :            : }
      63                 :            : 
      64                 :            : static int
      65                 :        544 : isolation_level_converter(PyObject *str_or_none, const char **result)
      66                 :            : {
      67         [ +  + ]:        544 :     if (Py_IsNone(str_or_none)) {
      68                 :          4 :         *result = NULL;
      69                 :            :     }
      70         [ +  + ]:        540 :     else if (PyUnicode_Check(str_or_none)) {
      71                 :            :         Py_ssize_t sz;
      72                 :        537 :         const char *str = PyUnicode_AsUTF8AndSize(str_or_none, &sz);
      73         [ -  + ]:        537 :         if (str == NULL) {
      74                 :         19 :             return 0;
      75                 :            :         }
      76         [ +  + ]:        537 :         if (strlen(str) != (size_t)sz) {
      77                 :          1 :             PyErr_SetString(PyExc_ValueError, "embedded null character");
      78                 :          1 :             return 0;
      79                 :            :         }
      80                 :            : 
      81                 :        536 :         const char *level = get_isolation_level(str);
      82         [ +  + ]:        536 :         if (level == NULL) {
      83                 :         18 :             return 0;
      84                 :            :         }
      85                 :        518 :         *result = level;
      86                 :            :     }
      87                 :            :     else {
      88                 :          3 :         PyErr_SetString(PyExc_TypeError,
      89                 :            :                         "isolation_level must be str or None");
      90                 :          3 :         return 0;
      91                 :            :     }
      92                 :        522 :     return 1;
      93                 :            : }
      94                 :            : 
      95                 :            : #define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self)))
      96                 :            : #include "clinic/connection.c.h"
      97                 :            : #undef clinic_state
      98                 :            : 
      99                 :            : /*[clinic input]
     100                 :            : module _sqlite3
     101                 :            : class _sqlite3.Connection "pysqlite_Connection *" "clinic_state()->ConnectionType"
     102                 :            : [clinic start generated code]*/
     103                 :            : /*[clinic end generated code: output=da39a3ee5e6b4b0d input=67369db2faf80891]*/
     104                 :            : 
     105                 :            : static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self);
     106                 :            : static void free_callback_context(callback_context *ctx);
     107                 :            : static void set_callback_context(callback_context **ctx_pp,
     108                 :            :                                  callback_context *ctx);
     109                 :            : static void connection_close(pysqlite_Connection *self);
     110                 :            : PyObject *_pysqlite_query_execute(pysqlite_Cursor *, int, PyObject *, PyObject *);
     111                 :            : 
     112                 :            : static PyObject *
     113                 :        491 : new_statement_cache(pysqlite_Connection *self, pysqlite_state *state,
     114                 :            :                     int maxsize)
     115                 :            : {
     116                 :        491 :     PyObject *args[] = { NULL, PyLong_FromLong(maxsize), };
     117         [ -  + ]:        491 :     if (args[1] == NULL) {
     118                 :          0 :         return NULL;
     119                 :            :     }
     120                 :        491 :     PyObject *lru_cache = state->lru_cache;
     121                 :        491 :     size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
     122                 :        491 :     PyObject *inner = PyObject_Vectorcall(lru_cache, args + 1, nargsf, NULL);
     123                 :        491 :     Py_DECREF(args[1]);
     124         [ -  + ]:        491 :     if (inner == NULL) {
     125                 :          0 :         return NULL;
     126                 :            :     }
     127                 :            : 
     128                 :        491 :     args[1] = (PyObject *)self;  // Borrowed ref.
     129                 :        491 :     nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
     130                 :        491 :     PyObject *res = PyObject_Vectorcall(inner, args + 1, nargsf, NULL);
     131                 :        491 :     Py_DECREF(inner);
     132                 :        491 :     return res;
     133                 :            : }
     134                 :            : 
     135                 :            : /*[python input]
     136                 :            : class IsolationLevel_converter(CConverter):
     137                 :            :     type = "const char *"
     138                 :            :     converter = "isolation_level_converter"
     139                 :            : 
     140                 :            : [python start generated code]*/
     141                 :            : /*[python end generated code: output=da39a3ee5e6b4b0d input=cbcfe85b253061c2]*/
     142                 :            : 
     143                 :            : /*[clinic input]
     144                 :            : _sqlite3.Connection.__init__ as pysqlite_connection_init
     145                 :            : 
     146                 :            :     database: object
     147                 :            :     timeout: double = 5.0
     148                 :            :     detect_types: int = 0
     149                 :            :     isolation_level: IsolationLevel = ""
     150                 :            :     check_same_thread: bool(accept={int}) = True
     151                 :            :     factory: object(c_default='(PyObject*)clinic_state()->ConnectionType') = ConnectionType
     152                 :            :     cached_statements as cache_size: int = 128
     153                 :            :     uri: bool = False
     154                 :            : [clinic start generated code]*/
     155                 :            : 
     156                 :            : static int
     157                 :        495 : pysqlite_connection_init_impl(pysqlite_Connection *self, PyObject *database,
     158                 :            :                               double timeout, int detect_types,
     159                 :            :                               const char *isolation_level,
     160                 :            :                               int check_same_thread, PyObject *factory,
     161                 :            :                               int cache_size, int uri)
     162                 :            : /*[clinic end generated code: output=839eb2fee4293bda input=b8ce63dc6f70a383]*/
     163                 :            : {
     164         [ -  + ]:        495 :     if (PySys_Audit("sqlite3.connect", "O", database) < 0) {
     165                 :          0 :         return -1;
     166                 :            :     }
     167                 :            : 
     168                 :            :     PyObject *bytes;
     169         [ -  + ]:        495 :     if (!PyUnicode_FSConverter(database, &bytes)) {
     170                 :          0 :         return -1;
     171                 :            :     }
     172                 :            : 
     173         [ +  + ]:        495 :     if (self->initialized) {
     174                 :          2 :         PyTypeObject *tp = Py_TYPE(self);
     175                 :          2 :         tp->tp_clear((PyObject *)self);
     176                 :          2 :         connection_close(self);
     177                 :          2 :         self->initialized = 0;
     178                 :            :     }
     179                 :            : 
     180                 :            :     // Create and configure SQLite database object.
     181                 :            :     sqlite3 *db;
     182                 :            :     int rc;
     183                 :        495 :     Py_BEGIN_ALLOW_THREADS
     184         [ +  + ]:        495 :     rc = sqlite3_open_v2(PyBytes_AS_STRING(bytes), &db,
     185                 :            :                          SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
     186                 :            :                          (uri ? SQLITE_OPEN_URI : 0), NULL);
     187         [ +  + ]:        495 :     if (rc == SQLITE_OK) {
     188                 :        491 :         (void)sqlite3_busy_timeout(db, (int)(timeout*1000));
     189                 :            :     }
     190                 :        495 :     Py_END_ALLOW_THREADS
     191                 :            : 
     192                 :        495 :     Py_DECREF(bytes);
     193   [ -  +  -  - ]:        495 :     if (db == NULL && rc == SQLITE_NOMEM) {
     194                 :            :         PyErr_NoMemory();
     195                 :          0 :         return -1;
     196                 :            :     }
     197                 :            : 
     198                 :        495 :     pysqlite_state *state = pysqlite_get_state_by_type(Py_TYPE(self));
     199         [ +  + ]:        495 :     if (rc != SQLITE_OK) {
     200                 :          4 :         _pysqlite_seterror(state, db);
     201                 :          4 :         goto error;
     202                 :            :     }
     203                 :            : 
     204                 :            :     // Create LRU statement cache; returns a new reference.
     205                 :        491 :     PyObject *statement_cache = new_statement_cache(self, state, cache_size);
     206         [ -  + ]:        491 :     if (statement_cache == NULL) {
     207                 :          0 :         goto error;
     208                 :            :     }
     209                 :            : 
     210                 :            :     /* Create lists of weak references to cursors and blobs */
     211                 :        491 :     PyObject *cursors = PyList_New(0);
     212         [ -  + ]:        491 :     if (cursors == NULL) {
     213                 :          0 :         Py_DECREF(statement_cache);
     214                 :          0 :         goto error;
     215                 :            :     }
     216                 :            : 
     217                 :        491 :     PyObject *blobs = PyList_New(0);
     218         [ -  + ]:        491 :     if (blobs == NULL) {
     219                 :          0 :         Py_DECREF(statement_cache);
     220                 :          0 :         Py_DECREF(cursors);
     221                 :          0 :         goto error;
     222                 :            :     }
     223                 :            : 
     224                 :            :     // Init connection state members.
     225                 :        491 :     self->db = db;
     226                 :        491 :     self->state = state;
     227                 :        491 :     self->detect_types = detect_types;
     228                 :        491 :     self->isolation_level = isolation_level;
     229                 :        491 :     self->check_same_thread = check_same_thread;
     230                 :        491 :     self->thread_ident = PyThread_get_thread_ident();
     231                 :        491 :     self->statement_cache = statement_cache;
     232                 :        491 :     self->cursors = cursors;
     233                 :        491 :     self->blobs = blobs;
     234                 :        491 :     self->created_cursors = 0;
     235                 :        491 :     self->row_factory = Py_NewRef(Py_None);
     236                 :        491 :     self->text_factory = Py_NewRef(&PyUnicode_Type);
     237                 :        491 :     self->trace_ctx = NULL;
     238                 :        491 :     self->progress_ctx = NULL;
     239                 :        491 :     self->authorizer_ctx = NULL;
     240                 :            : 
     241                 :            :     // Borrowed refs
     242                 :        491 :     self->Warning               = state->Warning;
     243                 :        491 :     self->Error                 = state->Error;
     244                 :        491 :     self->InterfaceError        = state->InterfaceError;
     245                 :        491 :     self->DatabaseError         = state->DatabaseError;
     246                 :        491 :     self->DataError             = state->DataError;
     247                 :        491 :     self->OperationalError      = state->OperationalError;
     248                 :        491 :     self->IntegrityError        = state->IntegrityError;
     249                 :        491 :     self->InternalError         = state->InternalError;
     250                 :        491 :     self->ProgrammingError      = state->ProgrammingError;
     251                 :        491 :     self->NotSupportedError     = state->NotSupportedError;
     252                 :            : 
     253         [ -  + ]:        491 :     if (PySys_Audit("sqlite3.connect/handle", "O", self) < 0) {
     254                 :          0 :         return -1;  // Don't goto error; at this point, dealloc will clean up.
     255                 :            :     }
     256                 :            : 
     257                 :        491 :     self->initialized = 1;
     258                 :        491 :     return 0;
     259                 :            : 
     260                 :          4 : error:
     261                 :            :     // There are no statements or other SQLite objects attached to the
     262                 :            :     // database, so sqlite3_close() should always return SQLITE_OK.
     263                 :          4 :     rc = sqlite3_close(db);
     264                 :            :     assert(rc == SQLITE_OK);
     265                 :          4 :     return -1;
     266                 :            : }
     267                 :            : 
     268                 :            : #define VISIT_CALLBACK_CONTEXT(ctx) \
     269                 :            : do {                                \
     270                 :            :     if (ctx) {                      \
     271                 :            :         Py_VISIT(ctx->callable);    \
     272                 :            :         Py_VISIT(ctx->module);      \
     273                 :            :     }                               \
     274                 :            : } while (0)
     275                 :            : 
     276                 :            : static int
     277                 :        256 : connection_traverse(pysqlite_Connection *self, visitproc visit, void *arg)
     278                 :            : {
     279   [ +  -  -  + ]:        256 :     Py_VISIT(Py_TYPE(self));
     280   [ +  +  -  + ]:        256 :     Py_VISIT(self->statement_cache);
     281   [ +  -  -  + ]:        256 :     Py_VISIT(self->cursors);
     282   [ +  -  -  + ]:        256 :     Py_VISIT(self->blobs);
     283   [ +  -  -  + ]:        256 :     Py_VISIT(self->row_factory);
     284   [ +  -  -  + ]:        256 :     Py_VISIT(self->text_factory);
     285   [ +  +  +  -  :        256 :     VISIT_CALLBACK_CONTEXT(self->trace_ctx);
          -  +  +  -  -  
                      + ]
     286   [ +  +  +  -  :        256 :     VISIT_CALLBACK_CONTEXT(self->progress_ctx);
          -  +  +  -  -  
                      + ]
     287   [ +  +  +  -  :        256 :     VISIT_CALLBACK_CONTEXT(self->authorizer_ctx);
          -  +  +  -  -  
                      + ]
     288                 :            : #undef VISIT_CALLBACK_CONTEXT
     289                 :        256 :     return 0;
     290                 :            : }
     291                 :            : 
     292                 :            : static inline void
     293                 :       1833 : clear_callback_context(callback_context *ctx)
     294                 :            : {
     295         [ +  + ]:       1833 :     if (ctx != NULL) {
     296         [ +  + ]:         34 :         Py_CLEAR(ctx->callable);
     297         [ +  + ]:         34 :         Py_CLEAR(ctx->module);
     298                 :            :     }
     299                 :       1833 : }
     300                 :            : 
     301                 :            : static int
     302                 :        611 : connection_clear(pysqlite_Connection *self)
     303                 :            : {
     304         [ +  + ]:        611 :     Py_CLEAR(self->statement_cache);
     305         [ +  + ]:        611 :     Py_CLEAR(self->cursors);
     306         [ +  + ]:        611 :     Py_CLEAR(self->blobs);
     307         [ +  + ]:        611 :     Py_CLEAR(self->row_factory);
     308         [ +  + ]:        611 :     Py_CLEAR(self->text_factory);
     309                 :        611 :     clear_callback_context(self->trace_ctx);
     310                 :        611 :     clear_callback_context(self->progress_ctx);
     311                 :        611 :     clear_callback_context(self->authorizer_ctx);
     312                 :        611 :     return 0;
     313                 :            : }
     314                 :            : 
     315                 :            : static void
     316                 :        491 : free_callback_contexts(pysqlite_Connection *self)
     317                 :            : {
     318                 :        491 :     set_callback_context(&self->trace_ctx, NULL);
     319                 :        491 :     set_callback_context(&self->progress_ctx, NULL);
     320                 :        491 :     set_callback_context(&self->authorizer_ctx, NULL);
     321                 :        491 : }
     322                 :            : 
     323                 :            : static void
     324                 :        898 : connection_close(pysqlite_Connection *self)
     325                 :            : {
     326         [ +  + ]:        898 :     if (self->db) {
     327                 :        491 :         free_callback_contexts(self);
     328                 :            : 
     329                 :        491 :         sqlite3 *db = self->db;
     330                 :        491 :         self->db = NULL;
     331                 :            : 
     332                 :        491 :         Py_BEGIN_ALLOW_THREADS
     333                 :        491 :         int rc = sqlite3_close_v2(db);
     334                 :            :         assert(rc == SQLITE_OK), (void)rc;
     335                 :        491 :         Py_END_ALLOW_THREADS
     336                 :            :     }
     337                 :        898 : }
     338                 :            : 
     339                 :            : static void
     340                 :        505 : connection_dealloc(pysqlite_Connection *self)
     341                 :            : {
     342                 :        505 :     PyTypeObject *tp = Py_TYPE(self);
     343                 :        505 :     PyObject_GC_UnTrack(self);
     344                 :        505 :     tp->tp_clear((PyObject *)self);
     345                 :            : 
     346                 :            :     /* Clean up if user has not called .close() explicitly. */
     347                 :        505 :     connection_close(self);
     348                 :            : 
     349                 :        505 :     tp->tp_free(self);
     350                 :        505 :     Py_DECREF(tp);
     351                 :        505 : }
     352                 :            : 
     353                 :            : /*[clinic input]
     354                 :            : _sqlite3.Connection.cursor as pysqlite_connection_cursor
     355                 :            : 
     356                 :            :     factory: object = NULL
     357                 :            : 
     358                 :            : Return a cursor for the connection.
     359                 :            : [clinic start generated code]*/
     360                 :            : 
     361                 :            : static PyObject *
     362                 :       1313 : pysqlite_connection_cursor_impl(pysqlite_Connection *self, PyObject *factory)
     363                 :            : /*[clinic end generated code: output=562432a9e6af2aa1 input=4127345aa091b650]*/
     364                 :            : {
     365                 :            :     PyObject* cursor;
     366                 :            : 
     367   [ +  +  +  + ]:       1313 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
     368                 :          9 :         return NULL;
     369                 :            :     }
     370                 :            : 
     371         [ +  + ]:       1304 :     if (factory == NULL) {
     372                 :       1296 :         factory = (PyObject *)self->state->CursorType;
     373                 :            :     }
     374                 :            : 
     375                 :       1304 :     cursor = PyObject_CallOneArg(factory, (PyObject *)self);
     376         [ +  + ]:       1304 :     if (cursor == NULL)
     377                 :          3 :         return NULL;
     378         [ +  + ]:       1301 :     if (!PyObject_TypeCheck(cursor, self->state->CursorType)) {
     379                 :          2 :         PyErr_Format(PyExc_TypeError,
     380                 :            :                      "factory must return a cursor, not %.100s",
     381                 :          2 :                      Py_TYPE(cursor)->tp_name);
     382                 :          2 :         Py_DECREF(cursor);
     383                 :          2 :         return NULL;
     384                 :            :     }
     385                 :            : 
     386                 :       1299 :     _pysqlite_drop_unused_cursor_references(self);
     387                 :            : 
     388   [ +  -  +  + ]:       1299 :     if (cursor && self->row_factory != Py_None) {
     389                 :         15 :         Py_INCREF(self->row_factory);
     390                 :         15 :         Py_XSETREF(((pysqlite_Cursor *)cursor)->row_factory, self->row_factory);
     391                 :            :     }
     392                 :            : 
     393                 :       1299 :     return cursor;
     394                 :            : }
     395                 :            : 
     396                 :            : /*[clinic input]
     397                 :            : _sqlite3.Connection.blobopen as blobopen
     398                 :            : 
     399                 :            :     table: str
     400                 :            :         Table name.
     401                 :            :     column as col: str
     402                 :            :         Column name.
     403                 :            :     row: int
     404                 :            :         Row index.
     405                 :            :     /
     406                 :            :     *
     407                 :            :     readonly: bool(accept={int}) = False
     408                 :            :         Open the BLOB without write permissions.
     409                 :            :     name: str = "main"
     410                 :            :         Database name.
     411                 :            : 
     412                 :            : Open and return a BLOB object.
     413                 :            : [clinic start generated code]*/
     414                 :            : 
     415                 :            : static PyObject *
     416                 :         47 : blobopen_impl(pysqlite_Connection *self, const char *table, const char *col,
     417                 :            :               int row, int readonly, const char *name)
     418                 :            : /*[clinic end generated code: output=0c8e2e58516d0b5c input=1e7052516acfc94d]*/
     419                 :            : {
     420   [ +  +  -  + ]:         47 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
     421                 :          1 :         return NULL;
     422                 :            :     }
     423                 :            : 
     424                 :            :     int rc;
     425                 :            :     sqlite3_blob *blob;
     426                 :            : 
     427                 :         46 :     Py_BEGIN_ALLOW_THREADS
     428                 :         46 :     rc = sqlite3_blob_open(self->db, name, table, col, row, !readonly, &blob);
     429                 :         46 :     Py_END_ALLOW_THREADS
     430                 :            : 
     431         [ -  + ]:         46 :     if (rc == SQLITE_MISUSE) {
     432                 :          0 :         PyErr_Format(self->state->InterfaceError, sqlite3_errstr(rc));
     433                 :          0 :         return NULL;
     434                 :            :     }
     435         [ +  + ]:         46 :     else if (rc != SQLITE_OK) {
     436                 :          4 :         _pysqlite_seterror(self->state, self->db);
     437                 :          4 :         return NULL;
     438                 :            :     }
     439                 :            : 
     440                 :         42 :     pysqlite_Blob *obj = PyObject_GC_New(pysqlite_Blob, self->state->BlobType);
     441         [ -  + ]:         42 :     if (obj == NULL) {
     442                 :          0 :         goto error;
     443                 :            :     }
     444                 :            : 
     445                 :         42 :     obj->connection = (pysqlite_Connection *)Py_NewRef(self);
     446                 :         42 :     obj->blob = blob;
     447                 :         42 :     obj->offset = 0;
     448                 :         42 :     obj->in_weakreflist = NULL;
     449                 :            : 
     450                 :         42 :     PyObject_GC_Track(obj);
     451                 :            : 
     452                 :            :     // Add our blob to connection blobs list
     453                 :         42 :     PyObject *weakref = PyWeakref_NewRef((PyObject *)obj, NULL);
     454         [ -  + ]:         42 :     if (weakref == NULL) {
     455                 :          0 :         goto error;
     456                 :            :     }
     457                 :         42 :     rc = PyList_Append(self->blobs, weakref);
     458                 :         42 :     Py_DECREF(weakref);
     459         [ -  + ]:         42 :     if (rc < 0) {
     460                 :          0 :         goto error;
     461                 :            :     }
     462                 :            : 
     463                 :         42 :     return (PyObject *)obj;
     464                 :            : 
     465                 :          0 : error:
     466                 :          0 :     Py_XDECREF(obj);
     467                 :          0 :     return NULL;
     468                 :            : }
     469                 :            : 
     470                 :            : /*[clinic input]
     471                 :            : _sqlite3.Connection.close as pysqlite_connection_close
     472                 :            : 
     473                 :            : Close the database connection.
     474                 :            : 
     475                 :            : Any pending transaction is not committed implicitly.
     476                 :            : [clinic start generated code]*/
     477                 :            : 
     478                 :            : static PyObject *
     479                 :        393 : pysqlite_connection_close_impl(pysqlite_Connection *self)
     480                 :            : /*[clinic end generated code: output=a546a0da212c9b97 input=b3ed5b74f6fefc06]*/
     481                 :            : {
     482         [ +  + ]:        393 :     if (!pysqlite_check_thread(self)) {
     483                 :          1 :         return NULL;
     484                 :            :     }
     485                 :            : 
     486         [ +  + ]:        392 :     if (!self->initialized) {
     487                 :          1 :         PyTypeObject *tp = Py_TYPE(self);
     488                 :          1 :         pysqlite_state *state = pysqlite_get_state_by_type(tp);
     489                 :          1 :         PyErr_SetString(state->ProgrammingError,
     490                 :            :                         "Base Connection.__init__ not called.");
     491                 :          1 :         return NULL;
     492                 :            :     }
     493                 :            : 
     494                 :        391 :     pysqlite_close_all_blobs(self);
     495         [ +  + ]:        391 :     Py_CLEAR(self->statement_cache);
     496                 :        391 :     connection_close(self);
     497                 :            : 
     498                 :        391 :     Py_RETURN_NONE;
     499                 :            : }
     500                 :            : 
     501                 :            : /*
     502                 :            :  * Checks if a connection object is usable (i. e. not closed).
     503                 :            :  *
     504                 :            :  * 0 => error; 1 => ok
     505                 :            :  */
     506                 :       6839 : int pysqlite_check_connection(pysqlite_Connection* con)
     507                 :            : {
     508         [ +  + ]:       6839 :     if (!con->initialized) {
     509                 :          7 :         pysqlite_state *state = pysqlite_get_state_by_type(Py_TYPE(con));
     510                 :          7 :         PyErr_SetString(state->ProgrammingError,
     511                 :            :                         "Base Connection.__init__ not called.");
     512                 :          7 :         return 0;
     513                 :            :     }
     514                 :            : 
     515         [ +  + ]:       6832 :     if (!con->db) {
     516                 :         23 :         PyErr_SetString(con->state->ProgrammingError,
     517                 :            :                         "Cannot operate on a closed database.");
     518                 :         23 :         return 0;
     519                 :            :     } else {
     520                 :       6809 :         return 1;
     521                 :            :     }
     522                 :            : }
     523                 :            : 
     524                 :            : /*[clinic input]
     525                 :            : _sqlite3.Connection.commit as pysqlite_connection_commit
     526                 :            : 
     527                 :            : Commit any pending transaction to the database.
     528                 :            : 
     529                 :            : If there is no open transaction, this method is a no-op.
     530                 :            : [clinic start generated code]*/
     531                 :            : 
     532                 :            : static PyObject *
     533                 :         92 : pysqlite_connection_commit_impl(pysqlite_Connection *self)
     534                 :            : /*[clinic end generated code: output=3da45579e89407f2 input=c8793c97c3446065]*/
     535                 :            : {
     536   [ +  +  +  + ]:         92 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
     537                 :          2 :         return NULL;
     538                 :            :     }
     539                 :            : 
     540         [ +  + ]:         90 :     if (!sqlite3_get_autocommit(self->db)) {
     541                 :            :         int rc;
     542                 :            : 
     543                 :         65 :         Py_BEGIN_ALLOW_THREADS
     544                 :            :         sqlite3_stmt *statement;
     545                 :         65 :         rc = sqlite3_prepare_v2(self->db, "COMMIT", 7, &statement, NULL);
     546         [ +  - ]:         65 :         if (rc == SQLITE_OK) {
     547                 :         65 :             (void)sqlite3_step(statement);
     548                 :         65 :             rc = sqlite3_finalize(statement);
     549                 :            :         }
     550                 :         65 :         Py_END_ALLOW_THREADS
     551                 :            : 
     552         [ +  + ]:         65 :         if (rc != SQLITE_OK) {
     553                 :          1 :             (void)_pysqlite_seterror(self->state, self->db);
     554                 :          1 :             return NULL;
     555                 :            :         }
     556                 :            :     }
     557                 :            : 
     558                 :         89 :     Py_RETURN_NONE;
     559                 :            : }
     560                 :            : 
     561                 :            : /*[clinic input]
     562                 :            : _sqlite3.Connection.rollback as pysqlite_connection_rollback
     563                 :            : 
     564                 :            : Roll back to the start of any pending transaction.
     565                 :            : 
     566                 :            : If there is no open transaction, this method is a no-op.
     567                 :            : [clinic start generated code]*/
     568                 :            : 
     569                 :            : static PyObject *
     570                 :         18 : pysqlite_connection_rollback_impl(pysqlite_Connection *self)
     571                 :            : /*[clinic end generated code: output=b66fa0d43e7ef305 input=7f60a2f1076f16b3]*/
     572                 :            : {
     573   [ +  +  +  + ]:         18 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
     574                 :          2 :         return NULL;
     575                 :            :     }
     576                 :            : 
     577         [ +  + ]:         16 :     if (!sqlite3_get_autocommit(self->db)) {
     578                 :            :         int rc;
     579                 :            : 
     580                 :         10 :         Py_BEGIN_ALLOW_THREADS
     581                 :            :         sqlite3_stmt *statement;
     582                 :         10 :         rc = sqlite3_prepare_v2(self->db, "ROLLBACK", 9, &statement, NULL);
     583         [ +  - ]:         10 :         if (rc == SQLITE_OK) {
     584                 :         10 :             (void)sqlite3_step(statement);
     585                 :         10 :             rc = sqlite3_finalize(statement);
     586                 :            :         }
     587                 :         10 :         Py_END_ALLOW_THREADS
     588                 :            : 
     589         [ -  + ]:         10 :         if (rc != SQLITE_OK) {
     590                 :          0 :             (void)_pysqlite_seterror(self->state, self->db);
     591                 :          0 :             return NULL;
     592                 :            :         }
     593                 :            : 
     594                 :            :     }
     595                 :            : 
     596                 :         16 :     Py_RETURN_NONE;
     597                 :            : }
     598                 :            : 
     599                 :            : static int
     600                 :        112 : _pysqlite_set_result(sqlite3_context* context, PyObject* py_val)
     601                 :            : {
     602         [ +  + ]:        112 :     if (py_val == Py_None) {
     603                 :         21 :         sqlite3_result_null(context);
     604         [ +  + ]:         91 :     } else if (PyLong_Check(py_val)) {
     605                 :         75 :         sqlite_int64 value = _pysqlite_long_as_int64(py_val);
     606   [ +  +  +  - ]:         75 :         if (value == -1 && PyErr_Occurred())
     607                 :          7 :             return -1;
     608                 :         68 :         sqlite3_result_int64(context, value);
     609         [ +  + ]:         16 :     } else if (PyFloat_Check(py_val)) {
     610                 :          3 :         double value = PyFloat_AsDouble(py_val);
     611   [ -  +  -  - ]:          3 :         if (value == -1 && PyErr_Occurred()) {
     612                 :          0 :             return -1;
     613                 :            :         }
     614                 :          3 :         sqlite3_result_double(context, value);
     615         [ +  + ]:         13 :     } else if (PyUnicode_Check(py_val)) {
     616                 :            :         Py_ssize_t sz;
     617                 :          9 :         const char *str = PyUnicode_AsUTF8AndSize(py_val, &sz);
     618         [ +  + ]:          9 :         if (str == NULL) {
     619                 :          4 :             return -1;
     620                 :            :         }
     621         [ -  + ]:          5 :         if (sz > INT_MAX) {
     622                 :          0 :             PyErr_SetString(PyExc_OverflowError,
     623                 :            :                             "string is longer than INT_MAX bytes");
     624                 :          0 :             return -1;
     625                 :            :         }
     626                 :          5 :         sqlite3_result_text(context, str, (int)sz, SQLITE_TRANSIENT);
     627         [ +  + ]:          4 :     } else if (PyObject_CheckBuffer(py_val)) {
     628                 :            :         Py_buffer view;
     629         [ +  + ]:          3 :         if (PyObject_GetBuffer(py_val, &view, PyBUF_SIMPLE) != 0) {
     630                 :          2 :             return -1;
     631                 :            :         }
     632         [ -  + ]:          1 :         if (view.len > INT_MAX) {
     633                 :          0 :             PyErr_SetString(PyExc_OverflowError,
     634                 :            :                             "BLOB longer than INT_MAX bytes");
     635                 :          0 :             PyBuffer_Release(&view);
     636                 :          0 :             return -1;
     637                 :            :         }
     638                 :          1 :         sqlite3_result_blob(context, view.buf, (int)view.len, SQLITE_TRANSIENT);
     639                 :          1 :         PyBuffer_Release(&view);
     640                 :            :     } else {
     641                 :          1 :         callback_context *ctx = (callback_context *)sqlite3_user_data(context);
     642                 :          1 :         PyErr_Format(ctx->state->ProgrammingError,
     643                 :            :                      "User-defined functions cannot return '%s' values to "
     644                 :            :                      "SQLite",
     645                 :          1 :                      Py_TYPE(py_val)->tp_name);
     646                 :          1 :         return -1;
     647                 :            :     }
     648                 :         98 :     return 0;
     649                 :            : }
     650                 :            : 
     651                 :            : static PyObject *
     652                 :        142 : _pysqlite_build_py_params(sqlite3_context *context, int argc,
     653                 :            :                           sqlite3_value **argv)
     654                 :            : {
     655                 :            :     PyObject* args;
     656                 :            :     int i;
     657                 :            :     sqlite3_value* cur_value;
     658                 :            :     PyObject* cur_py_value;
     659                 :            : 
     660                 :        142 :     args = PyTuple_New(argc);
     661         [ -  + ]:        142 :     if (!args) {
     662                 :          0 :         return NULL;
     663                 :            :     }
     664                 :            : 
     665         [ +  + ]:        267 :     for (i = 0; i < argc; i++) {
     666                 :        125 :         cur_value = argv[i];
     667   [ +  +  +  +  :        125 :         switch (sqlite3_value_type(argv[i])) {
                      + ]
     668                 :         96 :             case SQLITE_INTEGER:
     669                 :         96 :                 cur_py_value = PyLong_FromLongLong(sqlite3_value_int64(cur_value));
     670                 :         96 :                 break;
     671                 :          3 :             case SQLITE_FLOAT:
     672                 :          3 :                 cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value));
     673                 :          3 :                 break;
     674                 :         18 :             case SQLITE_TEXT: {
     675                 :         18 :                 sqlite3 *db = sqlite3_context_db_handle(context);
     676                 :         18 :                 const char *text = (const char *)sqlite3_value_text(cur_value);
     677                 :            : 
     678   [ -  +  -  - ]:         18 :                 if (text == NULL && sqlite3_errcode(db) == SQLITE_NOMEM) {
     679                 :            :                     PyErr_NoMemory();
     680                 :          0 :                     goto error;
     681                 :            :                 }
     682                 :            : 
     683                 :         18 :                 Py_ssize_t size = sqlite3_value_bytes(cur_value);
     684                 :         18 :                 cur_py_value = PyUnicode_FromStringAndSize(text, size);
     685                 :         18 :                 break;
     686                 :            :             }
     687                 :          5 :             case SQLITE_BLOB: {
     688                 :          5 :                 sqlite3 *db = sqlite3_context_db_handle(context);
     689                 :          5 :                 const void *blob = sqlite3_value_blob(cur_value);
     690                 :            : 
     691   [ +  +  -  + ]:          5 :                 if (blob == NULL && sqlite3_errcode(db) == SQLITE_NOMEM) {
     692                 :            :                     PyErr_NoMemory();
     693                 :          0 :                     goto error;
     694                 :            :                 }
     695                 :            : 
     696                 :          5 :                 Py_ssize_t size = sqlite3_value_bytes(cur_value);
     697                 :          5 :                 cur_py_value = PyBytes_FromStringAndSize(blob, size);
     698                 :          5 :                 break;
     699                 :            :             }
     700                 :          3 :             case SQLITE_NULL:
     701                 :            :             default:
     702                 :          3 :                 cur_py_value = Py_NewRef(Py_None);
     703                 :            :         }
     704                 :            : 
     705         [ -  + ]:        125 :         if (!cur_py_value) {
     706                 :          0 :             goto error;
     707                 :            :         }
     708                 :            : 
     709                 :        125 :         PyTuple_SET_ITEM(args, i, cur_py_value);
     710                 :            :     }
     711                 :            : 
     712                 :        142 :     return args;
     713                 :            : 
     714                 :          0 : error:
     715                 :          0 :     Py_DECREF(args);
     716                 :          0 :     return NULL;
     717                 :            : }
     718                 :            : 
     719                 :            : static void
     720                 :         62 : print_or_clear_traceback(callback_context *ctx)
     721                 :            : {
     722                 :            :     assert(ctx != NULL);
     723                 :            :     assert(ctx->state != NULL);
     724         [ +  + ]:         62 :     if (ctx->state->enable_callback_tracebacks) {
     725                 :         28 :         PyErr_WriteUnraisable(ctx->callable);
     726                 :            :     }
     727                 :            :     else {
     728                 :         34 :         PyErr_Clear();
     729                 :            :     }
     730                 :         62 : }
     731                 :            : 
     732                 :            : // Checks the Python exception and sets the appropriate SQLite error code.
     733                 :            : static void
     734                 :         48 : set_sqlite_error(sqlite3_context *context, const char *msg)
     735                 :            : {
     736                 :            :     assert(PyErr_Occurred());
     737         [ +  + ]:         48 :     if (PyErr_ExceptionMatches(PyExc_MemoryError)) {
     738                 :          2 :         sqlite3_result_error_nomem(context);
     739                 :            :     }
     740         [ +  + ]:         46 :     else if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
     741                 :          9 :         sqlite3_result_error_toobig(context);
     742                 :            :     }
     743                 :            :     else {
     744                 :         37 :         sqlite3_result_error(context, msg, -1);
     745                 :            :     }
     746                 :         48 :     callback_context *ctx = (callback_context *)sqlite3_user_data(context);
     747                 :         48 :     print_or_clear_traceback(ctx);
     748                 :         48 : }
     749                 :            : 
     750                 :            : static void
     751                 :         52 : func_callback(sqlite3_context *context, int argc, sqlite3_value **argv)
     752                 :            : {
     753                 :         52 :     PyGILState_STATE threadstate = PyGILState_Ensure();
     754                 :            : 
     755                 :            :     PyObject* args;
     756                 :         52 :     PyObject* py_retval = NULL;
     757                 :            :     int ok;
     758                 :            : 
     759                 :         52 :     args = _pysqlite_build_py_params(context, argc, argv);
     760         [ +  - ]:         52 :     if (args) {
     761                 :         52 :         callback_context *ctx = (callback_context *)sqlite3_user_data(context);
     762                 :            :         assert(ctx != NULL);
     763                 :         52 :         py_retval = PyObject_CallObject(ctx->callable, args);
     764                 :         52 :         Py_DECREF(args);
     765                 :            :     }
     766                 :            : 
     767                 :         52 :     ok = 0;
     768         [ +  + ]:         52 :     if (py_retval) {
     769                 :         46 :         ok = _pysqlite_set_result(context, py_retval) == 0;
     770                 :         46 :         Py_DECREF(py_retval);
     771                 :            :     }
     772         [ +  + ]:         52 :     if (!ok) {
     773                 :         19 :         set_sqlite_error(context, "user-defined function raised exception");
     774                 :            :     }
     775                 :            : 
     776                 :         52 :     PyGILState_Release(threadstate);
     777                 :         52 : }
     778                 :            : 
     779                 :            : static void
     780                 :         78 : step_callback(sqlite3_context *context, int argc, sqlite3_value **params)
     781                 :            : {
     782                 :         78 :     PyGILState_STATE threadstate = PyGILState_Ensure();
     783                 :            : 
     784                 :            :     PyObject* args;
     785                 :         78 :     PyObject* function_result = NULL;
     786                 :            :     PyObject** aggregate_instance;
     787                 :         78 :     PyObject* stepmethod = NULL;
     788                 :            : 
     789                 :         78 :     callback_context *ctx = (callback_context *)sqlite3_user_data(context);
     790                 :            :     assert(ctx != NULL);
     791                 :            : 
     792                 :         78 :     aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
     793         [ +  + ]:         78 :     if (*aggregate_instance == NULL) {
     794                 :         39 :         *aggregate_instance = PyObject_CallNoArgs(ctx->callable);
     795         [ +  + ]:         39 :         if (!*aggregate_instance) {
     796                 :          4 :             set_sqlite_error(context,
     797                 :            :                     "user-defined aggregate's '__init__' method raised error");
     798                 :          4 :             goto error;
     799                 :            :         }
     800                 :            :     }
     801                 :            : 
     802                 :         74 :     stepmethod = PyObject_GetAttr(*aggregate_instance, ctx->state->str_step);
     803         [ +  + ]:         74 :     if (!stepmethod) {
     804                 :          4 :         set_sqlite_error(context,
     805                 :            :                 "user-defined aggregate's 'step' method not defined");
     806                 :          4 :         goto error;
     807                 :            :     }
     808                 :            : 
     809                 :         70 :     args = _pysqlite_build_py_params(context, argc, params);
     810         [ -  + ]:         70 :     if (!args) {
     811                 :          0 :         goto error;
     812                 :            :     }
     813                 :            : 
     814                 :         70 :     function_result = PyObject_CallObject(stepmethod, args);
     815                 :         70 :     Py_DECREF(args);
     816                 :            : 
     817         [ +  + ]:         70 :     if (!function_result) {
     818                 :          4 :         set_sqlite_error(context,
     819                 :            :                 "user-defined aggregate's 'step' method raised error");
     820                 :            :     }
     821                 :            : 
     822                 :         66 : error:
     823                 :         78 :     Py_XDECREF(stepmethod);
     824                 :         78 :     Py_XDECREF(function_result);
     825                 :            : 
     826                 :         78 :     PyGILState_Release(threadstate);
     827                 :         78 : }
     828                 :            : 
     829                 :            : static void
     830                 :         40 : final_callback(sqlite3_context *context)
     831                 :            : {
     832                 :         40 :     PyGILState_STATE threadstate = PyGILState_Ensure();
     833                 :            : 
     834                 :            :     PyObject* function_result;
     835                 :            :     PyObject** aggregate_instance;
     836                 :            :     int ok;
     837                 :            :     PyObject *exception, *value, *tb;
     838                 :            : 
     839                 :         40 :     aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, 0);
     840         [ +  + ]:         40 :     if (aggregate_instance == NULL) {
     841                 :            :         /* No rows matched the query; the step handler was never called. */
     842                 :          1 :         goto error;
     843                 :            :     }
     844         [ +  + ]:         39 :     else if (!*aggregate_instance) {
     845                 :            :         /* this branch is executed if there was an exception in the aggregate's
     846                 :            :          * __init__ */
     847                 :            : 
     848                 :          4 :         goto error;
     849                 :            :     }
     850                 :            : 
     851                 :            :     // Keep the exception (if any) of the last call to step, value, or inverse
     852                 :         35 :     PyErr_Fetch(&exception, &value, &tb);
     853                 :            : 
     854                 :         35 :     callback_context *ctx = (callback_context *)sqlite3_user_data(context);
     855                 :            :     assert(ctx != NULL);
     856                 :         35 :     function_result = PyObject_CallMethodNoArgs(*aggregate_instance,
     857                 :         35 :                                                 ctx->state->str_finalize);
     858                 :         35 :     Py_DECREF(*aggregate_instance);
     859                 :            : 
     860                 :         35 :     ok = 0;
     861         [ +  + ]:         35 :     if (function_result) {
     862                 :         27 :         ok = _pysqlite_set_result(context, function_result) == 0;
     863                 :         27 :         Py_DECREF(function_result);
     864                 :            :     }
     865         [ +  + ]:         35 :     if (!ok) {
     866                 :          8 :         int attr_err = PyErr_ExceptionMatches(PyExc_AttributeError);
     867                 :          8 :         _PyErr_ChainExceptions(exception, value, tb);
     868                 :            : 
     869                 :            :         /* Note: contrary to the step, value, and inverse callbacks, SQLite
     870                 :            :          * does _not_, as of SQLite 3.38.0, propagate errors to sqlite3_step()
     871                 :            :          * from the finalize callback. This implies that execute*() will not
     872                 :            :          * raise OperationalError, as it normally would. */
     873         [ +  + ]:          8 :         set_sqlite_error(context, attr_err
     874                 :            :                 ? "user-defined aggregate's 'finalize' method not defined"
     875                 :            :                 : "user-defined aggregate's 'finalize' method raised error");
     876                 :            :     }
     877                 :            :     else {
     878                 :         27 :         PyErr_Restore(exception, value, tb);
     879                 :            :     }
     880                 :            : 
     881                 :         40 : error:
     882                 :         40 :     PyGILState_Release(threadstate);
     883                 :         40 : }
     884                 :            : 
     885                 :       1299 : static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)
     886                 :            : {
     887                 :            :     PyObject* new_list;
     888                 :            :     PyObject* weakref;
     889                 :            :     int i;
     890                 :            : 
     891                 :            :     /* we only need to do this once in a while */
     892         [ +  + ]:       1299 :     if (self->created_cursors++ < 200) {
     893                 :       1297 :         return;
     894                 :            :     }
     895                 :            : 
     896                 :          2 :     self->created_cursors = 0;
     897                 :            : 
     898                 :          2 :     new_list = PyList_New(0);
     899         [ -  + ]:          2 :     if (!new_list) {
     900                 :          0 :         return;
     901                 :            :     }
     902                 :            : 
     903         [ +  + ]:        406 :     for (i = 0; i < PyList_Size(self->cursors); i++) {
     904                 :        404 :         weakref = PyList_GetItem(self->cursors, i);
     905         [ +  + ]:        404 :         if (PyWeakref_GetObject(weakref) != Py_None) {
     906         [ -  + ]:          4 :             if (PyList_Append(new_list, weakref) != 0) {
     907                 :          0 :                 Py_DECREF(new_list);
     908                 :          0 :                 return;
     909                 :            :             }
     910                 :            :         }
     911                 :            :     }
     912                 :            : 
     913                 :          2 :     Py_SETREF(self->cursors, new_list);
     914                 :            : }
     915                 :            : 
     916                 :            : /* Allocate a UDF/callback context structure. In order to ensure that the state
     917                 :            :  * pointer always outlives the callback context, we make sure it owns a
     918                 :            :  * reference to the module itself. create_callback_context() is always called
     919                 :            :  * from connection methods, so we use the defining class to fetch the module
     920                 :            :  * pointer.
     921                 :            :  */
     922                 :            : static callback_context *
     923                 :        785 : create_callback_context(PyTypeObject *cls, PyObject *callable)
     924                 :            : {
     925                 :        785 :     callback_context *ctx = PyMem_Malloc(sizeof(callback_context));
     926         [ +  - ]:        785 :     if (ctx != NULL) {
     927                 :        785 :         PyObject *module = PyType_GetModule(cls);
     928                 :        785 :         ctx->callable = Py_NewRef(callable);
     929                 :        785 :         ctx->module = Py_NewRef(module);
     930                 :        785 :         ctx->state = pysqlite_get_state(module);
     931                 :            :     }
     932                 :        785 :     return ctx;
     933                 :            : }
     934                 :            : 
     935                 :            : static void
     936                 :        785 : free_callback_context(callback_context *ctx)
     937                 :            : {
     938                 :            :     assert(ctx != NULL);
     939                 :        785 :     Py_XDECREF(ctx->callable);
     940                 :        785 :     Py_XDECREF(ctx->module);
     941                 :        785 :     PyMem_Free(ctx);
     942                 :        785 : }
     943                 :            : 
     944                 :            : static void
     945                 :       1537 : set_callback_context(callback_context **ctx_pp, callback_context *ctx)
     946                 :            : {
     947                 :            :     assert(ctx_pp != NULL);
     948                 :       1537 :     callback_context *tmp = *ctx_pp;
     949                 :       1537 :     *ctx_pp = ctx;
     950         [ +  + ]:       1537 :     if (tmp != NULL) {
     951                 :         50 :         free_callback_context(tmp);
     952                 :            :     }
     953                 :       1537 : }
     954                 :            : 
     955                 :            : static void
     956                 :        735 : destructor_callback(void *ctx)
     957                 :            : {
     958         [ +  - ]:        735 :     if (ctx != NULL) {
     959                 :            :         // This function may be called without the GIL held, so we need to
     960                 :            :         // ensure that we destroy 'ctx' with the GIL held.
     961                 :        735 :         PyGILState_STATE gstate = PyGILState_Ensure();
     962                 :        735 :         free_callback_context((callback_context *)ctx);
     963                 :        735 :         PyGILState_Release(gstate);
     964                 :            :     }
     965                 :        735 : }
     966                 :            : 
     967                 :            : /*[clinic input]
     968                 :            : _sqlite3.Connection.create_function as pysqlite_connection_create_function
     969                 :            : 
     970                 :            :     cls: defining_class
     971                 :            :     /
     972                 :            :     name: str
     973                 :            :     narg: int
     974                 :            :     func: object
     975                 :            :     *
     976                 :            :     deterministic: bool = False
     977                 :            : 
     978                 :            : Creates a new function.
     979                 :            : [clinic start generated code]*/
     980                 :            : 
     981                 :            : static PyObject *
     982                 :        565 : pysqlite_connection_create_function_impl(pysqlite_Connection *self,
     983                 :            :                                          PyTypeObject *cls, const char *name,
     984                 :            :                                          int narg, PyObject *func,
     985                 :            :                                          int deterministic)
     986                 :            : /*[clinic end generated code: output=8a811529287ad240 input=b3e8e1d8ddaffbef]*/
     987                 :            : {
     988                 :            :     int rc;
     989                 :        565 :     int flags = SQLITE_UTF8;
     990                 :            : 
     991   [ +  -  +  + ]:        565 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
     992                 :          2 :         return NULL;
     993                 :            :     }
     994                 :            : 
     995         [ +  + ]:        563 :     if (deterministic) {
     996                 :            : #if SQLITE_VERSION_NUMBER < 3008003
     997                 :            :         PyErr_SetString(self->NotSupportedError,
     998                 :            :                         "deterministic=True requires SQLite 3.8.3 or higher");
     999                 :            :         return NULL;
    1000                 :            : #else
    1001         [ -  + ]:          1 :         if (sqlite3_libversion_number() < 3008003) {
    1002                 :          0 :             PyErr_SetString(self->NotSupportedError,
    1003                 :            :                             "deterministic=True requires SQLite 3.8.3 or higher");
    1004                 :          0 :             return NULL;
    1005                 :            :         }
    1006                 :          1 :         flags |= SQLITE_DETERMINISTIC;
    1007                 :            : #endif
    1008                 :            :     }
    1009                 :        563 :     callback_context *ctx = create_callback_context(cls, func);
    1010         [ -  + ]:        563 :     if (ctx == NULL) {
    1011                 :          0 :         return NULL;
    1012                 :            :     }
    1013                 :        563 :     rc = sqlite3_create_function_v2(self->db, name, narg, flags, ctx,
    1014                 :            :                                     func_callback,
    1015                 :            :                                     NULL,
    1016                 :            :                                     NULL,
    1017                 :            :                                     &destructor_callback);  // will decref func
    1018                 :            : 
    1019         [ +  + ]:        563 :     if (rc != SQLITE_OK) {
    1020                 :            :         /* Workaround for SQLite bug: no error code or string is available here */
    1021                 :          2 :         PyErr_SetString(self->OperationalError, "Error creating function");
    1022                 :          2 :         return NULL;
    1023                 :            :     }
    1024                 :        561 :     Py_RETURN_NONE;
    1025                 :            : }
    1026                 :            : 
    1027                 :            : #ifdef HAVE_WINDOW_FUNCTIONS
    1028                 :            : /*
    1029                 :            :  * Regarding the 'inverse' aggregate callback:
    1030                 :            :  * This method is only required by window aggregate functions, not
    1031                 :            :  * ordinary aggregate function implementations.  It is invoked to remove
    1032                 :            :  * a row from the current window.  The function arguments, if any,
    1033                 :            :  * correspond to the row being removed.
    1034                 :            :  */
    1035                 :            : static void
    1036                 :         22 : inverse_callback(sqlite3_context *context, int argc, sqlite3_value **params)
    1037                 :            : {
    1038                 :         22 :     PyGILState_STATE gilstate = PyGILState_Ensure();
    1039                 :            : 
    1040                 :         22 :     callback_context *ctx = (callback_context *)sqlite3_user_data(context);
    1041                 :            :     assert(ctx != NULL);
    1042                 :            : 
    1043                 :         22 :     int size = sizeof(PyObject *);
    1044                 :         22 :     PyObject **cls = (PyObject **)sqlite3_aggregate_context(context, size);
    1045                 :            :     assert(cls != NULL);
    1046                 :            :     assert(*cls != NULL);
    1047                 :            : 
    1048                 :         22 :     PyObject *method = PyObject_GetAttr(*cls, ctx->state->str_inverse);
    1049         [ +  + ]:         22 :     if (method == NULL) {
    1050                 :          2 :         set_sqlite_error(context,
    1051                 :            :                 "user-defined aggregate's 'inverse' method not defined");
    1052                 :          2 :         goto exit;
    1053                 :            :     }
    1054                 :            : 
    1055                 :         20 :     PyObject *args = _pysqlite_build_py_params(context, argc, params);
    1056         [ -  + ]:         20 :     if (args == NULL) {
    1057                 :          0 :         set_sqlite_error(context,
    1058                 :            :                 "unable to build arguments for user-defined aggregate's "
    1059                 :            :                 "'inverse' method");
    1060                 :          0 :         goto exit;
    1061                 :            :     }
    1062                 :            : 
    1063                 :         20 :     PyObject *res = PyObject_CallObject(method, args);
    1064                 :         20 :     Py_DECREF(args);
    1065         [ +  + ]:         20 :     if (res == NULL) {
    1066                 :          2 :         set_sqlite_error(context,
    1067                 :            :                 "user-defined aggregate's 'inverse' method raised error");
    1068                 :          2 :         goto exit;
    1069                 :            :     }
    1070                 :         18 :     Py_DECREF(res);
    1071                 :            : 
    1072                 :         22 : exit:
    1073                 :         22 :     Py_XDECREF(method);
    1074                 :         22 :     PyGILState_Release(gilstate);
    1075                 :         22 : }
    1076                 :            : 
    1077                 :            : /*
    1078                 :            :  * Regarding the 'value' aggregate callback:
    1079                 :            :  * This method is only required by window aggregate functions, not
    1080                 :            :  * ordinary aggregate function implementations.  It is invoked to return
    1081                 :            :  * the current value of the aggregate.
    1082                 :            :  */
    1083                 :            : static void
    1084                 :         43 : value_callback(sqlite3_context *context)
    1085                 :            : {
    1086                 :         43 :     PyGILState_STATE gilstate = PyGILState_Ensure();
    1087                 :            : 
    1088                 :         43 :     callback_context *ctx = (callback_context *)sqlite3_user_data(context);
    1089                 :            :     assert(ctx != NULL);
    1090                 :            : 
    1091                 :         43 :     int size = sizeof(PyObject *);
    1092                 :         43 :     PyObject **cls = (PyObject **)sqlite3_aggregate_context(context, size);
    1093                 :            :     assert(cls != NULL);
    1094                 :            :     assert(*cls != NULL);
    1095                 :            : 
    1096                 :         43 :     PyObject *res = PyObject_CallMethodNoArgs(*cls, ctx->state->str_value);
    1097         [ +  + ]:         43 :     if (res == NULL) {
    1098                 :          4 :         int attr_err = PyErr_ExceptionMatches(PyExc_AttributeError);
    1099         [ +  + ]:          4 :         set_sqlite_error(context, attr_err
    1100                 :            :                 ? "user-defined aggregate's 'value' method not defined"
    1101                 :            :                 : "user-defined aggregate's 'value' method raised error");
    1102                 :            :     }
    1103                 :            :     else {
    1104                 :         39 :         int rc = _pysqlite_set_result(context, res);
    1105                 :         39 :         Py_DECREF(res);
    1106         [ +  + ]:         39 :         if (rc < 0) {
    1107                 :          1 :             set_sqlite_error(context,
    1108                 :            :                     "unable to set result from user-defined aggregate's "
    1109                 :            :                     "'value' method");
    1110                 :            :         }
    1111                 :            :     }
    1112                 :            : 
    1113                 :         43 :     PyGILState_Release(gilstate);
    1114                 :         43 : }
    1115                 :            : 
    1116                 :            : /*[clinic input]
    1117                 :            : _sqlite3.Connection.create_window_function as create_window_function
    1118                 :            : 
    1119                 :            :     cls: defining_class
    1120                 :            :     name: str
    1121                 :            :         The name of the SQL aggregate window function to be created or
    1122                 :            :         redefined.
    1123                 :            :     num_params: int
    1124                 :            :         The number of arguments the step and inverse methods takes.
    1125                 :            :     aggregate_class: object
    1126                 :            :         A class with step(), finalize(), value(), and inverse() methods.
    1127                 :            :         Set to None to clear the window function.
    1128                 :            :     /
    1129                 :            : 
    1130                 :            : Creates or redefines an aggregate window function. Non-standard.
    1131                 :            : [clinic start generated code]*/
    1132                 :            : 
    1133                 :            : static PyObject *
    1134                 :         32 : create_window_function_impl(pysqlite_Connection *self, PyTypeObject *cls,
    1135                 :            :                             const char *name, int num_params,
    1136                 :            :                             PyObject *aggregate_class)
    1137                 :            : /*[clinic end generated code: output=5332cd9464522235 input=46d57a54225b5228]*/
    1138                 :            : {
    1139         [ -  + ]:         32 :     if (sqlite3_libversion_number() < 3025000) {
    1140                 :          0 :         PyErr_SetString(self->NotSupportedError,
    1141                 :            :                         "create_window_function() requires "
    1142                 :            :                         "SQLite 3.25.0 or higher");
    1143                 :          0 :         return NULL;
    1144                 :            :     }
    1145                 :            : 
    1146   [ +  +  -  + ]:         32 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1147                 :          1 :         return NULL;
    1148                 :            :     }
    1149                 :            : 
    1150                 :         31 :     int flags = SQLITE_UTF8;
    1151                 :            :     int rc;
    1152         [ +  + ]:         31 :     if (Py_IsNone(aggregate_class)) {
    1153                 :          1 :         rc = sqlite3_create_window_function(self->db, name, num_params, flags,
    1154                 :            :                                             0, 0, 0, 0, 0, 0);
    1155                 :            :     }
    1156                 :            :     else {
    1157                 :         30 :         callback_context *ctx = create_callback_context(cls, aggregate_class);
    1158         [ -  + ]:         30 :         if (ctx == NULL) {
    1159                 :          0 :             return NULL;
    1160                 :            :         }
    1161                 :         30 :         rc = sqlite3_create_window_function(self->db, name, num_params, flags,
    1162                 :            :                                             ctx,
    1163                 :            :                                             &step_callback,
    1164                 :            :                                             &final_callback,
    1165                 :            :                                             &value_callback,
    1166                 :            :                                             &inverse_callback,
    1167                 :            :                                             &destructor_callback);
    1168                 :            :     }
    1169                 :            : 
    1170         [ +  + ]:         31 :     if (rc != SQLITE_OK) {
    1171                 :            :         // Errors are not set on the database connection, so we cannot
    1172                 :            :         // use _pysqlite_seterror().
    1173                 :          1 :         PyErr_SetString(self->ProgrammingError, sqlite3_errstr(rc));
    1174                 :          1 :         return NULL;
    1175                 :            :     }
    1176                 :         30 :     Py_RETURN_NONE;
    1177                 :            : }
    1178                 :            : #endif
    1179                 :            : 
    1180                 :            : /*[clinic input]
    1181                 :            : _sqlite3.Connection.create_aggregate as pysqlite_connection_create_aggregate
    1182                 :            : 
    1183                 :            :     cls: defining_class
    1184                 :            :     /
    1185                 :            :     name: str
    1186                 :            :     n_arg: int
    1187                 :            :     aggregate_class: object
    1188                 :            : 
    1189                 :            : Creates a new aggregate.
    1190                 :            : [clinic start generated code]*/
    1191                 :            : 
    1192                 :            : static PyObject *
    1193                 :        136 : pysqlite_connection_create_aggregate_impl(pysqlite_Connection *self,
    1194                 :            :                                           PyTypeObject *cls,
    1195                 :            :                                           const char *name, int n_arg,
    1196                 :            :                                           PyObject *aggregate_class)
    1197                 :            : /*[clinic end generated code: output=1b02d0f0aec7ff96 input=68a2a26366d4c686]*/
    1198                 :            : {
    1199                 :            :     int rc;
    1200                 :            : 
    1201   [ +  -  +  + ]:        136 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1202                 :          1 :         return NULL;
    1203                 :            :     }
    1204                 :            : 
    1205                 :        135 :     callback_context *ctx = create_callback_context(cls, aggregate_class);
    1206         [ -  + ]:        135 :     if (ctx == NULL) {
    1207                 :          0 :         return NULL;
    1208                 :            :     }
    1209                 :        135 :     rc = sqlite3_create_function_v2(self->db, name, n_arg, SQLITE_UTF8, ctx,
    1210                 :            :                                     0,
    1211                 :            :                                     &step_callback,
    1212                 :            :                                     &final_callback,
    1213                 :            :                                     &destructor_callback); // will decref func
    1214         [ -  + ]:        135 :     if (rc != SQLITE_OK) {
    1215                 :            :         /* Workaround for SQLite bug: no error code or string is available here */
    1216                 :          0 :         PyErr_SetString(self->OperationalError, "Error creating aggregate");
    1217                 :          0 :         return NULL;
    1218                 :            :     }
    1219                 :        135 :     Py_RETURN_NONE;
    1220                 :            : }
    1221                 :            : 
    1222                 :            : static int
    1223                 :         21 : authorizer_callback(void *ctx, int action, const char *arg1,
    1224                 :            :                     const char *arg2 , const char *dbname,
    1225                 :            :                     const char *access_attempt_source)
    1226                 :            : {
    1227                 :         21 :     PyGILState_STATE gilstate = PyGILState_Ensure();
    1228                 :            : 
    1229                 :            :     PyObject *ret;
    1230                 :         21 :     int rc = SQLITE_DENY;
    1231                 :            : 
    1232                 :            :     assert(ctx != NULL);
    1233                 :         21 :     PyObject *callable = ((callback_context *)ctx)->callable;
    1234                 :         21 :     ret = PyObject_CallFunction(callable, "issss", action, arg1, arg2, dbname,
    1235                 :            :                                 access_attempt_source);
    1236                 :            : 
    1237         [ +  + ]:         21 :     if (ret == NULL) {
    1238                 :          4 :         print_or_clear_traceback(ctx);
    1239                 :          4 :         rc = SQLITE_DENY;
    1240                 :            :     }
    1241                 :            :     else {
    1242         [ +  + ]:         17 :         if (PyLong_Check(ret)) {
    1243                 :         15 :             rc = _PyLong_AsInt(ret);
    1244   [ +  +  +  - ]:         15 :             if (rc == -1 && PyErr_Occurred()) {
    1245                 :          2 :                 print_or_clear_traceback(ctx);
    1246                 :          2 :                 rc = SQLITE_DENY;
    1247                 :            :             }
    1248                 :            :         }
    1249                 :            :         else {
    1250                 :          2 :             rc = SQLITE_DENY;
    1251                 :            :         }
    1252                 :         17 :         Py_DECREF(ret);
    1253                 :            :     }
    1254                 :            : 
    1255                 :         21 :     PyGILState_Release(gilstate);
    1256                 :         21 :     return rc;
    1257                 :            : }
    1258                 :            : 
    1259                 :            : static int
    1260                 :        147 : progress_callback(void *ctx)
    1261                 :            : {
    1262                 :        147 :     PyGILState_STATE gilstate = PyGILState_Ensure();
    1263                 :            : 
    1264                 :            :     int rc;
    1265                 :            :     PyObject *ret;
    1266                 :            : 
    1267                 :            :     assert(ctx != NULL);
    1268                 :        147 :     PyObject *callable = ((callback_context *)ctx)->callable;
    1269                 :        147 :     ret = PyObject_CallNoArgs(callable);
    1270         [ +  + ]:        147 :     if (!ret) {
    1271                 :            :         /* abort query if error occurred */
    1272                 :          2 :         rc = -1;
    1273                 :            :     }
    1274                 :            :     else {
    1275                 :        145 :         rc = PyObject_IsTrue(ret);
    1276                 :        145 :         Py_DECREF(ret);
    1277                 :            :     }
    1278         [ +  + ]:        147 :     if (rc < 0) {
    1279                 :          4 :         print_or_clear_traceback(ctx);
    1280                 :            :     }
    1281                 :            : 
    1282                 :        147 :     PyGILState_Release(gilstate);
    1283                 :        147 :     return rc;
    1284                 :            : }
    1285                 :            : 
    1286                 :            : #ifdef HAVE_TRACE_V2
    1287                 :            : /*
    1288                 :            :  * From https://sqlite.org/c3ref/trace_v2.html:
    1289                 :            :  * The integer return value from the callback is currently ignored, though this
    1290                 :            :  * may change in future releases. Callback implementations should return zero
    1291                 :            :  * to ensure future compatibility.
    1292                 :            :  */
    1293                 :            : static int
    1294                 :         52 : trace_callback(unsigned int type, void *ctx, void *stmt, void *sql)
    1295                 :            : #else
    1296                 :            : static void
    1297                 :            : trace_callback(void *ctx, const char *sql)
    1298                 :            : #endif
    1299                 :            : {
    1300                 :            : #ifdef HAVE_TRACE_V2
    1301         [ -  + ]:         52 :     if (type != SQLITE_TRACE_STMT) {
    1302                 :          0 :         return 0;
    1303                 :            :     }
    1304                 :            : #endif
    1305                 :            : 
    1306                 :         52 :     PyGILState_STATE gilstate = PyGILState_Ensure();
    1307                 :            : 
    1308                 :            :     assert(ctx != NULL);
    1309                 :         52 :     pysqlite_state *state = ((callback_context *)ctx)->state;
    1310                 :            :     assert(state != NULL);
    1311                 :            : 
    1312                 :         52 :     PyObject *py_statement = NULL;
    1313                 :            : #ifdef HAVE_TRACE_V2
    1314                 :         52 :     const char *expanded_sql = sqlite3_expanded_sql((sqlite3_stmt *)stmt);
    1315         [ +  + ]:         52 :     if (expanded_sql == NULL) {
    1316                 :          2 :         sqlite3 *db = sqlite3_db_handle((sqlite3_stmt *)stmt);
    1317         [ -  + ]:          2 :         if (sqlite3_errcode(db) == SQLITE_NOMEM) {
    1318                 :            :             (void)PyErr_NoMemory();
    1319                 :          0 :             goto exit;
    1320                 :            :         }
    1321                 :            : 
    1322                 :          2 :         PyErr_SetString(state->DataError,
    1323                 :            :                 "Expanded SQL string exceeds the maximum string length");
    1324                 :          2 :         print_or_clear_traceback((callback_context *)ctx);
    1325                 :            : 
    1326                 :            :         // Fall back to unexpanded sql
    1327                 :          2 :         py_statement = PyUnicode_FromString((const char *)sql);
    1328                 :            :     }
    1329                 :            :     else {
    1330                 :         50 :         py_statement = PyUnicode_FromString(expanded_sql);
    1331                 :         50 :         sqlite3_free((void *)expanded_sql);
    1332                 :            :     }
    1333                 :            : #else
    1334                 :            :     if (sql == NULL) {
    1335                 :            :         PyErr_SetString(state->DataError,
    1336                 :            :                 "Expanded SQL string exceeds the maximum string length");
    1337                 :            :         print_or_clear_traceback((callback_context *)ctx);
    1338                 :            :         goto exit;
    1339                 :            :     }
    1340                 :            :     py_statement = PyUnicode_FromString(sql);
    1341                 :            : #endif
    1342         [ +  - ]:         52 :     if (py_statement) {
    1343                 :         52 :         PyObject *callable = ((callback_context *)ctx)->callable;
    1344                 :         52 :         PyObject *ret = PyObject_CallOneArg(callable, py_statement);
    1345                 :         52 :         Py_DECREF(py_statement);
    1346                 :         52 :         Py_XDECREF(ret);
    1347                 :            :     }
    1348         [ +  + ]:         52 :     if (PyErr_Occurred()) {
    1349                 :          2 :         print_or_clear_traceback((callback_context *)ctx);
    1350                 :            :     }
    1351                 :            : 
    1352                 :         50 : exit:
    1353                 :         52 :     PyGILState_Release(gilstate);
    1354                 :            : #ifdef HAVE_TRACE_V2
    1355                 :         52 :     return 0;
    1356                 :            : #endif
    1357                 :            : }
    1358                 :            : 
    1359                 :            : /*[clinic input]
    1360                 :            : _sqlite3.Connection.set_authorizer as pysqlite_connection_set_authorizer
    1361                 :            : 
    1362                 :            :     cls: defining_class
    1363                 :            :     /
    1364                 :            :     authorizer_callback as callable: object
    1365                 :            : 
    1366                 :            : Sets authorizer callback.
    1367                 :            : [clinic start generated code]*/
    1368                 :            : 
    1369                 :            : static PyObject *
    1370                 :         21 : pysqlite_connection_set_authorizer_impl(pysqlite_Connection *self,
    1371                 :            :                                         PyTypeObject *cls,
    1372                 :            :                                         PyObject *callable)
    1373                 :            : /*[clinic end generated code: output=75fa60114fc971c3 input=605d32ba92dd3eca]*/
    1374                 :            : {
    1375   [ +  +  +  + ]:         21 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1376                 :          2 :         return NULL;
    1377                 :            :     }
    1378                 :            : 
    1379                 :            :     int rc;
    1380         [ +  + ]:         19 :     if (callable == Py_None) {
    1381                 :          5 :         rc = sqlite3_set_authorizer(self->db, NULL, NULL);
    1382                 :          5 :         set_callback_context(&self->authorizer_ctx, NULL);
    1383                 :            :     }
    1384                 :            :     else {
    1385                 :         14 :         callback_context *ctx = create_callback_context(cls, callable);
    1386         [ -  + ]:         14 :         if (ctx == NULL) {
    1387                 :          0 :             return NULL;
    1388                 :            :         }
    1389                 :         14 :         rc = sqlite3_set_authorizer(self->db, authorizer_callback, ctx);
    1390                 :         14 :         set_callback_context(&self->authorizer_ctx, ctx);
    1391                 :            :     }
    1392         [ -  + ]:         19 :     if (rc != SQLITE_OK) {
    1393                 :          0 :         PyErr_SetString(self->OperationalError,
    1394                 :            :                         "Error setting authorizer callback");
    1395                 :          0 :         set_callback_context(&self->authorizer_ctx, NULL);
    1396                 :          0 :         return NULL;
    1397                 :            :     }
    1398                 :         19 :     Py_RETURN_NONE;
    1399                 :            : }
    1400                 :            : 
    1401                 :            : /*[clinic input]
    1402                 :            : _sqlite3.Connection.set_progress_handler as pysqlite_connection_set_progress_handler
    1403                 :            : 
    1404                 :            :     cls: defining_class
    1405                 :            :     /
    1406                 :            :     progress_handler as callable: object
    1407                 :            :     n: int
    1408                 :            : 
    1409                 :            : Sets progress handler callback.
    1410                 :            : [clinic start generated code]*/
    1411                 :            : 
    1412                 :            : static PyObject *
    1413                 :         14 : pysqlite_connection_set_progress_handler_impl(pysqlite_Connection *self,
    1414                 :            :                                               PyTypeObject *cls,
    1415                 :            :                                               PyObject *callable, int n)
    1416                 :            : /*[clinic end generated code: output=0739957fd8034a50 input=f7c1837984bd86db]*/
    1417                 :            : {
    1418   [ +  -  +  + ]:         14 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1419                 :          1 :         return NULL;
    1420                 :            :     }
    1421                 :            : 
    1422         [ +  + ]:         13 :     if (callable == Py_None) {
    1423                 :            :         /* None clears the progress handler previously set */
    1424                 :          2 :         sqlite3_progress_handler(self->db, 0, 0, (void*)0);
    1425                 :          2 :         set_callback_context(&self->progress_ctx, NULL);
    1426                 :            :     }
    1427                 :            :     else {
    1428                 :         11 :         callback_context *ctx = create_callback_context(cls, callable);
    1429         [ -  + ]:         11 :         if (ctx == NULL) {
    1430                 :          0 :             return NULL;
    1431                 :            :         }
    1432                 :         11 :         sqlite3_progress_handler(self->db, n, progress_callback, ctx);
    1433                 :         11 :         set_callback_context(&self->progress_ctx, ctx);
    1434                 :            :     }
    1435                 :         13 :     Py_RETURN_NONE;
    1436                 :            : }
    1437                 :            : 
    1438                 :            : /*[clinic input]
    1439                 :            : _sqlite3.Connection.set_trace_callback as pysqlite_connection_set_trace_callback
    1440                 :            : 
    1441                 :            :     cls: defining_class
    1442                 :            :     /
    1443                 :            :     trace_callback as callable: object
    1444                 :            : 
    1445                 :            : Sets a trace callback called for each SQL statement (passed as unicode).
    1446                 :            : [clinic start generated code]*/
    1447                 :            : 
    1448                 :            : static PyObject *
    1449                 :         33 : pysqlite_connection_set_trace_callback_impl(pysqlite_Connection *self,
    1450                 :            :                                             PyTypeObject *cls,
    1451                 :            :                                             PyObject *callable)
    1452                 :            : /*[clinic end generated code: output=d91048c03bfcee05 input=351a94210c5f81bb]*/
    1453                 :            : {
    1454   [ +  +  -  + ]:         33 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1455                 :          1 :         return NULL;
    1456                 :            :     }
    1457                 :            : 
    1458         [ +  + ]:         32 :     if (callable == Py_None) {
    1459                 :            :         /*
    1460                 :            :          * None clears the trace callback previously set
    1461                 :            :          *
    1462                 :            :          * Ref.
    1463                 :            :          * - https://sqlite.org/c3ref/c_trace.html
    1464                 :            :          * - https://sqlite.org/c3ref/trace_v2.html
    1465                 :            :          */
    1466                 :            : #ifdef HAVE_TRACE_V2
    1467                 :          7 :         sqlite3_trace_v2(self->db, SQLITE_TRACE_STMT, 0, 0);
    1468                 :            : #else
    1469                 :            :         sqlite3_trace(self->db, 0, (void*)0);
    1470                 :            : #endif
    1471                 :          7 :         set_callback_context(&self->trace_ctx, NULL);
    1472                 :            :     }
    1473                 :            :     else {
    1474                 :         25 :         callback_context *ctx = create_callback_context(cls, callable);
    1475         [ -  + ]:         25 :         if (ctx == NULL) {
    1476                 :          0 :             return NULL;
    1477                 :            :         }
    1478                 :            : #ifdef HAVE_TRACE_V2
    1479                 :         25 :         sqlite3_trace_v2(self->db, SQLITE_TRACE_STMT, trace_callback, ctx);
    1480                 :            : #else
    1481                 :            :         sqlite3_trace(self->db, trace_callback, ctx);
    1482                 :            : #endif
    1483                 :         25 :         set_callback_context(&self->trace_ctx, ctx);
    1484                 :            :     }
    1485                 :            : 
    1486                 :         32 :     Py_RETURN_NONE;
    1487                 :            : }
    1488                 :            : 
    1489                 :            : #ifdef PY_SQLITE_ENABLE_LOAD_EXTENSION
    1490                 :            : /*[clinic input]
    1491                 :            : _sqlite3.Connection.enable_load_extension as pysqlite_connection_enable_load_extension
    1492                 :            : 
    1493                 :            :     enable as onoff: bool(accept={int})
    1494                 :            :     /
    1495                 :            : 
    1496                 :            : Enable dynamic loading of SQLite extension modules.
    1497                 :            : [clinic start generated code]*/
    1498                 :            : 
    1499                 :            : static PyObject *
    1500                 :            : pysqlite_connection_enable_load_extension_impl(pysqlite_Connection *self,
    1501                 :            :                                                int onoff)
    1502                 :            : /*[clinic end generated code: output=9cac37190d388baf input=5f00e93f7a9d3540]*/
    1503                 :            : {
    1504                 :            :     int rc;
    1505                 :            : 
    1506                 :            :     if (PySys_Audit("sqlite3.enable_load_extension",
    1507                 :            :                     "OO", self, onoff ? Py_True : Py_False) < 0) {
    1508                 :            :         return NULL;
    1509                 :            :     }
    1510                 :            : 
    1511                 :            :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1512                 :            :         return NULL;
    1513                 :            :     }
    1514                 :            : 
    1515                 :            :     rc = sqlite3_enable_load_extension(self->db, onoff);
    1516                 :            : 
    1517                 :            :     if (rc != SQLITE_OK) {
    1518                 :            :         PyErr_SetString(self->OperationalError,
    1519                 :            :                         "Error enabling load extension");
    1520                 :            :         return NULL;
    1521                 :            :     } else {
    1522                 :            :         Py_RETURN_NONE;
    1523                 :            :     }
    1524                 :            : }
    1525                 :            : 
    1526                 :            : /*[clinic input]
    1527                 :            : _sqlite3.Connection.load_extension as pysqlite_connection_load_extension
    1528                 :            : 
    1529                 :            :     name as extension_name: str
    1530                 :            :     /
    1531                 :            : 
    1532                 :            : Load SQLite extension module.
    1533                 :            : [clinic start generated code]*/
    1534                 :            : 
    1535                 :            : static PyObject *
    1536                 :            : pysqlite_connection_load_extension_impl(pysqlite_Connection *self,
    1537                 :            :                                         const char *extension_name)
    1538                 :            : /*[clinic end generated code: output=47eb1d7312bc97a7 input=edd507389d89d621]*/
    1539                 :            : {
    1540                 :            :     int rc;
    1541                 :            :     char* errmsg;
    1542                 :            : 
    1543                 :            :     if (PySys_Audit("sqlite3.load_extension", "Os", self, extension_name) < 0) {
    1544                 :            :         return NULL;
    1545                 :            :     }
    1546                 :            : 
    1547                 :            :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1548                 :            :         return NULL;
    1549                 :            :     }
    1550                 :            : 
    1551                 :            :     rc = sqlite3_load_extension(self->db, extension_name, 0, &errmsg);
    1552                 :            :     if (rc != 0) {
    1553                 :            :         PyErr_SetString(self->OperationalError, errmsg);
    1554                 :            :         return NULL;
    1555                 :            :     } else {
    1556                 :            :         Py_RETURN_NONE;
    1557                 :            :     }
    1558                 :            : }
    1559                 :            : #endif
    1560                 :            : 
    1561                 :       8439 : int pysqlite_check_thread(pysqlite_Connection* self)
    1562                 :            : {
    1563         [ +  + ]:       8439 :     if (self->check_same_thread) {
    1564         [ +  + ]:       8432 :         if (PyThread_get_thread_ident() != self->thread_ident) {
    1565                 :         17 :             PyErr_Format(self->ProgrammingError,
    1566                 :            :                         "SQLite objects created in a thread can only be used in that same thread. "
    1567                 :            :                         "The object was created in thread id %lu and this is thread id %lu.",
    1568                 :            :                         self->thread_ident, PyThread_get_thread_ident());
    1569                 :         17 :             return 0;
    1570                 :            :         }
    1571                 :            : 
    1572                 :            :     }
    1573                 :       8422 :     return 1;
    1574                 :            : }
    1575                 :            : 
    1576                 :         32 : static PyObject* pysqlite_connection_get_isolation_level(pysqlite_Connection* self, void* unused)
    1577                 :            : {
    1578         [ +  + ]:         32 :     if (!pysqlite_check_connection(self)) {
    1579                 :          1 :         return NULL;
    1580                 :            :     }
    1581         [ +  + ]:         31 :     if (self->isolation_level != NULL) {
    1582                 :         28 :         return PyUnicode_FromString(self->isolation_level);
    1583                 :            :     }
    1584                 :          3 :     Py_RETURN_NONE;
    1585                 :            : }
    1586                 :            : 
    1587                 :          2 : static PyObject* pysqlite_connection_get_total_changes(pysqlite_Connection* self, void* unused)
    1588                 :            : {
    1589         [ +  + ]:          2 :     if (!pysqlite_check_connection(self)) {
    1590                 :          1 :         return NULL;
    1591                 :            :     }
    1592                 :          1 :     return PyLong_FromLong(sqlite3_total_changes(self->db));
    1593                 :            : }
    1594                 :            : 
    1595                 :          9 : static PyObject* pysqlite_connection_get_in_transaction(pysqlite_Connection* self, void* unused)
    1596                 :            : {
    1597         [ +  + ]:          9 :     if (!pysqlite_check_connection(self)) {
    1598                 :          1 :         return NULL;
    1599                 :            :     }
    1600         [ +  + ]:          8 :     if (!sqlite3_get_autocommit(self->db)) {
    1601                 :          3 :         Py_RETURN_TRUE;
    1602                 :            :     }
    1603                 :          5 :     Py_RETURN_FALSE;
    1604                 :            : }
    1605                 :            : 
    1606                 :            : static int
    1607                 :         51 : pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level, void *Py_UNUSED(ignored))
    1608                 :            : {
    1609         [ +  + ]:         51 :     if (isolation_level == NULL) {
    1610                 :          1 :         PyErr_SetString(PyExc_AttributeError, "cannot delete attribute");
    1611                 :          1 :         return -1;
    1612                 :            :     }
    1613         [ +  + ]:         50 :     if (Py_IsNone(isolation_level)) {
    1614                 :          7 :         self->isolation_level = NULL;
    1615                 :            : 
    1616                 :            :         // Execute a COMMIT to re-enable autocommit mode
    1617                 :          7 :         PyObject *res = pysqlite_connection_commit_impl(self);
    1618         [ -  + ]:          7 :         if (res == NULL) {
    1619                 :          0 :             return -1;
    1620                 :            :         }
    1621                 :          7 :         Py_DECREF(res);
    1622                 :          7 :         return 0;
    1623                 :            :     }
    1624         [ +  + ]:         43 :     if (!isolation_level_converter(isolation_level, &self->isolation_level)) {
    1625                 :         13 :         return -1;
    1626                 :            :     }
    1627                 :         30 :     return 0;
    1628                 :            : }
    1629                 :            : 
    1630                 :            : static PyObject *
    1631                 :       1578 : pysqlite_connection_call(pysqlite_Connection *self, PyObject *args,
    1632                 :            :                          PyObject *kwargs)
    1633                 :            : {
    1634                 :            :     PyObject* sql;
    1635                 :            :     pysqlite_Statement* statement;
    1636                 :            : 
    1637   [ +  -  +  + ]:       1578 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1638                 :          1 :         return NULL;
    1639                 :            :     }
    1640                 :            : 
    1641   [ +  +  -  + ]:       1577 :     if (!_PyArg_NoKeywords(MODULE_NAME ".Connection", kwargs))
    1642                 :          0 :         return NULL;
    1643                 :            : 
    1644         [ +  + ]:       1577 :     if (!PyArg_ParseTuple(args, "U", &sql))
    1645                 :          1 :         return NULL;
    1646                 :            : 
    1647                 :       1576 :     statement = pysqlite_statement_create(self, sql);
    1648         [ +  + ]:       1576 :     if (statement == NULL) {
    1649                 :         46 :         return NULL;
    1650                 :            :     }
    1651                 :            : 
    1652                 :       1530 :     return (PyObject*)statement;
    1653                 :            : }
    1654                 :            : 
    1655                 :            : /*[clinic input]
    1656                 :            : _sqlite3.Connection.execute as pysqlite_connection_execute
    1657                 :            : 
    1658                 :            :     sql: unicode
    1659                 :            :     parameters: object = NULL
    1660                 :            :     /
    1661                 :            : 
    1662                 :            : Executes an SQL statement.
    1663                 :            : [clinic start generated code]*/
    1664                 :            : 
    1665                 :            : static PyObject *
    1666                 :        859 : pysqlite_connection_execute_impl(pysqlite_Connection *self, PyObject *sql,
    1667                 :            :                                  PyObject *parameters)
    1668                 :            : /*[clinic end generated code: output=5be05ae01ee17ee4 input=27aa7792681ddba2]*/
    1669                 :            : {
    1670                 :        859 :     PyObject* result = 0;
    1671                 :            : 
    1672                 :        859 :     PyObject *cursor = pysqlite_connection_cursor_impl(self, NULL);
    1673         [ +  + ]:        859 :     if (!cursor) {
    1674                 :          1 :         goto error;
    1675                 :            :     }
    1676                 :            : 
    1677                 :        858 :     result = _pysqlite_query_execute((pysqlite_Cursor *)cursor, 0, sql, parameters);
    1678         [ +  + ]:        858 :     if (!result) {
    1679         [ -  + ]:         35 :         Py_CLEAR(cursor);
    1680                 :            :     }
    1681                 :            : 
    1682                 :        823 : error:
    1683                 :        859 :     Py_XDECREF(result);
    1684                 :            : 
    1685                 :        859 :     return cursor;
    1686                 :            : }
    1687                 :            : 
    1688                 :            : /*[clinic input]
    1689                 :            : _sqlite3.Connection.executemany as pysqlite_connection_executemany
    1690                 :            : 
    1691                 :            :     sql: unicode
    1692                 :            :     parameters: object
    1693                 :            :     /
    1694                 :            : 
    1695                 :            : Repeatedly executes an SQL statement.
    1696                 :            : [clinic start generated code]*/
    1697                 :            : 
    1698                 :            : static PyObject *
    1699                 :         37 : pysqlite_connection_executemany_impl(pysqlite_Connection *self,
    1700                 :            :                                      PyObject *sql, PyObject *parameters)
    1701                 :            : /*[clinic end generated code: output=776cd2fd20bfe71f input=495be76551d525db]*/
    1702                 :            : {
    1703                 :         37 :     PyObject* result = 0;
    1704                 :            : 
    1705                 :         37 :     PyObject *cursor = pysqlite_connection_cursor_impl(self, NULL);
    1706         [ +  + ]:         37 :     if (!cursor) {
    1707                 :          2 :         goto error;
    1708                 :            :     }
    1709                 :            : 
    1710                 :         35 :     result = _pysqlite_query_execute((pysqlite_Cursor *)cursor, 1, sql, parameters);
    1711         [ +  - ]:         35 :     if (!result) {
    1712         [ #  # ]:          0 :         Py_CLEAR(cursor);
    1713                 :            :     }
    1714                 :            : 
    1715                 :         35 : error:
    1716                 :         37 :     Py_XDECREF(result);
    1717                 :            : 
    1718                 :         37 :     return cursor;
    1719                 :            : }
    1720                 :            : 
    1721                 :            : /*[clinic input]
    1722                 :            : _sqlite3.Connection.executescript as pysqlite_connection_executescript
    1723                 :            : 
    1724                 :            :     sql_script as script_obj: object
    1725                 :            :     /
    1726                 :            : 
    1727                 :            : Executes multiple SQL statements at once.
    1728                 :            : [clinic start generated code]*/
    1729                 :            : 
    1730                 :            : static PyObject *
    1731                 :         21 : pysqlite_connection_executescript(pysqlite_Connection *self,
    1732                 :            :                                   PyObject *script_obj)
    1733                 :            : /*[clinic end generated code: output=4c4f9d77aa0ae37d input=f6e5f1ccfa313db4]*/
    1734                 :            : {
    1735                 :         21 :     PyObject* result = 0;
    1736                 :            : 
    1737                 :         21 :     PyObject *cursor = pysqlite_connection_cursor_impl(self, NULL);
    1738         [ +  + ]:         21 :     if (!cursor) {
    1739                 :          1 :         goto error;
    1740                 :            :     }
    1741                 :            : 
    1742                 :         20 :     PyObject *meth = self->state->str_executescript;  // borrowed ref.
    1743                 :         20 :     result = PyObject_CallMethodObjArgs(cursor, meth, script_obj, NULL);
    1744         [ +  + ]:         20 :     if (!result) {
    1745         [ -  + ]:          1 :         Py_CLEAR(cursor);
    1746                 :            :     }
    1747                 :            : 
    1748                 :         19 : error:
    1749                 :         21 :     Py_XDECREF(result);
    1750                 :            : 
    1751                 :         21 :     return cursor;
    1752                 :            : }
    1753                 :            : 
    1754                 :            : /* ------------------------- COLLATION CODE ------------------------ */
    1755                 :            : 
    1756                 :            : static int
    1757                 :          8 : collation_callback(void *context, int text1_length, const void *text1_data,
    1758                 :            :                    int text2_length, const void *text2_data)
    1759                 :            : {
    1760                 :          8 :     PyGILState_STATE gilstate = PyGILState_Ensure();
    1761                 :            : 
    1762                 :          8 :     PyObject* string1 = 0;
    1763                 :          8 :     PyObject* string2 = 0;
    1764                 :          8 :     PyObject* retval = NULL;
    1765                 :            :     long longval;
    1766                 :          8 :     int result = 0;
    1767                 :            : 
    1768                 :            :     /* This callback may be executed multiple times per sqlite3_step(). Bail if
    1769                 :            :      * the previous call failed */
    1770         [ -  + ]:          8 :     if (PyErr_Occurred()) {
    1771                 :          0 :         goto finally;
    1772                 :            :     }
    1773                 :            : 
    1774                 :          8 :     string1 = PyUnicode_FromStringAndSize((const char*)text1_data, text1_length);
    1775                 :          8 :     string2 = PyUnicode_FromStringAndSize((const char*)text2_data, text2_length);
    1776                 :            : 
    1777   [ +  -  -  + ]:          8 :     if (!string1 || !string2) {
    1778                 :          0 :         goto finally; /* failed to allocate strings */
    1779                 :            :     }
    1780                 :            : 
    1781                 :          8 :     callback_context *ctx = (callback_context *)context;
    1782                 :            :     assert(ctx != NULL);
    1783                 :          8 :     PyObject *args[] = { NULL, string1, string2 };  // Borrowed refs.
    1784                 :          8 :     size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET;
    1785                 :          8 :     retval = PyObject_Vectorcall(ctx->callable, args + 1, nargsf, NULL);
    1786         [ -  + ]:          8 :     if (retval == NULL) {
    1787                 :            :         /* execution failed */
    1788                 :          0 :         goto finally;
    1789                 :            :     }
    1790                 :            : 
    1791                 :          8 :     longval = PyLong_AsLongAndOverflow(retval, &result);
    1792   [ -  +  -  - ]:          8 :     if (longval == -1 && PyErr_Occurred()) {
    1793                 :          0 :         PyErr_Clear();
    1794                 :          0 :         result = 0;
    1795                 :            :     }
    1796         [ -  + ]:          8 :     else if (!result) {
    1797         [ +  - ]:          8 :         if (longval > 0)
    1798                 :          8 :             result = 1;
    1799         [ #  # ]:          0 :         else if (longval < 0)
    1800                 :          0 :             result = -1;
    1801                 :            :     }
    1802                 :            : 
    1803                 :          0 : finally:
    1804                 :          8 :     Py_XDECREF(string1);
    1805                 :          8 :     Py_XDECREF(string2);
    1806                 :          8 :     Py_XDECREF(retval);
    1807                 :          8 :     PyGILState_Release(gilstate);
    1808                 :          8 :     return result;
    1809                 :            : }
    1810                 :            : 
    1811                 :            : /*[clinic input]
    1812                 :            : _sqlite3.Connection.interrupt as pysqlite_connection_interrupt
    1813                 :            : 
    1814                 :            : Abort any pending database operation.
    1815                 :            : [clinic start generated code]*/
    1816                 :            : 
    1817                 :            : static PyObject *
    1818                 :          2 : pysqlite_connection_interrupt_impl(pysqlite_Connection *self)
    1819                 :            : /*[clinic end generated code: output=f193204bc9e70b47 input=75ad03ade7012859]*/
    1820                 :            : {
    1821                 :          2 :     PyObject* retval = NULL;
    1822                 :            : 
    1823         [ +  + ]:          2 :     if (!pysqlite_check_connection(self)) {
    1824                 :          1 :         goto finally;
    1825                 :            :     }
    1826                 :            : 
    1827                 :          1 :     sqlite3_interrupt(self->db);
    1828                 :            : 
    1829                 :          1 :     retval = Py_NewRef(Py_None);
    1830                 :            : 
    1831                 :          2 : finally:
    1832                 :          2 :     return retval;
    1833                 :            : }
    1834                 :            : 
    1835                 :            : /* Function author: Paul Kippes <kippesp@gmail.com>
    1836                 :            :  * Class method of Connection to call the Python function _iterdump
    1837                 :            :  * of the sqlite3 module.
    1838                 :            :  */
    1839                 :            : /*[clinic input]
    1840                 :            : _sqlite3.Connection.iterdump as pysqlite_connection_iterdump
    1841                 :            : 
    1842                 :            : Returns iterator to the dump of the database in an SQL text format.
    1843                 :            : [clinic start generated code]*/
    1844                 :            : 
    1845                 :            : static PyObject *
    1846                 :          5 : pysqlite_connection_iterdump_impl(pysqlite_Connection *self)
    1847                 :            : /*[clinic end generated code: output=586997aaf9808768 input=1911ca756066da89]*/
    1848                 :            : {
    1849         [ +  + ]:          5 :     if (!pysqlite_check_connection(self)) {
    1850                 :          1 :         return NULL;
    1851                 :            :     }
    1852                 :            : 
    1853                 :          4 :     PyObject *iterdump = _PyImport_GetModuleAttrString(MODULE_NAME ".dump", "_iterdump");
    1854         [ -  + ]:          4 :     if (!iterdump) {
    1855         [ #  # ]:          0 :         if (!PyErr_Occurred()) {
    1856                 :          0 :             PyErr_SetString(self->OperationalError,
    1857                 :            :                             "Failed to obtain _iterdump() reference");
    1858                 :            :         }
    1859                 :          0 :         return NULL;
    1860                 :            :     }
    1861                 :            : 
    1862                 :          4 :     PyObject *retval = PyObject_CallOneArg(iterdump, (PyObject *)self);
    1863                 :          4 :     Py_DECREF(iterdump);
    1864                 :          4 :     return retval;
    1865                 :            : }
    1866                 :            : 
    1867                 :            : /*[clinic input]
    1868                 :            : _sqlite3.Connection.backup as pysqlite_connection_backup
    1869                 :            : 
    1870                 :            :     target: object(type='pysqlite_Connection *', subclass_of='clinic_state()->ConnectionType')
    1871                 :            :     *
    1872                 :            :     pages: int = -1
    1873                 :            :     progress: object = None
    1874                 :            :     name: str = "main"
    1875                 :            :     sleep: double = 0.250
    1876                 :            : 
    1877                 :            : Makes a backup of the database.
    1878                 :            : [clinic start generated code]*/
    1879                 :            : 
    1880                 :            : static PyObject *
    1881                 :         15 : pysqlite_connection_backup_impl(pysqlite_Connection *self,
    1882                 :            :                                 pysqlite_Connection *target, int pages,
    1883                 :            :                                 PyObject *progress, const char *name,
    1884                 :            :                                 double sleep)
    1885                 :            : /*[clinic end generated code: output=306a3e6a38c36334 input=c6519d0f59d0fd7f]*/
    1886                 :            : {
    1887                 :            :     int rc;
    1888                 :         15 :     int sleep_ms = (int)(sleep * 1000.0);
    1889                 :            :     sqlite3 *bck_conn;
    1890                 :            :     sqlite3_backup *bck_handle;
    1891                 :            : 
    1892   [ +  -  +  + ]:         15 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1893                 :          1 :         return NULL;
    1894                 :            :     }
    1895                 :            : 
    1896         [ +  + ]:         14 :     if (!pysqlite_check_connection(target)) {
    1897                 :          1 :         return NULL;
    1898                 :            :     }
    1899                 :            : 
    1900         [ +  + ]:         13 :     if (target == self) {
    1901                 :          1 :         PyErr_SetString(PyExc_ValueError, "target cannot be the same connection instance");
    1902                 :          1 :         return NULL;
    1903                 :            :     }
    1904                 :            : 
    1905                 :            : #if SQLITE_VERSION_NUMBER < 3008008
    1906                 :            :     /* Since 3.8.8 this is already done, per commit
    1907                 :            :        https://www.sqlite.org/src/info/169b5505498c0a7e */
    1908                 :            :     if (!sqlite3_get_autocommit(target->db)) {
    1909                 :            :         PyErr_SetString(self->OperationalError, "target is in transaction");
    1910                 :            :         return NULL;
    1911                 :            :     }
    1912                 :            : #endif
    1913                 :            : 
    1914   [ +  +  +  + ]:         12 :     if (progress != Py_None && !PyCallable_Check(progress)) {
    1915                 :          1 :         PyErr_SetString(PyExc_TypeError, "progress argument must be a callable");
    1916                 :          1 :         return NULL;
    1917                 :            :     }
    1918                 :            : 
    1919         [ -  + ]:         11 :     if (pages == 0) {
    1920                 :          0 :         pages = -1;
    1921                 :            :     }
    1922                 :            : 
    1923                 :         11 :     bck_conn = target->db;
    1924                 :            : 
    1925                 :         11 :     Py_BEGIN_ALLOW_THREADS
    1926                 :         11 :     bck_handle = sqlite3_backup_init(bck_conn, "main", self->db, name);
    1927                 :         11 :     Py_END_ALLOW_THREADS
    1928                 :            : 
    1929         [ +  + ]:         11 :     if (bck_handle == NULL) {
    1930                 :          2 :         _pysqlite_seterror(self->state, bck_conn);
    1931                 :          2 :         return NULL;
    1932                 :            :     }
    1933                 :            : 
    1934                 :            :     do {
    1935                 :         12 :         Py_BEGIN_ALLOW_THREADS
    1936                 :         12 :         rc = sqlite3_backup_step(bck_handle, pages);
    1937                 :         12 :         Py_END_ALLOW_THREADS
    1938                 :            : 
    1939         [ +  + ]:         12 :         if (progress != Py_None) {
    1940                 :          8 :             int remaining = sqlite3_backup_remaining(bck_handle);
    1941                 :          8 :             int pagecount = sqlite3_backup_pagecount(bck_handle);
    1942                 :          8 :             PyObject *res = PyObject_CallFunction(progress, "iii", rc,
    1943                 :            :                                                   remaining, pagecount);
    1944         [ +  + ]:          8 :             if (res == NULL) {
    1945                 :            :                 /* Callback failed: abort backup and bail. */
    1946                 :          1 :                 Py_BEGIN_ALLOW_THREADS
    1947                 :          1 :                 sqlite3_backup_finish(bck_handle);
    1948                 :          1 :                 Py_END_ALLOW_THREADS
    1949                 :          1 :                 return NULL;
    1950                 :            :             }
    1951                 :          7 :             Py_DECREF(res);
    1952                 :            :         }
    1953                 :            : 
    1954                 :            :         /* Sleep for a while if there are still further pages to copy and
    1955                 :            :            the engine could not make any progress */
    1956   [ +  -  -  + ]:         11 :         if (rc == SQLITE_BUSY || rc == SQLITE_LOCKED) {
    1957                 :          0 :             Py_BEGIN_ALLOW_THREADS
    1958                 :          0 :             sqlite3_sleep(sleep_ms);
    1959                 :          0 :             Py_END_ALLOW_THREADS
    1960                 :            :         }
    1961   [ +  +  -  +  :         11 :     } while (rc == SQLITE_OK || rc == SQLITE_BUSY || rc == SQLITE_LOCKED);
                   -  + ]
    1962                 :            : 
    1963                 :          8 :     Py_BEGIN_ALLOW_THREADS
    1964                 :          8 :     rc = sqlite3_backup_finish(bck_handle);
    1965                 :          8 :     Py_END_ALLOW_THREADS
    1966                 :            : 
    1967         [ -  + ]:          8 :     if (rc != SQLITE_OK) {
    1968                 :          0 :         _pysqlite_seterror(self->state, bck_conn);
    1969                 :          0 :         return NULL;
    1970                 :            :     }
    1971                 :            : 
    1972                 :          8 :     Py_RETURN_NONE;
    1973                 :            : }
    1974                 :            : 
    1975                 :            : /*[clinic input]
    1976                 :            : _sqlite3.Connection.create_collation as pysqlite_connection_create_collation
    1977                 :            : 
    1978                 :            :     cls: defining_class
    1979                 :            :     name: str
    1980                 :            :     callback as callable: object
    1981                 :            :     /
    1982                 :            : 
    1983                 :            : Creates a collation function.
    1984                 :            : [clinic start generated code]*/
    1985                 :            : 
    1986                 :            : static PyObject *
    1987                 :         11 : pysqlite_connection_create_collation_impl(pysqlite_Connection *self,
    1988                 :            :                                           PyTypeObject *cls,
    1989                 :            :                                           const char *name,
    1990                 :            :                                           PyObject *callable)
    1991                 :            : /*[clinic end generated code: output=32d339e97869c378 input=f67ecd2e31e61ad3]*/
    1992                 :            : {
    1993   [ +  +  -  + ]:         11 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    1994                 :          1 :         return NULL;
    1995                 :            :     }
    1996                 :            : 
    1997                 :         10 :     callback_context *ctx = NULL;
    1998                 :            :     int rc;
    1999                 :         10 :     int flags = SQLITE_UTF8;
    2000         [ +  + ]:         10 :     if (callable == Py_None) {
    2001                 :          2 :         rc = sqlite3_create_collation_v2(self->db, name, flags,
    2002                 :            :                                          NULL, NULL, NULL);
    2003                 :            :     }
    2004                 :            :     else {
    2005         [ +  + ]:          8 :         if (!PyCallable_Check(callable)) {
    2006                 :          1 :             PyErr_SetString(PyExc_TypeError, "parameter must be callable");
    2007                 :          1 :             return NULL;
    2008                 :            :         }
    2009                 :          7 :         ctx = create_callback_context(cls, callable);
    2010         [ -  + ]:          7 :         if (ctx == NULL) {
    2011                 :          0 :             return NULL;
    2012                 :            :         }
    2013                 :          7 :         rc = sqlite3_create_collation_v2(self->db, name, flags, ctx,
    2014                 :            :                                          &collation_callback,
    2015                 :            :                                          &destructor_callback);
    2016                 :            :     }
    2017                 :            : 
    2018         [ -  + ]:          9 :     if (rc != SQLITE_OK) {
    2019                 :            :         /* Unlike other sqlite3_* functions, the destructor callback is _not_
    2020                 :            :          * called if sqlite3_create_collation_v2() fails, so we have to free
    2021                 :            :          * the context before returning.
    2022                 :            :          */
    2023         [ #  # ]:          0 :         if (callable != Py_None) {
    2024                 :          0 :             free_callback_context(ctx);
    2025                 :            :         }
    2026                 :          0 :         _pysqlite_seterror(self->state, self->db);
    2027                 :          0 :         return NULL;
    2028                 :            :     }
    2029                 :            : 
    2030                 :          9 :     Py_RETURN_NONE;
    2031                 :            : }
    2032                 :            : 
    2033                 :            : #ifdef PY_SQLITE_HAVE_SERIALIZE
    2034                 :            : /*[clinic input]
    2035                 :            : _sqlite3.Connection.serialize as serialize
    2036                 :            : 
    2037                 :            :     *
    2038                 :            :     name: str = "main"
    2039                 :            :         Which database to serialize.
    2040                 :            : 
    2041                 :            : Serialize a database into a byte string.
    2042                 :            : 
    2043                 :            : For an ordinary on-disk database file, the serialization is just a copy of the
    2044                 :            : disk file. For an in-memory database or a "temp" database, the serialization is
    2045                 :            : the same sequence of bytes which would be written to disk if that database
    2046                 :            : were backed up to disk.
    2047                 :            : [clinic start generated code]*/
    2048                 :            : 
    2049                 :            : static PyObject *
    2050                 :          2 : serialize_impl(pysqlite_Connection *self, const char *name)
    2051                 :            : /*[clinic end generated code: output=97342b0e55239dd3 input=d2eb5194a65abe2b]*/
    2052                 :            : {
    2053   [ +  +  -  + ]:          2 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    2054                 :          1 :         return NULL;
    2055                 :            :     }
    2056                 :            : 
    2057                 :            :     /* If SQLite has a contiguous memory representation of the database, we can
    2058                 :            :      * avoid memory allocations, so we try with the no-copy flag first.
    2059                 :            :      */
    2060                 :            :     sqlite3_int64 size;
    2061                 :          1 :     unsigned int flags = SQLITE_SERIALIZE_NOCOPY;
    2062                 :            :     const char *data;
    2063                 :            : 
    2064                 :          1 :     Py_BEGIN_ALLOW_THREADS
    2065                 :          1 :     data = (const char *)sqlite3_serialize(self->db, name, &size, flags);
    2066         [ +  - ]:          1 :     if (data == NULL) {
    2067                 :          1 :         flags &= ~SQLITE_SERIALIZE_NOCOPY;
    2068                 :          1 :         data = (const char *)sqlite3_serialize(self->db, name, &size, flags);
    2069                 :            :     }
    2070                 :          1 :     Py_END_ALLOW_THREADS
    2071                 :            : 
    2072         [ -  + ]:          1 :     if (data == NULL) {
    2073                 :          0 :         PyErr_Format(self->OperationalError, "unable to serialize '%s'",
    2074                 :            :                      name);
    2075                 :          0 :         return NULL;
    2076                 :            :     }
    2077                 :          1 :     PyObject *res = PyBytes_FromStringAndSize(data, (Py_ssize_t)size);
    2078         [ +  - ]:          1 :     if (!(flags & SQLITE_SERIALIZE_NOCOPY)) {
    2079                 :          1 :         sqlite3_free((void *)data);
    2080                 :            :     }
    2081                 :          1 :     return res;
    2082                 :            : }
    2083                 :            : 
    2084                 :            : /*[clinic input]
    2085                 :            : _sqlite3.Connection.deserialize as deserialize
    2086                 :            : 
    2087                 :            :     data: Py_buffer(accept={buffer, str})
    2088                 :            :         The serialized database content.
    2089                 :            :     /
    2090                 :            :     *
    2091                 :            :     name: str = "main"
    2092                 :            :         Which database to reopen with the deserialization.
    2093                 :            : 
    2094                 :            : Load a serialized database.
    2095                 :            : 
    2096                 :            : The deserialize interface causes the database connection to disconnect from the
    2097                 :            : target database, and then reopen it as an in-memory database based on the given
    2098                 :            : serialized data.
    2099                 :            : 
    2100                 :            : The deserialize interface will fail with SQLITE_BUSY if the database is
    2101                 :            : currently in a read transaction or is involved in a backup operation.
    2102                 :            : [clinic start generated code]*/
    2103                 :            : 
    2104                 :            : static PyObject *
    2105                 :          3 : deserialize_impl(pysqlite_Connection *self, Py_buffer *data,
    2106                 :            :                  const char *name)
    2107                 :            : /*[clinic end generated code: output=e394c798b98bad89 input=1be4ca1faacf28f2]*/
    2108                 :            : {
    2109   [ +  +  -  + ]:          3 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    2110                 :          1 :         return NULL;
    2111                 :            :     }
    2112                 :            : 
    2113                 :            :     /* Transfer ownership of the buffer to SQLite:
    2114                 :            :      * - Move buffer from Py to SQLite
    2115                 :            :      * - Tell SQLite to free buffer memory
    2116                 :            :      * - Tell SQLite that it is permitted to grow the resulting database
    2117                 :            :      *
    2118                 :            :      * Make sure we don't overflow sqlite3_deserialize(); it accepts a signed
    2119                 :            :      * 64-bit int as its data size argument.
    2120                 :            :      *
    2121                 :            :      * We can safely use sqlite3_malloc64 here, since it was introduced before
    2122                 :            :      * the serialize APIs.
    2123                 :            :      */
    2124                 :            :     if (data->len > 9223372036854775807) {  // (1 << 63) - 1
    2125                 :            :         PyErr_SetString(PyExc_OverflowError, "'data' is too large");
    2126                 :            :         return NULL;
    2127                 :            :     }
    2128                 :            : 
    2129                 :          2 :     sqlite3_int64 size = (sqlite3_int64)data->len;
    2130                 :          2 :     unsigned char *buf = sqlite3_malloc64(size);
    2131         [ -  + ]:          2 :     if (buf == NULL) {
    2132                 :            :         return PyErr_NoMemory();
    2133                 :            :     }
    2134                 :            : 
    2135                 :          2 :     const unsigned int flags = SQLITE_DESERIALIZE_FREEONCLOSE |
    2136                 :            :                                SQLITE_DESERIALIZE_RESIZEABLE;
    2137                 :            :     int rc;
    2138                 :          2 :     Py_BEGIN_ALLOW_THREADS
    2139                 :          2 :     (void)memcpy(buf, data->buf, data->len);
    2140                 :          2 :     rc = sqlite3_deserialize(self->db, name, buf, size, size, flags);
    2141                 :          2 :     Py_END_ALLOW_THREADS
    2142                 :            : 
    2143         [ -  + ]:          2 :     if (rc != SQLITE_OK) {
    2144                 :          0 :         (void)_pysqlite_seterror(self->state, self->db);
    2145                 :          0 :         return NULL;
    2146                 :            :     }
    2147                 :          2 :     Py_RETURN_NONE;
    2148                 :            : }
    2149                 :            : #endif  // PY_SQLITE_HAVE_SERIALIZE
    2150                 :            : 
    2151                 :            : 
    2152                 :            : /*[clinic input]
    2153                 :            : _sqlite3.Connection.__enter__ as pysqlite_connection_enter
    2154                 :            : 
    2155                 :            : Called when the connection is used as a context manager.
    2156                 :            : 
    2157                 :            : Returns itself as a convenience to the caller.
    2158                 :            : [clinic start generated code]*/
    2159                 :            : 
    2160                 :            : static PyObject *
    2161                 :         45 : pysqlite_connection_enter_impl(pysqlite_Connection *self)
    2162                 :            : /*[clinic end generated code: output=457b09726d3e9dcd input=127d7a4f17e86d8f]*/
    2163                 :            : {
    2164         [ +  + ]:         45 :     if (!pysqlite_check_connection(self)) {
    2165                 :          1 :         return NULL;
    2166                 :            :     }
    2167                 :         44 :     return Py_NewRef((PyObject *)self);
    2168                 :            : }
    2169                 :            : 
    2170                 :            : /*[clinic input]
    2171                 :            : _sqlite3.Connection.__exit__ as pysqlite_connection_exit
    2172                 :            : 
    2173                 :            :     type as exc_type: object
    2174                 :            :     value as exc_value: object
    2175                 :            :     traceback as exc_tb: object
    2176                 :            :     /
    2177                 :            : 
    2178                 :            : Called when the connection is used as a context manager.
    2179                 :            : 
    2180                 :            : If there was any exception, a rollback takes place; otherwise we commit.
    2181                 :            : [clinic start generated code]*/
    2182                 :            : 
    2183                 :            : static PyObject *
    2184                 :         44 : pysqlite_connection_exit_impl(pysqlite_Connection *self, PyObject *exc_type,
    2185                 :            :                               PyObject *exc_value, PyObject *exc_tb)
    2186                 :            : /*[clinic end generated code: output=0705200e9321202a input=bd66f1532c9c54a7]*/
    2187                 :            : {
    2188                 :         44 :     int commit = 0;
    2189                 :            :     PyObject* result;
    2190                 :            : 
    2191   [ +  +  +  -  :         44 :     if (exc_type == Py_None && exc_value == Py_None && exc_tb == Py_None) {
                   +  - ]
    2192                 :         40 :         commit = 1;
    2193                 :         40 :         result = pysqlite_connection_commit_impl(self);
    2194                 :            :     }
    2195                 :            :     else {
    2196                 :          4 :         result = pysqlite_connection_rollback_impl(self);
    2197                 :            :     }
    2198                 :            : 
    2199         [ +  + ]:         44 :     if (result == NULL) {
    2200         [ +  - ]:          1 :         if (commit) {
    2201                 :            :             /* Commit failed; try to rollback in order to unlock the database.
    2202                 :            :              * If rollback also fails, chain the exceptions. */
    2203                 :            :             PyObject *exc, *val, *tb;
    2204                 :          1 :             PyErr_Fetch(&exc, &val, &tb);
    2205                 :          1 :             result = pysqlite_connection_rollback_impl(self);
    2206         [ -  + ]:          1 :             if (result == NULL) {
    2207                 :          0 :                 _PyErr_ChainExceptions(exc, val, tb);
    2208                 :            :             }
    2209                 :            :             else {
    2210                 :          1 :                 Py_DECREF(result);
    2211                 :          1 :                 PyErr_Restore(exc, val, tb);
    2212                 :            :             }
    2213                 :            :         }
    2214                 :          1 :         return NULL;
    2215                 :            :     }
    2216                 :         43 :     Py_DECREF(result);
    2217                 :            : 
    2218                 :         43 :     Py_RETURN_FALSE;
    2219                 :            : }
    2220                 :            : 
    2221                 :            : /*[clinic input]
    2222                 :            : _sqlite3.Connection.setlimit as setlimit
    2223                 :            : 
    2224                 :            :     category: int
    2225                 :            :         The limit category to be set.
    2226                 :            :     limit: int
    2227                 :            :         The new limit. If the new limit is a negative number, the limit is
    2228                 :            :         unchanged.
    2229                 :            :     /
    2230                 :            : 
    2231                 :            : Set connection run-time limits.
    2232                 :            : 
    2233                 :            : Attempts to increase a limit above its hard upper bound are silently truncated
    2234                 :            : to the hard upper bound. Regardless of whether or not the limit was changed,
    2235                 :            : the prior value of the limit is returned.
    2236                 :            : [clinic start generated code]*/
    2237                 :            : 
    2238                 :            : static PyObject *
    2239                 :         20 : setlimit_impl(pysqlite_Connection *self, int category, int limit)
    2240                 :            : /*[clinic end generated code: output=0d208213f8d68ccd input=9bd469537e195635]*/
    2241                 :            : {
    2242   [ +  +  -  + ]:         20 :     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    2243                 :          2 :         return NULL;
    2244                 :            :     }
    2245                 :            : 
    2246                 :         18 :     int old_limit = sqlite3_limit(self->db, category, limit);
    2247         [ +  + ]:         18 :     if (old_limit < 0) {
    2248                 :          2 :         PyErr_SetString(self->ProgrammingError, "'category' is out of bounds");
    2249                 :          2 :         return NULL;
    2250                 :            :     }
    2251                 :         16 :     return PyLong_FromLong(old_limit);
    2252                 :            : }
    2253                 :            : 
    2254                 :            : /*[clinic input]
    2255                 :            : _sqlite3.Connection.getlimit as getlimit
    2256                 :            : 
    2257                 :            :     category: int
    2258                 :            :         The limit category to be queried.
    2259                 :            :     /
    2260                 :            : 
    2261                 :            : Get connection run-time limits.
    2262                 :            : [clinic start generated code]*/
    2263                 :            : 
    2264                 :            : static PyObject *
    2265                 :          4 : getlimit_impl(pysqlite_Connection *self, int category)
    2266                 :            : /*[clinic end generated code: output=7c3f5d11f24cecb1 input=61e0849fb4fb058f]*/
    2267                 :            : {
    2268                 :          4 :     return setlimit_impl(self, category, -1);
    2269                 :            : }
    2270                 :            : 
    2271                 :            : 
    2272                 :            : static const char connection_doc[] =
    2273                 :            : PyDoc_STR("SQLite database connection object.");
    2274                 :            : 
    2275                 :            : static PyGetSetDef connection_getset[] = {
    2276                 :            :     {"isolation_level",  (getter)pysqlite_connection_get_isolation_level, (setter)pysqlite_connection_set_isolation_level},
    2277                 :            :     {"total_changes",  (getter)pysqlite_connection_get_total_changes, (setter)0},
    2278                 :            :     {"in_transaction",  (getter)pysqlite_connection_get_in_transaction, (setter)0},
    2279                 :            :     {NULL}
    2280                 :            : };
    2281                 :            : 
    2282                 :            : static PyMethodDef connection_methods[] = {
    2283                 :            :     PYSQLITE_CONNECTION_BACKUP_METHODDEF
    2284                 :            :     PYSQLITE_CONNECTION_CLOSE_METHODDEF
    2285                 :            :     PYSQLITE_CONNECTION_COMMIT_METHODDEF
    2286                 :            :     PYSQLITE_CONNECTION_CREATE_AGGREGATE_METHODDEF
    2287                 :            :     PYSQLITE_CONNECTION_CREATE_COLLATION_METHODDEF
    2288                 :            :     PYSQLITE_CONNECTION_CREATE_FUNCTION_METHODDEF
    2289                 :            :     PYSQLITE_CONNECTION_CURSOR_METHODDEF
    2290                 :            :     PYSQLITE_CONNECTION_ENABLE_LOAD_EXTENSION_METHODDEF
    2291                 :            :     PYSQLITE_CONNECTION_ENTER_METHODDEF
    2292                 :            :     PYSQLITE_CONNECTION_EXECUTEMANY_METHODDEF
    2293                 :            :     PYSQLITE_CONNECTION_EXECUTESCRIPT_METHODDEF
    2294                 :            :     PYSQLITE_CONNECTION_EXECUTE_METHODDEF
    2295                 :            :     PYSQLITE_CONNECTION_EXIT_METHODDEF
    2296                 :            :     PYSQLITE_CONNECTION_INTERRUPT_METHODDEF
    2297                 :            :     PYSQLITE_CONNECTION_ITERDUMP_METHODDEF
    2298                 :            :     PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF
    2299                 :            :     PYSQLITE_CONNECTION_ROLLBACK_METHODDEF
    2300                 :            :     PYSQLITE_CONNECTION_SET_AUTHORIZER_METHODDEF
    2301                 :            :     PYSQLITE_CONNECTION_SET_PROGRESS_HANDLER_METHODDEF
    2302                 :            :     PYSQLITE_CONNECTION_SET_TRACE_CALLBACK_METHODDEF
    2303                 :            :     SETLIMIT_METHODDEF
    2304                 :            :     GETLIMIT_METHODDEF
    2305                 :            :     SERIALIZE_METHODDEF
    2306                 :            :     DESERIALIZE_METHODDEF
    2307                 :            :     CREATE_WINDOW_FUNCTION_METHODDEF
    2308                 :            :     BLOBOPEN_METHODDEF
    2309                 :            :     {NULL, NULL}
    2310                 :            : };
    2311                 :            : 
    2312                 :            : static struct PyMemberDef connection_members[] =
    2313                 :            : {
    2314                 :            :     {"Warning", T_OBJECT, offsetof(pysqlite_Connection, Warning), READONLY},
    2315                 :            :     {"Error", T_OBJECT, offsetof(pysqlite_Connection, Error), READONLY},
    2316                 :            :     {"InterfaceError", T_OBJECT, offsetof(pysqlite_Connection, InterfaceError), READONLY},
    2317                 :            :     {"DatabaseError", T_OBJECT, offsetof(pysqlite_Connection, DatabaseError), READONLY},
    2318                 :            :     {"DataError", T_OBJECT, offsetof(pysqlite_Connection, DataError), READONLY},
    2319                 :            :     {"OperationalError", T_OBJECT, offsetof(pysqlite_Connection, OperationalError), READONLY},
    2320                 :            :     {"IntegrityError", T_OBJECT, offsetof(pysqlite_Connection, IntegrityError), READONLY},
    2321                 :            :     {"InternalError", T_OBJECT, offsetof(pysqlite_Connection, InternalError), READONLY},
    2322                 :            :     {"ProgrammingError", T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), READONLY},
    2323                 :            :     {"NotSupportedError", T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), READONLY},
    2324                 :            :     {"row_factory", T_OBJECT, offsetof(pysqlite_Connection, row_factory)},
    2325                 :            :     {"text_factory", T_OBJECT, offsetof(pysqlite_Connection, text_factory)},
    2326                 :            :     {NULL}
    2327                 :            : };
    2328                 :            : 
    2329                 :            : static PyType_Slot connection_slots[] = {
    2330                 :            :     {Py_tp_dealloc, connection_dealloc},
    2331                 :            :     {Py_tp_doc, (void *)connection_doc},
    2332                 :            :     {Py_tp_methods, connection_methods},
    2333                 :            :     {Py_tp_members, connection_members},
    2334                 :            :     {Py_tp_getset, connection_getset},
    2335                 :            :     {Py_tp_init, pysqlite_connection_init},
    2336                 :            :     {Py_tp_call, pysqlite_connection_call},
    2337                 :            :     {Py_tp_traverse, connection_traverse},
    2338                 :            :     {Py_tp_clear, connection_clear},
    2339                 :            :     {0, NULL},
    2340                 :            : };
    2341                 :            : 
    2342                 :            : static PyType_Spec connection_spec = {
    2343                 :            :     .name = MODULE_NAME ".Connection",
    2344                 :            :     .basicsize = sizeof(pysqlite_Connection),
    2345                 :            :     .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
    2346                 :            :               Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE),
    2347                 :            :     .slots = connection_slots,
    2348                 :            : };
    2349                 :            : 
    2350                 :            : int
    2351                 :          5 : pysqlite_connection_setup_types(PyObject *module)
    2352                 :            : {
    2353                 :          5 :     PyObject *type = PyType_FromModuleAndSpec(module, &connection_spec, NULL);
    2354         [ -  + ]:          5 :     if (type == NULL) {
    2355                 :          0 :         return -1;
    2356                 :            :     }
    2357                 :          5 :     pysqlite_state *state = pysqlite_get_state(module);
    2358                 :          5 :     state->ConnectionType = (PyTypeObject *)type;
    2359                 :          5 :     return 0;
    2360                 :            : }

Generated by: LCOV version 1.14