blob: cbaee92cce12ed35805da9efad76cd96ed9825c6 [file] [log] [blame]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001/* util.c - various utility functions
2 *
Anthony Baxter72289a62006-04-04 06:29:05 +00003 * Copyright (C) 2005-2006 Gerhard Häring <gh@ghaering.de>
Anthony Baxterc51ee692006-04-01 00:57:31 +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
Anthony Baxterc51ee692006-04-01 00:57:31 +000027int _sqlite_step_with_busyhandler(sqlite3_stmt* statement, Connection* connection
28)
29{
30 int rc;
31
Gerhard Häring14fbf292007-11-25 17:40:35 +000032 if (statement == NULL) {
33 /* this is a workaround for SQLite 3.5 and later. it now apparently
34 * returns NULL for "no-operation" statements */
35 rc = SQLITE_OK;
36 } else {
37 Py_BEGIN_ALLOW_THREADS
38 rc = sqlite3_step(statement);
39 Py_END_ALLOW_THREADS
40 }
Anthony Baxterc51ee692006-04-01 00:57:31 +000041
42 return rc;
43}
44
45/**
46 * Checks the SQLite error code and sets the appropriate DB-API exception.
Georg Brandlcddabbf2006-07-28 18:36:01 +000047 * Returns the error code (0 means no error occurred).
Anthony Baxterc51ee692006-04-01 00:57:31 +000048 */
49int _seterror(sqlite3* db)
50{
51 int errorcode;
52
53 errorcode = sqlite3_errcode(db);
54
55 switch (errorcode)
56 {
57 case SQLITE_OK:
58 PyErr_Clear();
59 break;
Anthony Baxterc51ee692006-04-01 00:57:31 +000060 case SQLITE_INTERNAL:
Anthony Baxter72289a62006-04-04 06:29:05 +000061 case SQLITE_NOTFOUND:
Anthony Baxterc51ee692006-04-01 00:57:31 +000062 PyErr_SetString(InternalError, sqlite3_errmsg(db));
63 break;
Anthony Baxterc51ee692006-04-01 00:57:31 +000064 case SQLITE_NOMEM:
65 (void)PyErr_NoMemory();
66 break;
Anthony Baxter72289a62006-04-04 06:29:05 +000067 case SQLITE_ERROR:
68 case SQLITE_PERM:
69 case SQLITE_ABORT:
70 case SQLITE_BUSY:
71 case SQLITE_LOCKED:
Anthony Baxterc51ee692006-04-01 00:57:31 +000072 case SQLITE_READONLY:
Anthony Baxterc51ee692006-04-01 00:57:31 +000073 case SQLITE_INTERRUPT:
Anthony Baxterc51ee692006-04-01 00:57:31 +000074 case SQLITE_IOERR:
Anthony Baxter72289a62006-04-04 06:29:05 +000075 case SQLITE_FULL:
76 case SQLITE_CANTOPEN:
77 case SQLITE_PROTOCOL:
78 case SQLITE_EMPTY:
79 case SQLITE_SCHEMA:
Anthony Baxterc51ee692006-04-01 00:57:31 +000080 PyErr_SetString(OperationalError, sqlite3_errmsg(db));
81 break;
82 case SQLITE_CORRUPT:
83 PyErr_SetString(DatabaseError, sqlite3_errmsg(db));
84 break;
Anthony Baxterc51ee692006-04-01 00:57:31 +000085 case SQLITE_TOOBIG:
86 PyErr_SetString(DataError, sqlite3_errmsg(db));
87 break;
88 case SQLITE_CONSTRAINT:
Anthony Baxterc51ee692006-04-01 00:57:31 +000089 case SQLITE_MISMATCH:
90 PyErr_SetString(IntegrityError, sqlite3_errmsg(db));
91 break;
92 case SQLITE_MISUSE:
93 PyErr_SetString(ProgrammingError, sqlite3_errmsg(db));
94 break;
95 default:
96 PyErr_SetString(DatabaseError, sqlite3_errmsg(db));
Anthony Baxter72289a62006-04-04 06:29:05 +000097 break;
Anthony Baxterc51ee692006-04-01 00:57:31 +000098 }
99
100 return errorcode;
101}
102