blob: 0f4eba0ab31b60f4ce7034eb251109804662b64c [file] [log] [blame]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001/* util.c - various utility functions
2 *
Florent Xiclunac934f322010-09-03 23:47:32 +00003 * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004 *
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 "connection.h"
26
Benjamin Petersond7b03282008-09-13 15:58:53 +000027int pysqlite_step(sqlite3_stmt* statement, pysqlite_Connection* connection)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000028{
29 int rc;
30
Erlend Egeberg Aasland91ea37c2021-02-26 00:39:34 +010031 Py_BEGIN_ALLOW_THREADS
32 rc = sqlite3_step(statement);
33 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000034
35 return rc;
36}
37
38/**
39 * Checks the SQLite error code and sets the appropriate DB-API exception.
Thomas Wouters0e3f5912006-08-11 14:57:12 +000040 * Returns the error code (0 means no error occurred).
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000041 */
Gerhard Häringe7ea7452008-03-29 00:45:29 +000042int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000043{
Benjamin Peterson52526942017-09-20 07:36:18 -070044 int errorcode = sqlite3_errcode(db);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000045
46 switch (errorcode)
47 {
48 case SQLITE_OK:
49 PyErr_Clear();
50 break;
51 case SQLITE_INTERNAL:
52 case SQLITE_NOTFOUND:
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000053 PyErr_SetString(pysqlite_InternalError, sqlite3_errmsg(db));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000054 break;
55 case SQLITE_NOMEM:
56 (void)PyErr_NoMemory();
57 break;
58 case SQLITE_ERROR:
59 case SQLITE_PERM:
60 case SQLITE_ABORT:
61 case SQLITE_BUSY:
62 case SQLITE_LOCKED:
63 case SQLITE_READONLY:
64 case SQLITE_INTERRUPT:
65 case SQLITE_IOERR:
66 case SQLITE_FULL:
67 case SQLITE_CANTOPEN:
68 case SQLITE_PROTOCOL:
69 case SQLITE_EMPTY:
70 case SQLITE_SCHEMA:
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000071 PyErr_SetString(pysqlite_OperationalError, sqlite3_errmsg(db));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000072 break;
73 case SQLITE_CORRUPT:
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000074 PyErr_SetString(pysqlite_DatabaseError, sqlite3_errmsg(db));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000075 break;
76 case SQLITE_TOOBIG:
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000077 PyErr_SetString(pysqlite_DataError, sqlite3_errmsg(db));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000078 break;
79 case SQLITE_CONSTRAINT:
80 case SQLITE_MISMATCH:
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000081 PyErr_SetString(pysqlite_IntegrityError, sqlite3_errmsg(db));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000082 break;
83 case SQLITE_MISUSE:
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000084 PyErr_SetString(pysqlite_ProgrammingError, sqlite3_errmsg(db));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000085 break;
86 default:
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000087 PyErr_SetString(pysqlite_DatabaseError, sqlite3_errmsg(db));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000088 break;
89 }
90
91 return errorcode;
92}
93
Serhiy Storchaka3cf96ac2013-02-07 17:01:47 +020094#ifdef WORDS_BIGENDIAN
95# define IS_LITTLE_ENDIAN 0
96#else
97# define IS_LITTLE_ENDIAN 1
98#endif
99
Serhiy Storchakad160b122013-04-28 14:10:27 +0300100sqlite_int64
Serhiy Storchaka3cf96ac2013-02-07 17:01:47 +0200101_pysqlite_long_as_int64(PyObject * py_val)
102{
103 int overflow;
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700104 long long value = PyLong_AsLongLongAndOverflow(py_val, &overflow);
Serhiy Storchaka3cf96ac2013-02-07 17:01:47 +0200105 if (value == -1 && PyErr_Occurred())
106 return -1;
107 if (!overflow) {
Serhiy Storchaka3cf96ac2013-02-07 17:01:47 +0200108# if SIZEOF_LONG_LONG > 8
109 if (-0x8000000000000000LL <= value && value <= 0x7FFFFFFFFFFFFFFFLL)
110# endif
Serhiy Storchaka3cf96ac2013-02-07 17:01:47 +0200111 return value;
112 }
Serhiy Storchakad160b122013-04-28 14:10:27 +0300113 else if (sizeof(value) < sizeof(sqlite_int64)) {
114 sqlite_int64 int64val;
Serhiy Storchaka3cf96ac2013-02-07 17:01:47 +0200115 if (_PyLong_AsByteArray((PyLongObject *)py_val,
116 (unsigned char *)&int64val, sizeof(int64val),
117 IS_LITTLE_ENDIAN, 1 /* signed */) >= 0) {
118 return int64val;
119 }
120 }
121 PyErr_SetString(PyExc_OverflowError,
122 "Python int too large to convert to SQLite INTEGER");
123 return -1;
124}