1 /* connection.c - the connection type 2 * 3 * Copyright (C) 2004-2010 Gerhard Hring <gh (at) 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 "cache.h" 25 #include "module.h" 26 #include "connection.h" 27 #include "statement.h" 28 #include "cursor.h" 29 #include "prepare_protocol.h" 30 #include "util.h" 31 #include "sqlitecompat.h" 32 33 #include "pythread.h" 34 35 #define ACTION_FINALIZE 1 36 #define ACTION_RESET 2 37 38 #if SQLITE_VERSION_NUMBER >= 3003008 39 #ifndef SQLITE_OMIT_LOAD_EXTENSION 40 #define HAVE_LOAD_EXTENSION 41 #endif 42 #endif 43 44 static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level); 45 static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); 46 47 48 static void _sqlite3_result_error(sqlite3_context* ctx, const char* errmsg, int len) 49 { 50 /* in older SQLite versions, calling sqlite3_result_error in callbacks 51 * triggers a bug in SQLite that leads either to irritating results or 52 * segfaults, depending on the SQLite version */ 53 #if SQLITE_VERSION_NUMBER >= 3003003 54 sqlite3_result_error(ctx, errmsg, len); 55 #else 56 PyErr_SetString(pysqlite_OperationalError, errmsg); 57 #endif 58 } 59 60 int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) 61 { 62 static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL}; 63 64 PyObject* database; 65 int detect_types = 0; 66 PyObject* isolation_level = NULL; 67 PyObject* factory = NULL; 68 int check_same_thread = 1; 69 int cached_statements = 100; 70 double timeout = 5.0; 71 int rc; 72 PyObject* class_attr = NULL; 73 PyObject* class_attr_str = NULL; 74 int is_apsw_connection = 0; 75 PyObject* database_utf8; 76 77 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOi", kwlist, 78 &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements)) 79 { 80 return -1; 81 } 82 83 self->initialized = 1; 84 85 self->begin_statement = NULL; 86 87 self->statement_cache = NULL; 88 self->statements = NULL; 89 self->cursors = NULL; 90 91 Py_INCREF(Py_None); 92 self->row_factory = Py_None; 93 94 Py_INCREF(&PyUnicode_Type); 95 self->text_factory = (PyObject*)&PyUnicode_Type; 96 97 if (PyString_Check(database) || PyUnicode_Check(database)) { 98 if (PyString_Check(database)) { 99 database_utf8 = database; 100 Py_INCREF(database_utf8); 101 } else { 102 database_utf8 = PyUnicode_AsUTF8String(database); 103 if (!database_utf8) { 104 return -1; 105 } 106 } 107 108 Py_BEGIN_ALLOW_THREADS 109 rc = sqlite3_open(PyString_AsString(database_utf8), &self->db); 110 Py_END_ALLOW_THREADS 111 112 Py_DECREF(database_utf8); 113 114 if (rc != SQLITE_OK) { 115 _pysqlite_seterror(self->db, NULL); 116 return -1; 117 } 118 } else { 119 /* Create a pysqlite connection from an APSW connection */ 120 class_attr = PyObject_GetAttrString(database, "__class__"); 121 if (class_attr) { 122 class_attr_str = PyObject_Str(class_attr); 123 if (class_attr_str) { 124 if (strcmp(PyString_AsString(class_attr_str), "<type 'apsw.Connection'>") == 0) { 125 /* In the APSW Connection object, the first entry after 126 * PyObject_HEAD is the sqlite3* we want to get hold of. 127 * Luckily, this is the same layout as we have in our 128 * pysqlite_Connection */ 129 self->db = ((pysqlite_Connection*)database)->db; 130 131 Py_INCREF(database); 132 self->apsw_connection = database; 133 is_apsw_connection = 1; 134 } 135 } 136 } 137 Py_XDECREF(class_attr_str); 138 Py_XDECREF(class_attr); 139 140 if (!is_apsw_connection) { 141 PyErr_SetString(PyExc_ValueError, "database parameter must be string or APSW Connection object"); 142 return -1; 143 } 144 } 145 146 if (!isolation_level) { 147 isolation_level = PyString_FromString(""); 148 if (!isolation_level) { 149 return -1; 150 } 151 } else { 152 Py_INCREF(isolation_level); 153 } 154 self->isolation_level = NULL; 155 if (pysqlite_connection_set_isolation_level(self, isolation_level) < 0) { 156 Py_DECREF(isolation_level); 157 return -1; 158 } 159 Py_DECREF(isolation_level); 160 161 self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "Oi", self, cached_statements); 162 if (PyErr_Occurred()) { 163 return -1; 164 } 165 166 self->created_statements = 0; 167 self->created_cursors = 0; 168 169 /* Create lists of weak references to statements/cursors */ 170 self->statements = PyList_New(0); 171 self->cursors = PyList_New(0); 172 if (!self->statements || !self->cursors) { 173 return -1; 174 } 175 176 /* By default, the Cache class INCREFs the factory in its initializer, and 177 * decrefs it in its deallocator method. Since this would create a circular 178 * reference here, we're breaking it by decrementing self, and telling the 179 * cache class to not decref the factory (self) in its deallocator. 180 */ 181 self->statement_cache->decref_factory = 0; 182 Py_DECREF(self); 183 184 self->inTransaction = 0; 185 self->detect_types = detect_types; 186 self->timeout = timeout; 187 (void)sqlite3_busy_timeout(self->db, (int)(timeout*1000)); 188 #ifdef WITH_THREAD 189 self->thread_ident = PyThread_get_thread_ident(); 190 #endif 191 self->check_same_thread = check_same_thread; 192 193 self->function_pinboard = PyDict_New(); 194 if (!self->function_pinboard) { 195 return -1; 196 } 197 198 self->collations = PyDict_New(); 199 if (!self->collations) { 200 return -1; 201 } 202 203 self->Warning = pysqlite_Warning; 204 self->Error = pysqlite_Error; 205 self->InterfaceError = pysqlite_InterfaceError; 206 self->DatabaseError = pysqlite_DatabaseError; 207 self->DataError = pysqlite_DataError; 208 self->OperationalError = pysqlite_OperationalError; 209 self->IntegrityError = pysqlite_IntegrityError; 210 self->InternalError = pysqlite_InternalError; 211 self->ProgrammingError = pysqlite_ProgrammingError; 212 self->NotSupportedError = pysqlite_NotSupportedError; 213 214 return 0; 215 } 216 217 /* Empty the entire statement cache of this connection */ 218 void pysqlite_flush_statement_cache(pysqlite_Connection* self) 219 { 220 pysqlite_Node* node; 221 pysqlite_Statement* statement; 222 223 node = self->statement_cache->first; 224 225 while (node) { 226 statement = (pysqlite_Statement*)(node->data); 227 (void)pysqlite_statement_finalize(statement); 228 node = node->next; 229 } 230 231 Py_SETREF(self->statement_cache, 232 (pysqlite_Cache *)PyObject_CallFunction((PyObject *)&pysqlite_CacheType, "O", self)); 233 Py_DECREF(self); 234 self->statement_cache->decref_factory = 0; 235 } 236 237 /* action in (ACTION_RESET, ACTION_FINALIZE) */ 238 void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset_cursors) 239 { 240 int i; 241 PyObject* weakref; 242 PyObject* statement; 243 pysqlite_Cursor* cursor; 244 245 for (i = 0; i < PyList_Size(self->statements); i++) { 246 weakref = PyList_GetItem(self->statements, i); 247 statement = PyWeakref_GetObject(weakref); 248 if (statement != Py_None) { 249 if (action == ACTION_RESET) { 250 (void)pysqlite_statement_reset((pysqlite_Statement*)statement); 251 } else { 252 (void)pysqlite_statement_finalize((pysqlite_Statement*)statement); 253 } 254 } 255 } 256 257 if (reset_cursors) { 258 for (i = 0; i < PyList_Size(self->cursors); i++) { 259 weakref = PyList_GetItem(self->cursors, i); 260 cursor = (pysqlite_Cursor*)PyWeakref_GetObject(weakref); 261 if ((PyObject*)cursor != Py_None) { 262 cursor->reset = 1; 263 } 264 } 265 } 266 } 267 268 void pysqlite_connection_dealloc(pysqlite_Connection* self) 269 { 270 PyObject* ret = NULL; 271 272 Py_XDECREF(self->statement_cache); 273 274 /* Clean up if user has not called .close() explicitly. */ 275 if (self->db) { 276 Py_BEGIN_ALLOW_THREADS 277 sqlite3_close(self->db); 278 Py_END_ALLOW_THREADS 279 } else if (self->apsw_connection) { 280 ret = PyObject_CallMethod(self->apsw_connection, "close", ""); 281 Py_XDECREF(ret); 282 Py_XDECREF(self->apsw_connection); 283 } 284 285 if (self->begin_statement) { 286 PyMem_Free(self->begin_statement); 287 } 288 Py_XDECREF(self->isolation_level); 289 Py_XDECREF(self->function_pinboard); 290 Py_XDECREF(self->row_factory); 291 Py_XDECREF(self->text_factory); 292 Py_XDECREF(self->collations); 293 Py_XDECREF(self->statements); 294 Py_XDECREF(self->cursors); 295 296 self->ob_type->tp_free((PyObject*)self); 297 } 298 299 /* 300 * Registers a cursor with the connection. 301 * 302 * 0 => error; 1 => ok 303 */ 304 int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObject* cursor) 305 { 306 PyObject* weakref; 307 308 weakref = PyWeakref_NewRef((PyObject*)cursor, NULL); 309 if (!weakref) { 310 goto error; 311 } 312 313 if (PyList_Append(connection->cursors, weakref) != 0) { 314 Py_CLEAR(weakref); 315 goto error; 316 } 317 318 Py_DECREF(weakref); 319 320 return 1; 321 error: 322 return 0; 323 } 324 325 PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) 326 { 327 static char *kwlist[] = {"factory", NULL}; 328 PyObject* factory = NULL; 329 PyObject* cursor; 330 331 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist, 332 &factory)) { 333 return NULL; 334 } 335 336 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 337 return NULL; 338 } 339 340 if (factory == NULL) { 341 factory = (PyObject*)&pysqlite_CursorType; 342 } 343 344 cursor = PyObject_CallFunctionObjArgs(factory, (PyObject *)self, NULL); 345 if (cursor == NULL) 346 return NULL; 347 if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) { 348 PyErr_Format(PyExc_TypeError, 349 "factory must return a cursor, not %.100s", 350 Py_TYPE(cursor)->tp_name); 351 Py_DECREF(cursor); 352 return NULL; 353 } 354 355 _pysqlite_drop_unused_cursor_references(self); 356 357 if (cursor && self->row_factory != Py_None) { 358 Py_INCREF(self->row_factory); 359 Py_XSETREF(((pysqlite_Cursor *)cursor)->row_factory, self->row_factory); 360 } 361 362 return cursor; 363 } 364 365 PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args) 366 { 367 PyObject* ret; 368 int rc; 369 370 if (!pysqlite_check_thread(self)) { 371 return NULL; 372 } 373 374 pysqlite_do_all_statements(self, ACTION_FINALIZE, 1); 375 376 if (self->db) { 377 if (self->apsw_connection) { 378 ret = PyObject_CallMethod(self->apsw_connection, "close", ""); 379 Py_XDECREF(ret); 380 Py_CLEAR(self->apsw_connection); 381 self->db = NULL; 382 } else { 383 Py_BEGIN_ALLOW_THREADS 384 rc = sqlite3_close(self->db); 385 Py_END_ALLOW_THREADS 386 387 if (rc != SQLITE_OK) { 388 _pysqlite_seterror(self->db, NULL); 389 return NULL; 390 } else { 391 self->db = NULL; 392 } 393 } 394 } 395 396 Py_INCREF(Py_None); 397 return Py_None; 398 } 399 400 /* 401 * Checks if a connection object is usable (i. e. not closed). 402 * 403 * 0 => error; 1 => ok 404 */ 405 int pysqlite_check_connection(pysqlite_Connection* con) 406 { 407 if (!con->initialized) { 408 PyErr_SetString(pysqlite_ProgrammingError, "Base Connection.__init__ not called."); 409 return 0; 410 } 411 412 if (!con->db) { 413 PyErr_SetString(pysqlite_ProgrammingError, "Cannot operate on a closed database."); 414 return 0; 415 } else { 416 return 1; 417 } 418 } 419 420 PyObject* _pysqlite_connection_begin(pysqlite_Connection* self) 421 { 422 int rc; 423 const char* tail; 424 sqlite3_stmt* statement; 425 426 Py_BEGIN_ALLOW_THREADS 427 rc = sqlite3_prepare(self->db, self->begin_statement, -1, &statement, &tail); 428 Py_END_ALLOW_THREADS 429 430 if (rc != SQLITE_OK) { 431 _pysqlite_seterror(self->db, statement); 432 goto error; 433 } 434 435 rc = pysqlite_step(statement, self); 436 if (rc == SQLITE_DONE) { 437 self->inTransaction = 1; 438 } else { 439 _pysqlite_seterror(self->db, statement); 440 } 441 442 Py_BEGIN_ALLOW_THREADS 443 rc = sqlite3_finalize(statement); 444 Py_END_ALLOW_THREADS 445 446 if (rc != SQLITE_OK && !PyErr_Occurred()) { 447 _pysqlite_seterror(self->db, NULL); 448 } 449 450 error: 451 if (PyErr_Occurred()) { 452 return NULL; 453 } else { 454 Py_INCREF(Py_None); 455 return Py_None; 456 } 457 } 458 459 PyObject* pysqlite_connection_commit(pysqlite_Connection* self, PyObject* args) 460 { 461 int rc; 462 const char* tail; 463 sqlite3_stmt* statement; 464 465 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 466 return NULL; 467 } 468 469 if (self->inTransaction) { 470 471 Py_BEGIN_ALLOW_THREADS 472 rc = sqlite3_prepare(self->db, "COMMIT", -1, &statement, &tail); 473 Py_END_ALLOW_THREADS 474 if (rc != SQLITE_OK) { 475 _pysqlite_seterror(self->db, NULL); 476 goto error; 477 } 478 479 rc = pysqlite_step(statement, self); 480 if (rc == SQLITE_DONE) { 481 self->inTransaction = 0; 482 } else { 483 _pysqlite_seterror(self->db, statement); 484 } 485 486 Py_BEGIN_ALLOW_THREADS 487 rc = sqlite3_finalize(statement); 488 Py_END_ALLOW_THREADS 489 if (rc != SQLITE_OK && !PyErr_Occurred()) { 490 _pysqlite_seterror(self->db, NULL); 491 } 492 493 } 494 495 error: 496 if (PyErr_Occurred()) { 497 return NULL; 498 } else { 499 Py_INCREF(Py_None); 500 return Py_None; 501 } 502 } 503 504 PyObject* pysqlite_connection_rollback(pysqlite_Connection* self, PyObject* args) 505 { 506 int rc; 507 const char* tail; 508 sqlite3_stmt* statement; 509 510 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 511 return NULL; 512 } 513 514 if (self->inTransaction) { 515 pysqlite_do_all_statements(self, ACTION_RESET, 1); 516 517 Py_BEGIN_ALLOW_THREADS 518 rc = sqlite3_prepare(self->db, "ROLLBACK", -1, &statement, &tail); 519 Py_END_ALLOW_THREADS 520 if (rc != SQLITE_OK) { 521 _pysqlite_seterror(self->db, NULL); 522 goto error; 523 } 524 525 rc = pysqlite_step(statement, self); 526 if (rc == SQLITE_DONE) { 527 self->inTransaction = 0; 528 } else { 529 _pysqlite_seterror(self->db, statement); 530 } 531 532 Py_BEGIN_ALLOW_THREADS 533 rc = sqlite3_finalize(statement); 534 Py_END_ALLOW_THREADS 535 if (rc != SQLITE_OK && !PyErr_Occurred()) { 536 _pysqlite_seterror(self->db, NULL); 537 } 538 539 } 540 541 error: 542 if (PyErr_Occurred()) { 543 return NULL; 544 } else { 545 Py_INCREF(Py_None); 546 return Py_None; 547 } 548 } 549 550 static int 551 _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) 552 { 553 if (py_val == Py_None) { 554 sqlite3_result_null(context); 555 } else if (PyInt_Check(py_val)) { 556 sqlite3_result_int64(context, (sqlite_int64)PyInt_AsLong(py_val)); 557 } else if (PyLong_Check(py_val)) { 558 sqlite_int64 value = _pysqlite_long_as_int64(py_val); 559 if (value == -1 && PyErr_Occurred()) 560 return -1; 561 sqlite3_result_int64(context, value); 562 } else if (PyFloat_Check(py_val)) { 563 sqlite3_result_double(context, PyFloat_AsDouble(py_val)); 564 } else if (PyBuffer_Check(py_val)) { 565 const char* buffer; 566 Py_ssize_t buflen; 567 if (PyObject_AsCharBuffer(py_val, &buffer, &buflen) != 0) { 568 PyErr_SetString(PyExc_ValueError, "could not convert BLOB to buffer"); 569 return -1; 570 } 571 sqlite3_result_blob(context, buffer, buflen, SQLITE_TRANSIENT); 572 } else if (PyString_Check(py_val)) { 573 sqlite3_result_text(context, PyString_AsString(py_val), -1, SQLITE_TRANSIENT); 574 } else if (PyUnicode_Check(py_val)) { 575 PyObject * stringval = PyUnicode_AsUTF8String(py_val); 576 if (!stringval) 577 return -1; 578 sqlite3_result_text(context, PyString_AsString(stringval), -1, SQLITE_TRANSIENT); 579 Py_DECREF(stringval); 580 } else { 581 return -1; 582 } 583 return 0; 584 } 585 586 PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_value** argv) 587 { 588 PyObject* args; 589 int i; 590 sqlite3_value* cur_value; 591 PyObject* cur_py_value; 592 const char* val_str; 593 Py_ssize_t buflen; 594 void* raw_buffer; 595 596 args = PyTuple_New(argc); 597 if (!args) { 598 return NULL; 599 } 600 601 for (i = 0; i < argc; i++) { 602 cur_value = argv[i]; 603 switch (sqlite3_value_type(argv[i])) { 604 case SQLITE_INTEGER: 605 cur_py_value = _pysqlite_long_from_int64(sqlite3_value_int64(cur_value)); 606 break; 607 case SQLITE_FLOAT: 608 cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value)); 609 break; 610 case SQLITE_TEXT: 611 val_str = (const char*)sqlite3_value_text(cur_value); 612 cur_py_value = PyUnicode_DecodeUTF8(val_str, strlen(val_str), NULL); 613 /* TODO: have a way to show errors here */ 614 if (!cur_py_value) { 615 PyErr_Clear(); 616 Py_INCREF(Py_None); 617 cur_py_value = Py_None; 618 } 619 break; 620 case SQLITE_BLOB: 621 buflen = sqlite3_value_bytes(cur_value); 622 cur_py_value = PyBuffer_New(buflen); 623 if (!cur_py_value) { 624 break; 625 } 626 if (PyObject_AsWriteBuffer(cur_py_value, &raw_buffer, &buflen)) { 627 Py_DECREF(cur_py_value); 628 cur_py_value = NULL; 629 break; 630 } 631 memcpy(raw_buffer, sqlite3_value_blob(cur_value), buflen); 632 break; 633 case SQLITE_NULL: 634 default: 635 Py_INCREF(Py_None); 636 cur_py_value = Py_None; 637 } 638 639 if (!cur_py_value) { 640 Py_DECREF(args); 641 return NULL; 642 } 643 644 PyTuple_SetItem(args, i, cur_py_value); 645 646 } 647 648 return args; 649 } 650 651 void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** argv) 652 { 653 PyObject* args; 654 PyObject* py_func; 655 PyObject* py_retval = NULL; 656 int ok; 657 658 #ifdef WITH_THREAD 659 PyGILState_STATE threadstate; 660 661 threadstate = PyGILState_Ensure(); 662 #endif 663 664 py_func = (PyObject*)sqlite3_user_data(context); 665 666 args = _pysqlite_build_py_params(context, argc, argv); 667 if (args) { 668 py_retval = PyObject_CallObject(py_func, args); 669 Py_DECREF(args); 670 } 671 672 ok = 0; 673 if (py_retval) { 674 ok = _pysqlite_set_result(context, py_retval) == 0; 675 Py_DECREF(py_retval); 676 } 677 if (!ok) { 678 if (_enable_callback_tracebacks) { 679 PyErr_Print(); 680 } else { 681 PyErr_Clear(); 682 } 683 _sqlite3_result_error(context, "user-defined function raised exception", -1); 684 } 685 686 #ifdef WITH_THREAD 687 PyGILState_Release(threadstate); 688 #endif 689 } 690 691 static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_value** params) 692 { 693 PyObject* args; 694 PyObject* function_result = NULL; 695 PyObject* aggregate_class; 696 PyObject** aggregate_instance; 697 PyObject* stepmethod = NULL; 698 699 #ifdef WITH_THREAD 700 PyGILState_STATE threadstate; 701 702 threadstate = PyGILState_Ensure(); 703 #endif 704 705 aggregate_class = (PyObject*)sqlite3_user_data(context); 706 707 aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*)); 708 709 if (*aggregate_instance == 0) { 710 *aggregate_instance = PyObject_CallFunction(aggregate_class, ""); 711 712 if (PyErr_Occurred()) { 713 *aggregate_instance = 0; 714 if (_enable_callback_tracebacks) { 715 PyErr_Print(); 716 } else { 717 PyErr_Clear(); 718 } 719 _sqlite3_result_error(context, "user-defined aggregate's '__init__' method raised error", -1); 720 goto error; 721 } 722 } 723 724 stepmethod = PyObject_GetAttrString(*aggregate_instance, "step"); 725 if (!stepmethod) { 726 goto error; 727 } 728 729 args = _pysqlite_build_py_params(context, argc, params); 730 if (!args) { 731 goto error; 732 } 733 734 function_result = PyObject_CallObject(stepmethod, args); 735 Py_DECREF(args); 736 737 if (!function_result) { 738 if (_enable_callback_tracebacks) { 739 PyErr_Print(); 740 } else { 741 PyErr_Clear(); 742 } 743 _sqlite3_result_error(context, "user-defined aggregate's 'step' method raised error", -1); 744 } 745 746 error: 747 Py_XDECREF(stepmethod); 748 Py_XDECREF(function_result); 749 750 #ifdef WITH_THREAD 751 PyGILState_Release(threadstate); 752 #endif 753 } 754 755 void _pysqlite_final_callback(sqlite3_context* context) 756 { 757 PyObject* function_result; 758 PyObject** aggregate_instance; 759 int ok; 760 761 #ifdef WITH_THREAD 762 PyGILState_STATE threadstate; 763 764 threadstate = PyGILState_Ensure(); 765 #endif 766 767 aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*)); 768 if (!*aggregate_instance) { 769 /* this branch is executed if there was an exception in the aggregate's 770 * __init__ */ 771 772 goto error; 773 } 774 775 function_result = PyObject_CallMethod(*aggregate_instance, "finalize", ""); 776 Py_DECREF(*aggregate_instance); 777 778 ok = 0; 779 if (function_result) { 780 ok = _pysqlite_set_result(context, function_result) == 0; 781 Py_DECREF(function_result); 782 } 783 if (!ok) { 784 if (_enable_callback_tracebacks) { 785 PyErr_Print(); 786 } else { 787 PyErr_Clear(); 788 } 789 _sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1); 790 } 791 792 error: 793 ; /* necessary for --without-threads flag */ 794 #ifdef WITH_THREAD 795 PyGILState_Release(threadstate); 796 #endif 797 } 798 799 static void _pysqlite_drop_unused_statement_references(pysqlite_Connection* self) 800 { 801 PyObject* new_list; 802 PyObject* weakref; 803 int i; 804 805 /* we only need to do this once in a while */ 806 if (self->created_statements++ < 200) { 807 return; 808 } 809 810 self->created_statements = 0; 811 812 new_list = PyList_New(0); 813 if (!new_list) { 814 return; 815 } 816 817 for (i = 0; i < PyList_Size(self->statements); i++) { 818 weakref = PyList_GetItem(self->statements, i); 819 if (PyWeakref_GetObject(weakref) != Py_None) { 820 if (PyList_Append(new_list, weakref) != 0) { 821 Py_DECREF(new_list); 822 return; 823 } 824 } 825 } 826 827 Py_SETREF(self->statements, new_list); 828 } 829 830 static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self) 831 { 832 PyObject* new_list; 833 PyObject* weakref; 834 int i; 835 836 /* we only need to do this once in a while */ 837 if (self->created_cursors++ < 200) { 838 return; 839 } 840 841 self->created_cursors = 0; 842 843 new_list = PyList_New(0); 844 if (!new_list) { 845 return; 846 } 847 848 for (i = 0; i < PyList_Size(self->cursors); i++) { 849 weakref = PyList_GetItem(self->cursors, i); 850 if (PyWeakref_GetObject(weakref) != Py_None) { 851 if (PyList_Append(new_list, weakref) != 0) { 852 Py_DECREF(new_list); 853 return; 854 } 855 } 856 } 857 858 Py_SETREF(self->cursors, new_list); 859 } 860 861 PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) 862 { 863 static char *kwlist[] = {"name", "narg", "func", NULL, NULL}; 864 865 PyObject* func; 866 char* name; 867 int narg; 868 int rc; 869 870 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 871 return NULL; 872 } 873 874 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO", kwlist, 875 &name, &narg, &func)) 876 { 877 return NULL; 878 } 879 880 rc = sqlite3_create_function(self->db, name, narg, SQLITE_UTF8, (void*)func, _pysqlite_func_callback, NULL, NULL); 881 882 if (rc != SQLITE_OK) { 883 /* Workaround for SQLite bug: no error code or string is available here */ 884 PyErr_SetString(pysqlite_OperationalError, "Error creating function"); 885 return NULL; 886 } else { 887 if (PyDict_SetItem(self->function_pinboard, func, Py_None) == -1) 888 return NULL; 889 890 Py_INCREF(Py_None); 891 return Py_None; 892 } 893 } 894 895 PyObject* pysqlite_connection_create_aggregate(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) 896 { 897 PyObject* aggregate_class; 898 899 int n_arg; 900 char* name; 901 static char *kwlist[] = { "name", "n_arg", "aggregate_class", NULL }; 902 int rc; 903 904 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 905 return NULL; 906 } 907 908 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO:create_aggregate", 909 kwlist, &name, &n_arg, &aggregate_class)) { 910 return NULL; 911 } 912 913 rc = sqlite3_create_function(self->db, name, n_arg, SQLITE_UTF8, (void*)aggregate_class, 0, &_pysqlite_step_callback, &_pysqlite_final_callback); 914 if (rc != SQLITE_OK) { 915 /* Workaround for SQLite bug: no error code or string is available here */ 916 PyErr_SetString(pysqlite_OperationalError, "Error creating aggregate"); 917 return NULL; 918 } else { 919 if (PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None) == -1) 920 return NULL; 921 922 Py_INCREF(Py_None); 923 return Py_None; 924 } 925 } 926 927 static int _authorizer_callback(void* user_arg, int action, const char* arg1, const char* arg2 , const char* dbname, const char* access_attempt_source) 928 { 929 PyObject *ret; 930 int rc; 931 #ifdef WITH_THREAD 932 PyGILState_STATE gilstate; 933 934 gilstate = PyGILState_Ensure(); 935 #endif 936 ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source); 937 938 if (!ret) { 939 if (_enable_callback_tracebacks) { 940 PyErr_Print(); 941 } else { 942 PyErr_Clear(); 943 } 944 945 rc = SQLITE_DENY; 946 } else { 947 if (PyInt_Check(ret)) { 948 rc = _PyInt_AsInt(ret); 949 if (rc == -1 && PyErr_Occurred()) 950 rc = SQLITE_DENY; 951 } else { 952 rc = SQLITE_DENY; 953 } 954 Py_DECREF(ret); 955 } 956 957 #ifdef WITH_THREAD 958 PyGILState_Release(gilstate); 959 #endif 960 return rc; 961 } 962 963 static int _progress_handler(void* user_arg) 964 { 965 int rc; 966 PyObject *ret; 967 #ifdef WITH_THREAD 968 PyGILState_STATE gilstate; 969 970 gilstate = PyGILState_Ensure(); 971 #endif 972 ret = PyObject_CallFunction((PyObject*)user_arg, ""); 973 974 if (!ret) { 975 if (_enable_callback_tracebacks) { 976 PyErr_Print(); 977 } else { 978 PyErr_Clear(); 979 } 980 981 /* abort query if error occurred */ 982 rc = 1; 983 } else { 984 rc = (int)PyObject_IsTrue(ret); 985 Py_DECREF(ret); 986 } 987 988 #ifdef WITH_THREAD 989 PyGILState_Release(gilstate); 990 #endif 991 return rc; 992 } 993 994 static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) 995 { 996 PyObject* authorizer_cb; 997 998 static char *kwlist[] = { "authorizer_callback", NULL }; 999 int rc; 1000 1001 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 1002 return NULL; 1003 } 1004 1005 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:set_authorizer", 1006 kwlist, &authorizer_cb)) { 1007 return NULL; 1008 } 1009 1010 rc = sqlite3_set_authorizer(self->db, _authorizer_callback, (void*)authorizer_cb); 1011 1012 if (rc != SQLITE_OK) { 1013 PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback"); 1014 return NULL; 1015 } else { 1016 if (PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None) == -1) 1017 return NULL; 1018 1019 Py_INCREF(Py_None); 1020 return Py_None; 1021 } 1022 } 1023 1024 static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) 1025 { 1026 PyObject* progress_handler; 1027 int n; 1028 1029 static char *kwlist[] = { "progress_handler", "n", NULL }; 1030 1031 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 1032 return NULL; 1033 } 1034 1035 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi:set_progress_handler", 1036 kwlist, &progress_handler, &n)) { 1037 return NULL; 1038 } 1039 1040 if (progress_handler == Py_None) { 1041 /* None clears the progress handler previously set */ 1042 sqlite3_progress_handler(self->db, 0, 0, (void*)0); 1043 } else { 1044 sqlite3_progress_handler(self->db, n, _progress_handler, progress_handler); 1045 if (PyDict_SetItem(self->function_pinboard, progress_handler, Py_None) == -1) 1046 return NULL; 1047 } 1048 1049 Py_INCREF(Py_None); 1050 return Py_None; 1051 } 1052 1053 #ifdef HAVE_LOAD_EXTENSION 1054 static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObject* args) 1055 { 1056 int rc; 1057 int onoff; 1058 1059 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 1060 return NULL; 1061 } 1062 1063 if (!PyArg_ParseTuple(args, "i", &onoff)) { 1064 return NULL; 1065 } 1066 1067 rc = sqlite3_enable_load_extension(self->db, onoff); 1068 1069 if (rc != SQLITE_OK) { 1070 PyErr_SetString(pysqlite_OperationalError, "Error enabling load extension"); 1071 return NULL; 1072 } else { 1073 Py_INCREF(Py_None); 1074 return Py_None; 1075 } 1076 } 1077 1078 static PyObject* pysqlite_load_extension(pysqlite_Connection* self, PyObject* args) 1079 { 1080 int rc; 1081 char* extension_name; 1082 char* errmsg; 1083 1084 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 1085 return NULL; 1086 } 1087 1088 if (!PyArg_ParseTuple(args, "s", &extension_name)) { 1089 return NULL; 1090 } 1091 1092 rc = sqlite3_load_extension(self->db, extension_name, 0, &errmsg); 1093 if (rc != 0) { 1094 PyErr_SetString(pysqlite_OperationalError, errmsg); 1095 return NULL; 1096 } else { 1097 Py_INCREF(Py_None); 1098 return Py_None; 1099 } 1100 } 1101 #endif 1102 1103 int pysqlite_check_thread(pysqlite_Connection* self) 1104 { 1105 #ifdef WITH_THREAD 1106 if (self->check_same_thread) { 1107 if (PyThread_get_thread_ident() != self->thread_ident) { 1108 PyErr_Format(pysqlite_ProgrammingError, 1109 "SQLite objects created in a thread can only be used in that same thread." 1110 "The object was created in thread id %ld and this is thread id %ld", 1111 self->thread_ident, PyThread_get_thread_ident()); 1112 return 0; 1113 } 1114 1115 } 1116 #endif 1117 return 1; 1118 } 1119 1120 static PyObject* pysqlite_connection_get_isolation_level(pysqlite_Connection* self, void* unused) 1121 { 1122 Py_INCREF(self->isolation_level); 1123 return self->isolation_level; 1124 } 1125 1126 static PyObject* pysqlite_connection_get_total_changes(pysqlite_Connection* self, void* unused) 1127 { 1128 if (!pysqlite_check_connection(self)) { 1129 return NULL; 1130 } else { 1131 return Py_BuildValue("i", sqlite3_total_changes(self->db)); 1132 } 1133 } 1134 1135 static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level) 1136 { 1137 PyObject* res; 1138 PyObject* begin_statement; 1139 char* begin_statement_str; 1140 1141 Py_XDECREF(self->isolation_level); 1142 1143 if (self->begin_statement) { 1144 PyMem_Free(self->begin_statement); 1145 self->begin_statement = NULL; 1146 } 1147 1148 if (isolation_level == Py_None) { 1149 Py_INCREF(Py_None); 1150 self->isolation_level = Py_None; 1151 1152 res = pysqlite_connection_commit(self, NULL); 1153 if (!res) { 1154 return -1; 1155 } 1156 Py_DECREF(res); 1157 1158 self->inTransaction = 0; 1159 } else { 1160 Py_INCREF(isolation_level); 1161 self->isolation_level = isolation_level; 1162 1163 begin_statement = PyString_FromString("BEGIN "); 1164 if (!begin_statement) { 1165 return -1; 1166 } 1167 PyString_Concat(&begin_statement, isolation_level); 1168 if (!begin_statement) { 1169 return -1; 1170 } 1171 1172 begin_statement_str = PyString_AsString(begin_statement); 1173 if (!begin_statement_str) { 1174 Py_DECREF(begin_statement); 1175 return -1; 1176 } 1177 self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2); 1178 if (!self->begin_statement) { 1179 Py_DECREF(begin_statement); 1180 return -1; 1181 } 1182 1183 strcpy(self->begin_statement, begin_statement_str); 1184 Py_DECREF(begin_statement); 1185 } 1186 1187 return 0; 1188 } 1189 1190 PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) 1191 { 1192 PyObject* sql; 1193 pysqlite_Statement* statement; 1194 PyObject* weakref; 1195 int rc; 1196 1197 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 1198 return NULL; 1199 } 1200 1201 if (!_PyArg_NoKeywords(MODULE_NAME ".Connection()", kwargs)) 1202 return NULL; 1203 1204 if (!PyArg_ParseTuple(args, "O", &sql)) { 1205 return NULL; 1206 } 1207 1208 _pysqlite_drop_unused_statement_references(self); 1209 1210 statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType); 1211 if (!statement) { 1212 return NULL; 1213 } 1214 1215 statement->db = NULL; 1216 statement->st = NULL; 1217 statement->sql = NULL; 1218 statement->in_use = 0; 1219 statement->in_weakreflist = NULL; 1220 1221 rc = pysqlite_statement_create(statement, self, sql); 1222 1223 if (rc != SQLITE_OK) { 1224 if (rc == PYSQLITE_TOO_MUCH_SQL) { 1225 PyErr_SetString(pysqlite_Warning, "You can only execute one statement at a time."); 1226 } else if (rc == PYSQLITE_SQL_WRONG_TYPE) { 1227 if (!PyErr_Occurred() || PyErr_ExceptionMatches(PyExc_TypeError)) 1228 PyErr_SetString(pysqlite_Warning, "SQL is of wrong type. Must be string or unicode."); 1229 } else { 1230 (void)pysqlite_statement_reset(statement); 1231 _pysqlite_seterror(self->db, NULL); 1232 } 1233 1234 Py_CLEAR(statement); 1235 } else { 1236 weakref = PyWeakref_NewRef((PyObject*)statement, NULL); 1237 if (!weakref) { 1238 Py_CLEAR(statement); 1239 goto error; 1240 } 1241 1242 if (PyList_Append(self->statements, weakref) != 0) { 1243 Py_CLEAR(weakref); 1244 goto error; 1245 } 1246 1247 Py_DECREF(weakref); 1248 } 1249 1250 error: 1251 return (PyObject*)statement; 1252 } 1253 1254 PyObject* pysqlite_connection_execute(pysqlite_Connection* self, PyObject* args) 1255 { 1256 PyObject* cursor = 0; 1257 PyObject* result = 0; 1258 PyObject* method = 0; 1259 1260 cursor = PyObject_CallMethod((PyObject*)self, "cursor", ""); 1261 if (!cursor) { 1262 goto error; 1263 } 1264 1265 method = PyObject_GetAttrString(cursor, "execute"); 1266 if (!method) { 1267 Py_CLEAR(cursor); 1268 goto error; 1269 } 1270 1271 result = PyObject_CallObject(method, args); 1272 if (!result) { 1273 Py_CLEAR(cursor); 1274 } 1275 1276 error: 1277 Py_XDECREF(result); 1278 Py_XDECREF(method); 1279 1280 return cursor; 1281 } 1282 1283 PyObject* pysqlite_connection_executemany(pysqlite_Connection* self, PyObject* args) 1284 { 1285 PyObject* cursor = 0; 1286 PyObject* result = 0; 1287 PyObject* method = 0; 1288 1289 cursor = PyObject_CallMethod((PyObject*)self, "cursor", ""); 1290 if (!cursor) { 1291 goto error; 1292 } 1293 1294 method = PyObject_GetAttrString(cursor, "executemany"); 1295 if (!method) { 1296 Py_CLEAR(cursor); 1297 goto error; 1298 } 1299 1300 result = PyObject_CallObject(method, args); 1301 if (!result) { 1302 Py_CLEAR(cursor); 1303 } 1304 1305 error: 1306 Py_XDECREF(result); 1307 Py_XDECREF(method); 1308 1309 return cursor; 1310 } 1311 1312 PyObject* pysqlite_connection_executescript(pysqlite_Connection* self, PyObject* args) 1313 { 1314 PyObject* cursor = 0; 1315 PyObject* result = 0; 1316 PyObject* method = 0; 1317 1318 cursor = PyObject_CallMethod((PyObject*)self, "cursor", ""); 1319 if (!cursor) { 1320 goto error; 1321 } 1322 1323 method = PyObject_GetAttrString(cursor, "executescript"); 1324 if (!method) { 1325 Py_CLEAR(cursor); 1326 goto error; 1327 } 1328 1329 result = PyObject_CallObject(method, args); 1330 if (!result) { 1331 Py_CLEAR(cursor); 1332 } 1333 1334 error: 1335 Py_XDECREF(result); 1336 Py_XDECREF(method); 1337 1338 return cursor; 1339 } 1340 1341 /* ------------------------- COLLATION CODE ------------------------ */ 1342 1343 static int 1344 pysqlite_collation_callback( 1345 void* context, 1346 int text1_length, const void* text1_data, 1347 int text2_length, const void* text2_data) 1348 { 1349 PyObject* callback = (PyObject*)context; 1350 PyObject* string1 = 0; 1351 PyObject* string2 = 0; 1352 #ifdef WITH_THREAD 1353 PyGILState_STATE gilstate; 1354 #endif 1355 PyObject* retval = NULL; 1356 long longval; 1357 int result = 0; 1358 #ifdef WITH_THREAD 1359 gilstate = PyGILState_Ensure(); 1360 #endif 1361 1362 if (PyErr_Occurred()) { 1363 goto finally; 1364 } 1365 1366 string1 = PyString_FromStringAndSize((const char*)text1_data, text1_length); 1367 string2 = PyString_FromStringAndSize((const char*)text2_data, text2_length); 1368 1369 if (!string1 || !string2) { 1370 goto finally; /* failed to allocate strings */ 1371 } 1372 1373 retval = PyObject_CallFunctionObjArgs(callback, string1, string2, NULL); 1374 1375 if (!retval) { 1376 /* execution failed */ 1377 goto finally; 1378 } 1379 1380 longval = PyLong_AsLongAndOverflow(retval, &result); 1381 if (longval == -1 && PyErr_Occurred()) { 1382 PyErr_Clear(); 1383 result = 0; 1384 } 1385 else if (!result) { 1386 if (longval > 0) 1387 result = 1; 1388 else if (longval < 0) 1389 result = -1; 1390 } 1391 1392 finally: 1393 Py_XDECREF(string1); 1394 Py_XDECREF(string2); 1395 Py_XDECREF(retval); 1396 #ifdef WITH_THREAD 1397 PyGILState_Release(gilstate); 1398 #endif 1399 return result; 1400 } 1401 1402 static PyObject * 1403 pysqlite_connection_interrupt(pysqlite_Connection* self, PyObject* args) 1404 { 1405 PyObject* retval = NULL; 1406 1407 if (!pysqlite_check_connection(self)) { 1408 goto finally; 1409 } 1410 1411 sqlite3_interrupt(self->db); 1412 1413 Py_INCREF(Py_None); 1414 retval = Py_None; 1415 1416 finally: 1417 return retval; 1418 } 1419 1420 /* Function author: Paul Kippes <kippesp (at) gmail.com> 1421 * Class method of Connection to call the Python function _iterdump 1422 * of the sqlite3 module. 1423 */ 1424 static PyObject * 1425 pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args) 1426 { 1427 PyObject* retval = NULL; 1428 PyObject* module = NULL; 1429 PyObject* module_dict; 1430 PyObject* pyfn_iterdump; 1431 1432 if (!pysqlite_check_connection(self)) { 1433 goto finally; 1434 } 1435 1436 module = PyImport_ImportModule(MODULE_NAME ".dump"); 1437 if (!module) { 1438 goto finally; 1439 } 1440 1441 module_dict = PyModule_GetDict(module); 1442 if (!module_dict) { 1443 goto finally; 1444 } 1445 1446 pyfn_iterdump = PyDict_GetItemString(module_dict, "_iterdump"); 1447 if (!pyfn_iterdump) { 1448 PyErr_SetString(pysqlite_OperationalError, "Failed to obtain _iterdump() reference"); 1449 goto finally; 1450 } 1451 1452 args = PyTuple_New(1); 1453 if (!args) { 1454 goto finally; 1455 } 1456 Py_INCREF(self); 1457 PyTuple_SetItem(args, 0, (PyObject*)self); 1458 retval = PyObject_CallObject(pyfn_iterdump, args); 1459 1460 finally: 1461 Py_XDECREF(args); 1462 Py_XDECREF(module); 1463 return retval; 1464 } 1465 1466 static PyObject * 1467 pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) 1468 { 1469 PyObject* callable; 1470 PyObject* uppercase_name = 0; 1471 PyObject* name; 1472 PyObject* retval; 1473 char* chk; 1474 int rc; 1475 1476 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { 1477 goto finally; 1478 } 1479 1480 if (!PyArg_ParseTuple(args, "SO:create_collation(name, callback)", 1481 &name, &callable)) { 1482 goto finally; 1483 } 1484 1485 uppercase_name = PyObject_CallMethod((PyObject *)&PyString_Type, 1486 "upper", "O", name); 1487 if (!uppercase_name) { 1488 goto finally; 1489 } 1490 1491 chk = PyString_AS_STRING(uppercase_name); 1492 while (*chk) { 1493 if ((*chk >= '0' && *chk <= '9') 1494 || (*chk >= 'A' && *chk <= 'Z') 1495 || (*chk == '_')) 1496 { 1497 chk++; 1498 } else { 1499 PyErr_SetString(pysqlite_ProgrammingError, "invalid character in collation name"); 1500 goto finally; 1501 } 1502 } 1503 1504 if (callable != Py_None && !PyCallable_Check(callable)) { 1505 PyErr_SetString(PyExc_TypeError, "parameter must be callable"); 1506 goto finally; 1507 } 1508 1509 if (callable != Py_None) { 1510 if (PyDict_SetItem(self->collations, uppercase_name, callable) == -1) 1511 goto finally; 1512 } else { 1513 if (PyDict_DelItem(self->collations, uppercase_name) == -1) 1514 goto finally; 1515 } 1516 1517 rc = sqlite3_create_collation(self->db, 1518 PyString_AsString(uppercase_name), 1519 SQLITE_UTF8, 1520 (callable != Py_None) ? callable : NULL, 1521 (callable != Py_None) ? pysqlite_collation_callback : NULL); 1522 if (rc != SQLITE_OK) { 1523 PyDict_DelItem(self->collations, uppercase_name); 1524 _pysqlite_seterror(self->db, NULL); 1525 goto finally; 1526 } 1527 1528 finally: 1529 Py_XDECREF(uppercase_name); 1530 1531 if (PyErr_Occurred()) { 1532 retval = NULL; 1533 } else { 1534 Py_INCREF(Py_None); 1535 retval = Py_None; 1536 } 1537 1538 return retval; 1539 } 1540 1541 /* Called when the connection is used as a context manager. Returns itself as a 1542 * convenience to the caller. */ 1543 static PyObject * 1544 pysqlite_connection_enter(pysqlite_Connection* self, PyObject* args) 1545 { 1546 Py_INCREF(self); 1547 return (PyObject*)self; 1548 } 1549 1550 /** Called when the connection is used as a context manager. If there was any 1551 * exception, a rollback takes place; otherwise we commit. */ 1552 static PyObject * 1553 pysqlite_connection_exit(pysqlite_Connection* self, PyObject* args) 1554 { 1555 PyObject* exc_type, *exc_value, *exc_tb; 1556 char* method_name; 1557 PyObject* result; 1558 1559 if (!PyArg_ParseTuple(args, "OOO", &exc_type, &exc_value, &exc_tb)) { 1560 return NULL; 1561 } 1562 1563 if (exc_type == Py_None && exc_value == Py_None && exc_tb == Py_None) { 1564 method_name = "commit"; 1565 } else { 1566 method_name = "rollback"; 1567 } 1568 1569 result = PyObject_CallMethod((PyObject*)self, method_name, ""); 1570 if (!result) { 1571 return NULL; 1572 } 1573 Py_DECREF(result); 1574 1575 Py_INCREF(Py_False); 1576 return Py_False; 1577 } 1578 1579 static char connection_doc[] = 1580 PyDoc_STR("SQLite database connection object."); 1581 1582 static PyGetSetDef connection_getset[] = { 1583 {"isolation_level", (getter)pysqlite_connection_get_isolation_level, (setter)pysqlite_connection_set_isolation_level}, 1584 {"total_changes", (getter)pysqlite_connection_get_total_changes, (setter)0}, 1585 {NULL} 1586 }; 1587 1588 static PyMethodDef connection_methods[] = { 1589 {"cursor", (PyCFunction)pysqlite_connection_cursor, METH_VARARGS|METH_KEYWORDS, 1590 PyDoc_STR("Return a cursor for the connection.")}, 1591 {"close", (PyCFunction)pysqlite_connection_close, METH_NOARGS, 1592 PyDoc_STR("Closes the connection.")}, 1593 {"commit", (PyCFunction)pysqlite_connection_commit, METH_NOARGS, 1594 PyDoc_STR("Commit the current transaction.")}, 1595 {"rollback", (PyCFunction)pysqlite_connection_rollback, METH_NOARGS, 1596 PyDoc_STR("Roll back the current transaction.")}, 1597 {"create_function", (PyCFunction)pysqlite_connection_create_function, METH_VARARGS|METH_KEYWORDS, 1598 PyDoc_STR("Creates a new function. Non-standard.")}, 1599 {"create_aggregate", (PyCFunction)pysqlite_connection_create_aggregate, METH_VARARGS|METH_KEYWORDS, 1600 PyDoc_STR("Creates a new aggregate. Non-standard.")}, 1601 {"set_authorizer", (PyCFunction)pysqlite_connection_set_authorizer, METH_VARARGS|METH_KEYWORDS, 1602 PyDoc_STR("Sets authorizer callback. Non-standard.")}, 1603 #ifdef HAVE_LOAD_EXTENSION 1604 {"enable_load_extension", (PyCFunction)pysqlite_enable_load_extension, METH_VARARGS, 1605 PyDoc_STR("Enable dynamic loading of SQLite extension modules. Non-standard.")}, 1606 {"load_extension", (PyCFunction)pysqlite_load_extension, METH_VARARGS, 1607 PyDoc_STR("Load SQLite extension module. Non-standard.")}, 1608 #endif 1609 {"set_progress_handler", (PyCFunction)pysqlite_connection_set_progress_handler, METH_VARARGS|METH_KEYWORDS, 1610 PyDoc_STR("Sets progress handler callback. Non-standard.")}, 1611 {"execute", (PyCFunction)pysqlite_connection_execute, METH_VARARGS, 1612 PyDoc_STR("Executes a SQL statement. Non-standard.")}, 1613 {"executemany", (PyCFunction)pysqlite_connection_executemany, METH_VARARGS, 1614 PyDoc_STR("Repeatedly executes a SQL statement. Non-standard.")}, 1615 {"executescript", (PyCFunction)pysqlite_connection_executescript, METH_VARARGS, 1616 PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")}, 1617 {"create_collation", (PyCFunction)pysqlite_connection_create_collation, METH_VARARGS, 1618 PyDoc_STR("Creates a collation function. Non-standard.")}, 1619 {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS, 1620 PyDoc_STR("Abort any pending database operation. Non-standard.")}, 1621 {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS, 1622 PyDoc_STR("Returns iterator to the dump of the database in an SQL text format. Non-standard.")}, 1623 {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS, 1624 PyDoc_STR("For context manager. Non-standard.")}, 1625 {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS, 1626 PyDoc_STR("For context manager. Non-standard.")}, 1627 {NULL, NULL} 1628 }; 1629 1630 static struct PyMemberDef connection_members[] = 1631 { 1632 {"Warning", T_OBJECT, offsetof(pysqlite_Connection, Warning), RO}, 1633 {"Error", T_OBJECT, offsetof(pysqlite_Connection, Error), RO}, 1634 {"InterfaceError", T_OBJECT, offsetof(pysqlite_Connection, InterfaceError), RO}, 1635 {"DatabaseError", T_OBJECT, offsetof(pysqlite_Connection, DatabaseError), RO}, 1636 {"DataError", T_OBJECT, offsetof(pysqlite_Connection, DataError), RO}, 1637 {"OperationalError", T_OBJECT, offsetof(pysqlite_Connection, OperationalError), RO}, 1638 {"IntegrityError", T_OBJECT, offsetof(pysqlite_Connection, IntegrityError), RO}, 1639 {"InternalError", T_OBJECT, offsetof(pysqlite_Connection, InternalError), RO}, 1640 {"ProgrammingError", T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), RO}, 1641 {"NotSupportedError", T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), RO}, 1642 {"row_factory", T_OBJECT, offsetof(pysqlite_Connection, row_factory)}, 1643 {"text_factory", T_OBJECT, offsetof(pysqlite_Connection, text_factory)}, 1644 {NULL} 1645 }; 1646 1647 PyTypeObject pysqlite_ConnectionType = { 1648 PyVarObject_HEAD_INIT(NULL, 0) 1649 MODULE_NAME ".Connection", /* tp_name */ 1650 sizeof(pysqlite_Connection), /* tp_basicsize */ 1651 0, /* tp_itemsize */ 1652 (destructor)pysqlite_connection_dealloc, /* tp_dealloc */ 1653 0, /* tp_print */ 1654 0, /* tp_getattr */ 1655 0, /* tp_setattr */ 1656 0, /* tp_compare */ 1657 0, /* tp_repr */ 1658 0, /* tp_as_number */ 1659 0, /* tp_as_sequence */ 1660 0, /* tp_as_mapping */ 1661 0, /* tp_hash */ 1662 (ternaryfunc)pysqlite_connection_call, /* tp_call */ 1663 0, /* tp_str */ 1664 0, /* tp_getattro */ 1665 0, /* tp_setattro */ 1666 0, /* tp_as_buffer */ 1667 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ 1668 connection_doc, /* tp_doc */ 1669 0, /* tp_traverse */ 1670 0, /* tp_clear */ 1671 0, /* tp_richcompare */ 1672 0, /* tp_weaklistoffset */ 1673 0, /* tp_iter */ 1674 0, /* tp_iternext */ 1675 connection_methods, /* tp_methods */ 1676 connection_members, /* tp_members */ 1677 connection_getset, /* tp_getset */ 1678 0, /* tp_base */ 1679 0, /* tp_dict */ 1680 0, /* tp_descr_get */ 1681 0, /* tp_descr_set */ 1682 0, /* tp_dictoffset */ 1683 (initproc)pysqlite_connection_init, /* tp_init */ 1684 0, /* tp_alloc */ 1685 0, /* tp_new */ 1686 0 /* tp_free */ 1687 }; 1688 1689 extern int pysqlite_connection_setup_types(void) 1690 { 1691 pysqlite_ConnectionType.tp_new = PyType_GenericNew; 1692 return PyType_Ready(&pysqlite_ConnectionType); 1693 } 1694