Коды результатов и ошибок
Overview
Многие подпрограммы в интерфейсе на языке C SQLite возвращают числовые коды результатов, указывающие на успех или неудачу, а в случае неудачи — на некоторое представление о причине сбоя. В этом документе делается попытка объяснить, что означает каждый из этих числовых кодов результатов.
1.Коды результатов против кодов ошибок
«Коды ошибок» — это подмножество «результирующих кодов», которые указывают на то, что что-то пошло не так. Есть только несколько кодов результатов без ошибок: SQLITE_OK , SQLITE_ROW и SQLITE_DONE . Термин «код ошибки» означает любой код результата, отличный от этих трех.
2.Коды первичных результатов по сравнению с кодами расширенных результатов
Коды результата-это подписанные 32-битные целые числа.Наименее значащие 8 бит кода результата определяют широкую категорию и называются «первичным кодом результата».Более значащие биты дают более подробную информацию об ошибке и называются «расширенным кодом результата».
Обратите внимание,что первичный код результата всегда является частью расширенного кода результата.При полном 32-битном расширенном результирующем коде приложение всегда может найти соответствующий код первичного результата,просто извлекая из расширенного результирующего кода наименее значащие 8 бит.
Все расширенные коды результатов также являются кодами ошибок.Поэтому термины «расширенный код результата» и «расширенный код ошибки» являются взаимозаменяемыми.
Для исторической совместимости интерфейсы на языке C по умолчанию возвращают первичные коды результатов. Расширенный код результата для самой последней ошибки можно получить с помощью интерфейса sqlite3_extended_errcode () . Интерфейс sqlite3_extended_result_codes () можно использовать для перевода соединения с базой данных в режим, в котором он возвращает расширенные коды результатов вместо основных кодов результатов.
3. Definitions
Все коды результатов — целые числа. Символические имена для всех результирующих кодов создаются с помощью макроса «#define» в заголовочном файле sqlite3.h. В заголовочном файле sqlite3.h есть отдельные разделы для определений кода результата и расширенных определений кода результата .
Код первичного результата-символические имена формы «SQLITE_XXXXXX»,где XXXXXX-это последовательность заглавных алфавитных символов.Расширенные кодовые имена результата относятся к форме «SQLITE_XXXXXX_YYYYYYY»,где XXXXXX часть является соответствующим первичным кодом результата,а YYYYYY является расширением,которое далее классифицирует код результата.
Названия и числовые значения для существующих кодов результатов являются фиксированными и неизменными.Однако в будущих релизах SQLite могут появиться новые коды результатов,и особенно новые расширенные коды результатов.
4.Перечень кодов первичных результатов
31 код результата определены в sqlite3.h и перечислены в алфавитном порядке ниже:
- SQLITE_ABORT (4)
- SQLITE_AUTH (23)
- SQLITE_BUSY (5)
- SQLITE_CANTOPEN (14)
- SQLITE_CONSTRAINT (19)
- SQLITE_CORRUPT (11)
- SQLITE_DONE (101)
- SQLITE_EMPTY (16)
- SQLITE_ERROR (1)
- SQLITE_FORMAT (24)
- SQLITE_FULL (13)
- SQLITE_INTERNAL (2)
- SQLITE_INTERRUPT (9)
- SQLITE_IOERR (10)
- SQLITE_LOCKED (6)
- SQLITE_MISMATCH (20)
- SQLITE_MISUSE (21)
- SQLITE_NOLFS (22)
- SQLITE_NOMEM (7)
- SQLITE_NOTADB (26)
- SQLITE_NOTFOUND (12)
- SQLITE_NOTICE (27)
- SQLITE_OK (0)
- SQLITE_PERM (3)
- SQLITE_PROTOCOL (15)
- SQLITE_RANGE (25)
- SQLITE_READONLY (8)
- SQLITE_ROW (100)
- SQLITE_SCHEMA (17)
- SQLITE_TOOBIG (18)
- SQLITE_WARNING (28)
5.Расширенный список кодов результатов
74 расширенных кода результатов определены в sqlite3.h и перечислены в алфавитном порядке ниже:
- SQLITE_ABORT_ROLLBACK (516)
- SQLITE_AUTH_USER (279)
- SQLITE_BUSY_RECOVERY (261)
- SQLITE_BUSY_SNAPSHOT (517)
- SQLITE_BUSY_TIMEOUT (773)
- SQLITE_CANTOPEN_CONVPATH (1038)
- SQLITE_CANTOPEN_DIRTYWAL (1294)
- SQLITE_CANTOPEN_FULLPATH (782)
- SQLITE_CANTOPEN_ISDIR (526)
- SQLITE_CANTOPEN_NOTEMPDIR (270)
- SQLITE_CANTOPEN_SYMLINK (1550)
- SQLITE_CONSTRAINT_CHECK (275)
- SQLITE_CONSTRAINT_COMMITHOOK (531)
- SQLITE_CONSTRAINT_DATATYPE (3091)
- SQLITE_CONSTRAINT_FOREIGNKEY (787)
- SQLITE_CONSTRAINT_FUNCTION (1043)
- SQLITE_CONSTRAINT_NOTNULL (1299)
- SQLITE_CONSTRAINT_PINNED (2835)
- SQLITE_CONSTRAINT_PRIMARYKEY (1555)
- SQLITE_CONSTRAINT_ROWID (2579)
- SQLITE_CONSTRAINT_TRIGGER (1811)
- SQLITE_CONSTRAINT_UNIQUE (2067)
- SQLITE_CONSTRAINT_VTAB (2323)
- SQLITE_CORRUPT_INDEX (779)
- SQLITE_CORRUPT_SEQUENCE (523)
- SQLITE_CORRUPT_VTAB (267)
- SQLITE_ERROR_MISSING_COLLSEQ (257)
- SQLITE_ERROR_RETRY (513)
- SQLITE_ERROR_SNAPSHOT (769)
- SQLITE_IOERR_ACCESS (3338)
- SQLITE_IOERR_AUTH (7178)
- SQLITE_IOERR_BEGIN_ATOMIC (7434)
- SQLITE_IOERR_BLOCKED (2826)
- SQLITE_IOERR_CHECKRESERVEDLOCK (3594)
- SQLITE_IOERR_CLOSE (4106)
- SQLITE_IOERR_COMMIT_ATOMIC (7690)
- SQLITE_IOERR_CONVPATH (6666)
- SQLITE_IOERR_CORRUPTFS (8458)
- SQLITE_IOERR_DATA (8202)
- SQLITE_IOERR_DELETE (2570)
- SQLITE_IOERR_DELETE_NOENT (5898)
- SQLITE_IOERR_DIR_CLOSE (4362)
- SQLITE_IOERR_DIR_FSYNC (1290)
- SQLITE_IOERR_FSTAT (1802)
- SQLITE_IOERR_FSYNC (1034)
- SQLITE_IOERR_GETTEMPPATH (6410)
- SQLITE_IOERR_LOCK (3850)
- SQLITE_IOERR_MMAP (6154)
- SQLITE_IOERR_NOMEM (3082)
- SQLITE_IOERR_RDLOCK (2314)
- SQLITE_IOERR_READ (266)
- SQLITE_IOERR_ROLLBACK_ATOMIC (7946)
- SQLITE_IOERR_SEEK (5642)
- SQLITE_IOERR_SHMLOCK (5130)
- SQLITE_IOERR_SHMMAP (5386)
- SQLITE_IOERR_SHMOPEN (4618)
- SQLITE_IOERR_SHMSIZE (4874)
- SQLITE_IOERR_SHORT_READ (522)
- SQLITE_IOERR_TRUNCATE (1546)
- SQLITE_IOERR_UNLOCK (2058)
- SQLITE_IOERR_VNODE (6922)
- SQLITE_IOERR_WRITE (778)
- SQLITE_LOCKED_SHAREDCACHE (262)
- SQLITE_LOCKED_VTAB (518)
- SQLITE_NOTICE_RECOVER_ROLLBACK (539)
- SQLITE_NOTICE_RECOVER_WAL (283)
- SQLITE_OK_LOAD_PERMANENTLY (256)
- SQLITE_READONLY_CANTINIT (1288)
- SQLITE_READONLY_CANTLOCK (520)
- SQLITE_READONLY_DBMOVED (1032)
- SQLITE_READONLY_DIRECTORY (1544)
- SQLITE_READONLY_RECOVERY (264)
- SQLITE_READONLY_ROLLBACK (776)
- SQLITE_WARNING_AUTOINDEX (284)
6.Значения кода результата
Значения всех 105 значений кода результата показаны ниже в цифровом порядке.
(0) SQLITE_OK
Код результата SQLITE_OK означает,что операция прошла успешно и ошибок не было.Большинство других кодов результатов указывают на ошибку.
(1) SQLITE_ERROR
Код результата SQLITE_ERROR является общим кодом ошибки,который используется,когда нет другого более специфического кода ошибки.
(2) SQLITE_INTERNAL
Код результата SQLITE_INTERNAL указывает на внутреннюю неисправность.В рабочей версии SQLite приложение никогда не должно видеть такой код результата.Если приложение все же столкнется с таким кодом результата,это свидетельствует о наличии ошибки в движке БД.
SQLite в настоящее время не генерирует этот код результата. Однако определяемые приложением функции SQL или виртуальные таблицы , виртуальные файловые системы или другие расширения могут вызывать возврат этого кода результата.
(3) SQLITE_PERM
Код результата SQLITE_PERM указывает на то,что запрашиваемый режим доступа для вновь созданной базы данных не может быть предоставлен.
(4) SQLITE_ABORT
Код результата SQLITE_ABORT указывает, что операция была прервана до завершения, обычно это запрос приложения. См. Также: SQLITE_INTERRUPT .
Если функция обратного вызова sqlite3_exec () возвращает ненулевое значение, тогда sqlite3_exec () вернет SQLITE_ABORT.
Если операция ROLLBACK происходит в том же соединении с базой данных, что и ожидающее чтение или запись, то ожидающее чтение или запись может завершиться ошибкой SQLITE_ABORT или SQLITE_ABORT_ROLLBACK .
Помимо того, что это код результата, значение SQLITE_ABORT также используется в качестве режима разрешения конфликтов, возвращаемого интерфейсом sqlite3_vtab_on_conflict () .
(5) SQLITE_BUSY
Код результата SQLITE_BUSY указывает, что файл базы данных не может быть записан (или в некоторых случаях прочитан) из-за одновременной активности какого-либо другого соединения с базой данных , обычно соединения с базой данных в отдельном процессе.
Например, если процесс A находится в середине большой транзакции записи и в то же время процесс B пытается начать новую транзакцию записи, процесс B вернет результат SQLITE_BUSY, потому что SQLite поддерживает только одну запись за раз. Процессу B нужно будет дождаться, пока процесс A завершит свою транзакцию, прежде чем начинать новую транзакцию. Интерфейсы sqlite3_busy_timeout () и sqlite3_busy_handler () и прагма busy_timeout доступны для процесса B, чтобы помочь ему справиться с ошибками SQLITE_BUSY.
Ошибка SQLITE_BUSY может возникнуть в любой момент транзакции: при первом запуске транзакции, во время любых операций записи или обновления или при фиксации транзакции. Чтобы избежать ошибок SQLITE_BUSY в середине транзакции, приложение может использовать BEGIN IMMEDIATE вместо просто BEGIN для запуска транзакции. Команда BEGIN IMMEDIATE может сама вернуть SQLITE_BUSY, но в случае успеха SQLite гарантирует, что никакие последующие операции с той же базой данных через следующую COMMIT не вернут SQLITE_BUSY.
См. Также: SQLITE_BUSY_RECOVERY и SQLITE_BUSY_SNAPSHOT .
Код результата SQLITE_BUSY отличается от SQLITE_LOCKED тем, что SQLITE_BUSY указывает на конфликт с отдельным соединением с базой данных , вероятно, в отдельном процессе, тогда как SQLITE_LOCKED указывает на конфликт внутри того же соединения с базой данных (или иногда соединения с базой данных с общим кешем ).
(6) SQLITE_LOCKED
Код результата SQLITE_LOCKED указывает, что операция записи не может быть продолжена из-за конфликта внутри того же соединения с базой данных или конфликта с другим соединением с базой данных, которое использует общий кэш .
Например, оператор DROP TABLE не может быть запущен, пока другой поток читает из этой таблицы в том же соединении с базой данных, потому что при удалении таблицы таблица будет удалена из-под одновременного чтения.
Код результата SQLITE_LOCKED отличается от SQLITE_BUSY тем, что SQLITE_LOCKED указывает на конфликт в одном и том же соединении с базой данных (или в соединении с общим кешем ), тогда как SQLITE_BUSY указывает на конфликт с другим соединением с базой данных, возможно, в другом процессе.
(7) SQLITE_NOMEM
Код результата SQLITE_NOMEM указывает, что SQLite не смог выделить всю память, необходимую для завершения операции. Другими словами, внутренний вызов sqlite3_malloc () или sqlite3_realloc () завершился неудачно в случае, когда выделенная память требовалась для продолжения операции.
(8) SQLITE_READONLY
Код результата SQLITE_READONLY возвращается при попытке изменить некоторые данные,на которые текущее подключение к БД не имеет права записи.
(9) SQLITE_INTERRUPT
Код результата SQLITE_INTERRUPT указывает, что операция была прервана интерфейсом sqlite3_interrupt () . См. Также: SQLITE_ABORT
(10) SQLITE_IOERR
Код результата SQLITE_IOERR говорит,что операция не может быть завершена,так как операционная система сообщает об ошибке ввода/вывода.
Полный диск обычно дает ошибку SQLITE_FULL, а не ошибку SQLITE_IOERR.
Существует много различных расширенных кодов результатов для ошибок ввода/вывода,которые идентифицируют конкретную операцию ввода/вывода,которая не удалась.
(11) SQLITE_CORRUPT
Код результата SQLITE_CORRUPT указывает на то, что файл базы данных поврежден. См. Как повредить файлы базы данных для дальнейшего обсуждения того, как может произойти повреждение.
(12) SQLITE_NOTFOUND
Код результата SQLITE_NOTFOUND раскрывается тремя способами:
-
SQLITE_NOTFOUND может быть возвращен интерфейсом sqlite3_file_control() , чтобы указать, что код операции управления файлом, переданный в качестве третьего аргумента, не был распознан базовой VFS .
-
SQLITE_NOTFOUND также может быть возвращен методом xSetSystemCall() объекта sqlite3_vfs .
-
SQLITE_NOTFOUND возвращается функцией sqlite3_vtab_rhs_value() , чтобы указать, что правый операнд ограничения недоступен для метода xBestIndex , выполнившего вызов.
Код результата SQLITE_NOTFOUND также используется внутри реализации SQLite,но эти внутренние использования не подвержены приложению.
(13) SQLITE_FULL
Код результата SQLITE_FULL указывает, что запись не может быть завершена из-за переполнения диска. Обратите внимание, что эта ошибка может возникнуть при попытке записать информацию в основной файл базы данных или при записи во временные файлы на диске .
Иногда приложения сталкиваются с этой ошибкой, даже если первичного дискового пространства много, потому что ошибка возникает при записи во временные файлы на диске в системе, где временные файлы хранятся в отдельном разделе с гораздо меньшим пространством, чем на основном диске.
(14) SQLITE_CANTOPEN
Код результата SQLITE_CANTOPEN указывает, что SQLite не удалось открыть файл. Рассматриваемый файл может быть основным файлом базы данных или одним из нескольких временных файлов на диске .
(15) SQLITE_PROTOCOL
Код результата SQLITE_PROTOCOL указывает на проблему с протоколом блокировки файлов, используемым SQLite. Ошибка SQLITE_PROTOCOL в настоящее время возвращается только при использовании режима WAL и попытке начать новую транзакцию. Когда два отдельных соединения с базой данных одновременно пытаются запустить транзакцию в режиме WAL, возникает состояние гонки . Проигравший в гонке отступает и пытается снова после небольшой задержки. Если одно и то же соединение десятки раз проигрывает в гонке блокировок в течение нескольких секунд, оно в конечном итоге завершится и вернет SQLITE_PROTOCOL. Ошибка SQLITE_PROTOCOL должна появляться на практике очень, очень редко и только тогда, когда существует множество отдельных процессов, все из которых активно конкурируют за запись в одну и ту же базу данных.
(16) SQLITE_EMPTY
В настоящее время код результата SQLITE_EMPTY не используется.
(17) SQLITE_SCHEMA
Код результата SQLITE_SCHEMA указывает, что схема базы данных изменилась. Этот код результата может быть возвращен из sqlite3_step () для подготовленного оператора, который был сгенерирован с помощью sqlite3_prepare () или sqlite3_prepare16 () . Если схема базы данных была изменена каким-то другим процессом между временем подготовки оператора и временем его выполнения, может возникнуть эта ошибка.
Если подготовленный оператор генерируется из sqlite3_prepare_v2() , то он автоматически повторно подготавливается при изменении схемы до SQLITE_MAX_SCHEMA_RETRY раз (по умолчанию: 50). Интерфейс sqlite3_step() вернет SQLITE_SCHEMA обратно в приложение только в том случае, если сбой сохраняется после этих многочисленных попыток.
(18) SQLITE_TOOBIG
Код ошибки SQLITE_TOOBIG указывает, что строка или большой двоичный объект слишком велики. По умолчанию максимальная длина строки или большого двоичного объекта в SQLite составляет 1 000 000 000 байт. Эту максимальную длину можно изменить во время компиляции с помощью параметра времени компиляции SQLITE_MAX_LENGTH или во время выполнения с помощью интерфейса sqlite3_limit (db, SQLITE_LIMIT_LENGTH , …). Ошибка SQLITE_TOOBIG возникает, когда SQLite встречает строку или большой двоичный объект, превышающий предел времени компиляции или времени выполнения.
Код ошибки SQLITE_TOOBIG также может появиться, когда оператор SQL слишком большого размера передается в один из интерфейсов sqlite3_prepare_v2() . Максимальная длина оператора SQL по умолчанию составляет гораздо меньшее значение, равное 1 000 000 000 байт. Максимальная длина оператора SQL может быть установлена во время компиляции с помощью SQLITE_MAX_SQL_LENGTH или во время выполнения с помощью sqlite3_limit (db, SQLITE_LIMIT_SQL_LENGTH ,…).
(19) SQLITE_CONSTRAINT
Код ошибки SQLITE_CONSTRAINT означает, что при попытке обработать оператор SQL произошло нарушение ограничения SQL. Дополнительную информацию о неудавшемся ограничении можно найти, просмотрев сопроводительное сообщение об ошибке (возвращаемое через sqlite3_errmsg () или sqlite3_errmsg16 () ) или просмотрев расширенный код ошибки .
Код SQLITE_CONSTRAINT также можно использовать в качестве возвращаемого значения из метода xBestIndex() реализации виртуальной таблицы . Когда xBestIndex() возвращает SQLITE_CONSTRAINT, это указывает на то, что конкретная комбинация входных данных, отправленных в xBestIndex(), не может привести к пригодному для использования плану запроса и не должна подвергаться дальнейшему рассмотрению.
(20) SQLITE_MISMATCH
Код ошибки SQLITE_MISMATCH указывает на несовпадение типа данных.
SQLite,как правило,очень забывает о несоответствиях между типом значения и объявленным типом контейнера,в котором это значение должно храниться.Например,SQLite позволяет приложению хранить большой BLOB в столбце с объявленным типом BOOLEAN.Но в некоторых случаях SQLite строго относится к типам.Ошибка SQLITE_MISMATCH возвращается в тех немногих случаях,когда типы не совпадают.
Идентификатор строки таблицы должен быть целым числом. Попытка установить для rowid значение, отличное от целого (или NULL, которое будет автоматически преобразовано в следующий доступный целочисленный rowid), приводит к ошибке SQLITE_MISMATCH.
(21) SQLITE_MISUSE
Код возврата SQLITE_MISUSE может быть возвращен, если приложение использует какой-либо интерфейс SQLite способом, который не определен или не поддерживается. Например, использование подготовленного оператора после того, как этот подготовленный оператор был завершен, может привести к ошибке SQLITE_MISUSE.
SQLite пытается обнаружить злоупотребление и сообщить о нем,используя данный код результата.Однако,нет никакой гарантии,что обнаружение неправильного использования будет успешным.Обнаружение неправильного использования является вероятностным.Приложения никогда не должны зависеть от возвращаемого значения SQLITE_MISUSE.
Если SQLite когда-либо возвращал SQLITE_MISUSE из любого интерфейса,это означает,что приложение некорректно закодировано и нуждается в исправлении.Не поставляйте приложение,которое иногда возвращает SQLITE_MISUSE из стандартного интерфейса SQLite,потому что это приложение содержит потенциально серьезные ошибки.
(22) SQLITE_NOLFS
Ошибка SQLITE_NOLFS может быть возвращена на системах,которые не поддерживают большие файлы,когда база данных становится больше,чем та,с которой может справиться файловая система.»NOLFS» означает «NO Large File Support».
(23) SQLITE_AUTH
Ошибка SQLITE_AUTH возвращается, когда обратный вызов авторизатора указывает, что подготавливаемый оператор SQL не авторизован.
(24) SQLITE_FORMAT
Код ошибки SQLITE_FORMAT в настоящее время не используется SQLite.
(25) SQLITE_RANGE
Ошибка SQLITE_RANGE указывает на то, что аргумент номера параметра для одной из подпрограмм sqlite3_bind или номер столбца в одной из подпрограмм sqlite3_column находится вне допустимого диапазона.
(26) SQLITE_NOTADB
При попытке открыть файл ошибка SQLITE_NOTADB указывает на то,что открываемый файл не является файлом базы данных SQLite.
(27) SQLITE_NOTICE
Код результата SQLITE_NOTICE не возвращается ни одним интерфейсом C / C ++. Однако SQLITE_NOTICE (или, скорее, один из его расширенных кодов ошибок ) иногда используется в качестве первого аргумента в обратном вызове sqlite3_log (), чтобы указать, что происходит необычная операция.
(28) SQLITE_WARNING
Код результата SQLITE_WARNING не возвращается ни одним интерфейсом C / C ++. Однако SQLITE_WARNING (или, скорее, один из его расширенных кодов ошибок ) иногда используется в качестве первого аргумента в обратном вызове sqlite3_log (), чтобы указать, что имеет место необычная и, возможно, непродуманная операция.
(100) SQLITE_ROW
Код результата SQLITE_ROW, возвращаемый sqlite3_step (), указывает, что доступна другая строка вывода.
(101) SQLITE_DONE
Код результата SQLITE_DONE указывает, что операция завершена. Код результата SQLITE_DONE чаще всего рассматривается как возвращаемое значение от sqlite3_step (), указывающее, что оператор SQL выполнен до конца. Но SQLITE_DONE также может возвращаться другими многоступенчатыми интерфейсами, такими как sqlite3_backup_step () .
(256) SQLITE_OK_LOAD_PERMANENTLY
Интерфейс sqlite3_load_extension () загружает расширение в одно соединение с базой данных. По умолчанию это расширение автоматически выгружается при закрытии соединения с базой данных. Однако, если точка входа расширения возвращает SQLITE_OK_LOAD_PERMANENTLY вместо SQLITE_OK, тогда расширение остается загруженным в адресное пространство процесса после закрытия соединения с базой данных. Другими словами, методы xDlClose объекта sqlite3_vfs не вызываются для расширения при закрытии соединения с базой данных.
Код возврата SQLITE_OK_LOAD_PERMANENTLY полезен, например, для загружаемых расширений, которые регистрируют новые VFS .
(257) SQLITE_ERROR_MISSING_COLLSEQ
Код результата SQLITE_ERROR_MISSING_COLLSEQ означает,что SQL-оператор не может быть подготовлен из-за того,что не может быть найдена коллекционная последовательность,названная в этом SQL-операторе.
Иногда, когда встречается этот код ошибки, процедура sqlite3_prepare_v2 () преобразует ошибку в SQLITE_ERROR_RETRY и снова пытается подготовить оператор SQL, используя другой план запроса, который не требует использования неизвестной последовательности сортировки.
(261) SQLITE_BUSY_RECOVERY
Код ошибки SQLITE_BUSY_RECOVERY — это расширенный код ошибки для SQLITE_BUSY, который указывает, что операция не может быть продолжена, поскольку другой процесс занят восстановлением файла базы данных в режиме WAL после сбоя. Код ошибки SQLITE_BUSY_RECOVERY возникает только в базах данных в режиме WAL .
(262) SQLITE_LOCKED_SHAREDCACHE
Код результата SQLITE_LOCKED_SHAREDCACHE указывает, что доступ к записи данных SQLite заблокирован другим соединением с базой данных, которое использует ту же запись в режиме общего кэша . Когда два или более соединения с базой данных используют один и тот же кеш, и одно из соединений находится в процессе изменения записи в этом кэше, тогда другим соединениям блокируется доступ к этим данным, пока изменения продолжаются, чтобы предотвратить доступ читателей. увидеть поврежденное или частично завершенное изменение.
(264) SQLITE_READONLY_RECOVERY
Код ошибки SQLITE_READONLY_RECOVERY — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_RECOVERY указывает, что база данных в режиме WAL не может быть открыта, потому что файл базы данных необходимо восстановить, а для восстановления требуется доступ для записи, но доступен только доступ для чтения.
(266) SQLITE_IOERR_READ
Код ошибки SQLITE_IOERR_READ — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке чтения из файла на диске. Эта ошибка может возникнуть из-за неисправности оборудования или из-за того, что файловая система была отключена, пока файл был открыт.
(267) SQLITE_CORRUPT_VTAB
Код ошибки SQLITE_CORRUPT_VTAB — это расширенный код ошибки для SQLITE_CORRUPT, используемый виртуальными таблицами . Виртуальная таблица может вернуться SQLITE_CORRUPT_VTAB , чтобы указать , что содержание в виртуальной таблице повреждено.
(270) SQLITE_CANTOPEN_NOTEMPDIR
Код ошибки SQLITE_CANTOPEN_NOTEMPDIR больше не используется.
(275) SQLITE_CONSTRAINT_CHECK
Код ошибки SQLITE_CONSTRAINT_CHECK — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения CHECK .
(279) SQLITE_AUTH_USER
Код ошибки SQLITE_AUTH_USER — это расширенный код ошибки для SQLITE_AUTH , указывающий, что была предпринята операция в базе данных, для которой вошедший в систему пользователь не имеет достаточной авторизации.
(283) SQLITE_NOTICE_RECOVER_WAL
Код результата SQLITE_NOTICE_RECOVER_WAL передается в обратный вызов sqlite3_log () при восстановлении файла базы данных в режиме WAL .
(284) SQLITE_WARNING_AUTOINDEX
Код результата SQLITE_WARNING_AUTOINDEX передается в обратный вызов sqlite3_log () всякий раз, когда используется автоматическое индексирование . Это может служить предупреждением для разработчиков приложений о том, что для базы данных могут быть полезны дополнительные индексы.
(513) SQLITE_ERROR_RETRY
SQLITE_ERROR_RETRY используется внутренне, чтобы спровоцировать sqlite3_prepare_v2 () (или одну из его родственных подпрограмм для создания подготовленных операторов) на повторную попытку подготовить оператор, который завершился неудачно с ошибкой при предыдущей попытке.
(516) SQLITE_ABORT_ROLLBACK
Код ошибки SQLITE_ABORT_ROLLBACK — это расширенный код ошибки для SQLITE_ABORT, указывающий на то, что выполнение инструкции SQL было прервано из- за отката транзакции, которая была активной при первом запуске инструкции SQL. При откате отложенные операции записи всегда завершаются сбоем с этой ошибкой. ОТКАТА вызовет отложенное чтение не выполняется операция , только если схема была изменена в пределах сделки будет произведен откатом.
(517) SQLITE_BUSY_SNAPSHOT
Код ошибки SQLITE_BUSY_SNAPSHOT — это расширенный код ошибки для SQLITE_BUSY, который возникает в базах данных в режиме WAL, когда соединение с базой данных пытается преобразовать транзакцию чтения в транзакцию записи, но обнаруживает, что другое соединение с базой данных уже записано в базу данных и, таким образом, делает недействительными предыдущие чтения.
Следующий сценарий иллюстрирует,как может возникнуть ошибка SQLITE_BUSY_SNAPSHOT:
- Процесс A запускает прочитанную транзакцию по базе данных и выполняет один или несколько SELECT-запросов.Процесс A держит транзакцию открытой.
- Процесс B обновляет базу данных,изменяя значения,ранее прочитанные процессом A.
- Процесс A теперь пытается записать в базу данных.Но представление процесса A о содержимом базы данных теперь устарело,потому что процесс B изменил файл базы данных после того,как процесс A прочитал из него.Поэтому процесс A получает ошибку SQLITE_BUSY_SNAPSHOT.
(518) SQLITE_LOCKED_VTAB
Код результата SQLITE_LOCKED_VTAB не используется ядром SQLite,но доступен для использования расширениями.Реализации виртуальных таблиц могут возвращать этот код результата,чтобы показать,что они не могут завершить текущую операцию из-за блокировок,удерживаемых другими потоками или процессами.
Расширение R-Tree возвращает этот код результата, когда делается попытка обновить R-Tree, когда другой подготовленный оператор активно читает R-Tree. Обновление не может быть продолжено, потому что любое изменение R-дерева может включать перестановку и перебалансировку узлов, что нарушит работу курсоров чтения, в результате чего некоторые строки будут повторяться, а другие строки будут пропущены.
(520) SQLITE_READONLY_CANTLOCK
Код ошибки SQLITE_READONLY_CANTLOCK — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_CANTLOCK указывает, что SQLite не может получить блокировку чтения для базы данных в режиме WAL, поскольку файл с общей памятью, связанный с этой базой данных, доступен только для чтения.
(522) SQLITE_IOERR_SHORT_READ
Код ошибки SQLITE_IOERR_SHORT_READ — это расширенный код ошибки для SQLITE_IOERR, указывающий, что при попытке чтения на уровне VFS не удалось получить столько байтов, сколько было запрошено. Это могло произойти из-за обрезанного файла.
(523) SQLITE_CORRUPT_SEQUENCE
Код результата SQLITE_CORRUPT_SEQUENCE означает, что схема таблицы sqlite_sequence повреждена. Таблица sqlite_sequence используется для помощи в реализации функции AUTOINCREMENT . Таблица sqlite_sequence должна иметь следующий формат:
CREATE TABLE sqlite_sequence(name,seq);
Если SQLite обнаруживает,что таблица sqlite_sequence имеет другой формат,он возвращает ошибку SQLITE_CORRUPT_SEQUENCE.
(526) SQLITE_CANTOPEN_ISDIR
Код ошибки SQLITE_CANTOPEN_ISDIR — это расширенный код ошибки для SQLITE_CANTOPEN, указывающий, что операция открытия файла не удалась, поскольку файл действительно является каталогом.
(531) SQLITE_CONSTRAINT_COMMITHOOK
Код ошибки SQLITE_CONSTRAINT_COMMITHOOK — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что обратный вызов ловушки фиксации вернул ненулевое значение, что, таким образом, вызвало откат оператора SQL.
(539) SQLITE_NOTICE_RECOVER_ROLLBACK
Код результата SQLITE_NOTICE_RECOVER_ROLLBACK передается в обратный вызов sqlite3_log () при откате горячего журнала .
(769) SQLITE_ERROR_SNAPSHOT
Код результата SQLITE_ERROR_SNAPSHOT может быть возвращен при попытке начать транзакцию чтения в исторической версии базы данных с помощью интерфейса sqlite3_snapshot_open() . Если исторический моментальный снимок больше недоступен, транзакция чтения завершится с ошибкой SQLITE_ERROR_SNAPSHOT. Этот код ошибки возможен только в том случае, если SQLite скомпилирован с параметром -DSQLITE_ENABLE_SNAPSHOT .
(773) SQLITE_BUSY_TIMEOUT
Код ошибки SQLITE_BUSY_TIMEOUT указывает на то,что запрос блокировки Posix advisory file lock на уровне VFS не прошел из-за таймаута.Блокирующие консультативные блокировки Posix доступны только как собственное расширение SQLite,и даже тогда они поддерживаются только в том случае,если SQLite скомпилирован с опцией времени компиляции SQLITE_EANBLE_SETLK_TIMEOUT.
(776) SQLITE_READONLY_ROLLBACK
Код ошибки SQLITE_READONLY_ROLLBACK — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_ROLLBACK указывает на то, что базу данных нельзя открыть, потому что у нее есть горячий журнал, который необходимо откатить, но не может, потому что база данных доступна только для чтения.
(778) SQLITE_IOERR_WRITE
Код ошибки SQLITE_IOERR_WRITE — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке записи в файл на диске. Эта ошибка может возникнуть из-за неисправности оборудования или из-за того, что файловая система была отключена, пока файл был открыт. Эта ошибка не должна возникать, если файловая система заполнена, поскольку для этой цели существует отдельный код ошибки (SQLITE_FULL).
(779) SQLITE_CORRUPT_INDEX
Код результата SQLITE_CORRUPT_INDEX означает, что SQLite обнаружил, что запись отсутствует или отсутствует в индексе. Это особый случай кода ошибки SQLITE_CORRUPT, который предполагает, что проблема может быть решена с помощью команды REINDEX , при условии, что в другом месте файла базы данных нет других проблем.
(782) SQLITE_CANTOPEN_FULLPATH
Код ошибки SQLITE_CANTOPEN_FULLPATH — это расширенный код ошибки для SQLITE_CANTOPEN, указывающий на то, что операция открытия файла не удалась, поскольку операционная система не смогла преобразовать имя файла в полный путь.
(787) SQLITE_CONSTRAINT_FOREIGNKEY
Код ошибки SQLITE_CONSTRAINT_FOREIGNKEY — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения внешнего ключа .
(1032) SQLITE_READONLY_DBMOVED
Код ошибки SQLITE_READONLY_DBMOVED — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_DBMOVED указывает, что база данных не может быть изменена, потому что файл базы данных был перемещен с момента его открытия, и поэтому любая попытка изменения базы данных может привести к повреждению базы данных, если процессы выйдут из строя из-за неправильного имени журнала отката .
(1034) SQLITE_IOERR_FSYNC
Код ошибки SQLITE_IOERR_FSYNC — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке сбросить ранее записанный контент из буферов ОС и / или управления диском в постоянное хранилище. Другими словами, этот код указывает на проблему с системным вызовом fsync () в unix или системным вызовом FlushFileBuffers () в Windows.
(1038) SQLITE_CANTOPEN_CONVPATH
Код ошибки SQLITE_CANTOPEN_CONVPATH — это расширенный код ошибки для SQLITE_CANTOPEN, используемый только Cygwin VFS и указывающий на то, что системный вызов cygwin_conv_path () завершился неудачно при попытке открыть файл. См. Также: SQLITE_IOERR_CONVPATH
(1043) SQLITE_CONSTRAINT_FUNCTION
Код ошибки SQLITE_CONSTRAINT_FUNCTION в настоящее время не используется ядром SQLite.Однако этот код ошибки доступен для использования функциями расширения.
(1288) SQLITE_READONLY_CANTINIT
Код результата SQLITE_READONLY_CANTINIT берет начало в методе xShmMap VFS, чтобы указать, что область разделяемой памяти, используемая режимом WAL, существует, но ее содержимое ненадежно и непригодно для использования текущим процессом, поскольку текущий процесс не имеет разрешения на запись в область разделяемой памяти. (Область общей памяти для режима WAL обычно представляет собой файл с суффиксом «-wal», который отображается в пространстве процесса. Если текущий процесс не имеет разрешения на запись в этот файл, он не может записывать в общую память.)
Логика более высокого уровня внутри SQLite,как правило,перехватывает код ошибки и создает временную область общей памяти in-memory,так что текущий процесс может,по крайней мере,читать содержимое базы данных.Этот код результата не должен доходить до уровня интерфейса приложения.
(1290) SQLITE_IOERR_DIR_FSYNC
Код ошибки SQLITE_IOERR_DIR_FSYNC — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке вызвать fsync () в каталоге. Unix VFS пытается открыть каталоги fsync () после создания или удаления определенных файлов, чтобы гарантировать, что эти файлы по-прежнему будут отображаться в файловой системе после отключения питания или сбоя системы. Этот код ошибки указывает на проблему при попытке выполнить эту fsync ().
(1294) SQLITE_CANTOPEN_DIRTYWAL
В настоящее время код результата SQLITE_CANTOPEN_DIRTYWAL не используется.
(1299) SQLITE_CONSTRAINT_NOTNULL
Код ошибки SQLITE_CONSTRAINT_NOTNULL — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения NOT NULL .
(1544) SQLITE_READONLY_DIRECTORY
Код результата SQLITE_READONLY_DIRECTORY указывает на то,что БД доступна только для чтения,так как процесс не имеет права создавать файл журнала в том же каталоге,что и БД,и создание файла журнала является обязательным условием для записи.
(1546) SQLITE_IOERR_TRUNCATE
Код ошибки SQLITE_IOERR_TRUNCATE — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке усечь файл до меньшего размера.
(1550) SQLITE_CANTOPEN_SYMLINK
Код результата SQLITE_CANTOPEN_SYMLINK возвращается интерфейсом sqlite3_open () и его родственниками, когда используется флаг SQLITE_OPEN_NOFOLLOW и файл базы данных является символической ссылкой.
(1555) SQLITE_CONSTRAINT_PRIMARYKEY
Код ошибки SQLITE_CONSTRAINT_PRIMARYKEY — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения PRIMARY KEY .
(1802) SQLITE_IOERR_FSTAT
Код ошибки SQLITE_IOERR_FSTAT — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке вызвать fstat () (или эквивалент) для файла, чтобы определить такую информацию, как размер файла или права доступа.
(1811) SQLITE_CONSTRAINT_TRIGGER
Код ошибки SQLITE_CONSTRAINT_TRIGGER — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что сработала функция RAISE в триггере , в результате чего оператор SQL был прерван.
(2058) SQLITE_IOERR_UNLOCK
Код ошибки SQLITE_IOERR_UNLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xUnlock объекта sqlite3_io_methods .
(2067) SQLITE_CONSTRAINT_UNIQUE
Код ошибки SQLITE_CONSTRAINT_UNIQUE — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения UNIQUE .
(2314) SQLITE_IOERR_RDLOCK
Код ошибки SQLITE_IOERR_UNLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xLock объекта sqlite3_io_methods при попытке получить блокировку чтения.
(2323) SQLITE_CONSTRAINT_VTAB
Код ошибки SQLITE_CONSTRAINT_VTAB в настоящее время не используется ядром SQLite. Однако этот код ошибки доступен для использования виртуальными таблицами, определяемыми приложением .
(2570) SQLITE_IOERR_DELETE
Код ошибки SQLITE_IOERR_UNLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xDelete объекта sqlite3_vfs .
(2579) SQLITE_CONSTRAINT_ROWID
Код ошибки SQLITE_CONSTRAINT_ROWID — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что идентификатор строки не является уникальным.
(2826) SQLITE_IOERR_BLOCKED
Код ошибки SQLITE_IOERR_BLOCKED больше не используется.
(2835) SQLITE_CONSTRAINT_PINNED
Код ошибки SQLITE_CONSTRAINT_PINNED — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что попытка триггера UPDATE удаляет строку, которая обновлялась в середине обновления.
(3082) SQLITE_IOERR_NOMEM
Код ошибки SQLITE_IOERR_NOMEM иногда возвращается уровнем VFS, чтобы указать, что операция не может быть завершена из-за невозможности выделить достаточно памяти. Этот код ошибки обычно преобразуется в SQLITE_NOMEM более высокими уровнями SQLite перед возвратом в приложение.
(3091) SQLITE_CONSTRAINT_DATATYPE
Код ошибки SQLITE_CONSTRAINT_DATATYPE — это расширенный код ошибки для SQLITE_CONSTRAINT , указывающий на попытку вставки или обновления сохранить значение, несовместимое с объявленным типом столбца в таблице, определенной как STRICT.
(3338) SQLITE_IOERR_ACCESS
Код ошибки SQLITE_IOERR_ACCESS — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xAccess объекта sqlite3_vfs .
(3594) SQLITE_IOERR_CHECKRESERVEDLOCK
Код ошибки SQLITE_IOERR_CHECKRESERVEDLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xCheckReservedLock в объекте sqlite3_io_methods .
(3850) SQLITE_IOERR_LOCK
Код ошибки SQLITE_IOERR_LOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в логике блокировки рекомендательного файла. Обычно ошибка SQLITE_IOERR_LOCK указывает на проблему с получением блокировки PENDING . Однако он также может указывать на различные ошибки блокировки на некоторых специализированных VFS, используемых на компьютерах Mac.
(4106) SQLITE_IOERR_CLOSE
Код ошибки SQLITE_IOERR_ACCESS — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xClose объекта sqlite3_io_methods .
(4362) SQLITE_IOERR_DIR_CLOSE
Код ошибки SQLITE_IOERR_DIR_CLOSE больше не используется.
(4618) SQLITE_IOERR_SHMOPEN
Код ошибки SQLITE_IOERR_SHMOPEN — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xShmMap объекта sqlite3_io_methods при попытке открыть новый сегмент разделяемой памяти.
(4874) SQLITE_IOERR_SHMSIZE
Код ошибки SQLITE_IOERR_SHMSIZE — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xShmMap в объекте sqlite3_io_methods при попытке увеличить файл «shm» как часть обработки транзакции в режиме WAL . Эта ошибка может указывать на то, что на томе базовой файловой системы не хватает места.
(5130) SQLITE_IOERR_SHMLOCK
Код ошибки SQLITE_IOERR_SHMLOCK больше не используется.
(5386) SQLITE_IOERR_SHMMAP
Код ошибки SQLITE_IOERR_SHMMAP — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xShmMap объекта sqlite3_io_methods при попытке сопоставить сегмент общей памяти в адресное пространство процесса.
(5642) SQLITE_IOERR_SEEK
Код ошибки SQLITE_IOERR_SEEK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методах xRead или xWrite в объекте sqlite3_io_methods при попытке поиска файлового дескриптора до начальной точки файла, где должно произойти чтение или запись.
(5898) SQLITE_IOERR_DELETE_NOENT
Код ошибки SQLITE_IOERR_DELETE_NOENT — это расширенный код ошибки для SQLITE_IOERR, указывающий, что метод xDelete объекта sqlite3_vfs завершился неудачно, поскольку удаляемый файл не существует.
(6154) SQLITE_IOERR_MMAP
Код ошибки SQLITE_IOERR_MMAP — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методах xFetch или xUnfetch объекта sqlite3_io_methods при попытке сопоставить или отменить сопоставление части файла базы данных в адресное пространство процесса.
(6410) SQLITE_IOERR_GETTEMPPATH
Код ошибки SQLITE_IOERR_GETTEMPPATH — это расширенный код ошибки для SQLITE_IOERR, указывающий, что VFS не может определить подходящий каталог для размещения временных файлов.
(6666) SQLITE_IOERR_CONVPATH
Код ошибки SQLITE_IOERR_CONVPATH — это расширенный код ошибки для SQLITE_IOERR, который используется только Cygwin VFS и указывает на сбой системного вызова cygwin_conv_path (). См. Также: SQLITE_CANTOPEN_CONVPATH
(6922) SQLITE_IOERR_VNODE
Код ошибки SQLITE_IOERR_VNODE-это код,зарезервированный для использования расширениями.Он не используется ядром SQLite.
(7178) SQLITE_IOERR_AUTH
Код ошибки SQLITE_IOERR_AUTH-это код,зарезервированный для использования расширениями.Он не используется ядром SQLite.
(7434) SQLITE_IOERR_BEGIN_ATOMIC
Код ошибки SQLITE_IOERR_BEGIN_ATOMIC указывает на то, что базовая операционная система сообщила об ошибке в элементе управления файлами SQLITE_FCNTL_BEGIN_ATOMIC_WRITE . Это происходит только тогда, когда SQLITE_ENABLE_ATOMIC_WRITE включен и база данных размещена в файловой системе, которая поддерживает атомарную запись.
(7690) SQLITE_IOERR_COMMIT_ATOMIC
Код ошибки SQLITE_IOERR_COMMIT_ATOMIC указывает на то, что базовая операционная система сообщила об ошибке в элементе управления файлами SQLITE_FCNTL_COMMIT_ATOMIC_WRITE . Это происходит только тогда, когда SQLITE_ENABLE_ATOMIC_WRITE включен и база данных размещена в файловой системе, которая поддерживает атомарную запись.
(7946) SQLITE_IOERR_ROLLBACK_ATOMIC
Код ошибки SQLITE_IOERR_ROLLBACK_ATOMIC указывает на то, что базовая операционная система сообщила об ошибке в элементе управления файлами SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE . Это происходит только тогда, когда SQLITE_ENABLE_ATOMIC_WRITE включен и база данных размещена в файловой системе, которая поддерживает атомарную запись.
(8202) SQLITE_IOERR_DATA
Код ошибки SQLITE_IOERR_DATA — это расширенный код ошибки для SQLITE_IOERR, используемый только прокладкой контрольной суммы VFS, чтобы указать, что контрольная сумма на странице файла базы данных неверна.
(8458) SQLITE_IOERR_CORRUPTFS
Код ошибки SQLITE_IOERR_CORRUPTFS — это расширенный код ошибки для SQLITE_IOERR, используемый только VFS для указания того, что сбой поиска или чтения произошел из-за того, что запрос не попадает в границы файла, а не из-за обычного сбоя устройства. Это часто указывает на поврежденную файловую систему.
SQLite
3.40
-
Причуды,пещеры и ловушки в SQLite.
Язык SQL является «стандартным».
-
Расширение RBU
Расширение RBU-это надстройка для SQLite,предназначенная для использования с большими файлами баз данных маломощных устройств на границе сети.
-
Rowid Tables
«Таблица rowid» — это любая в схеме SQLite, которую таблицы Rowid отличают тем, что все они используют уникальное, ненулевое, подписанное 64-битное целое число.
-
Row Values
«Значение» — это одиночное число, строка, BLOB или NULL.
Python uses exceptions
to indicate an error has
happened. The SQLite library uses integer error codes. APSW maps between the two
systems as needed. Exceptions raised in Python code called by SQLite
will have that exception present when control returns to Python, and
SQLite will understand that an error occurred.
Unraisable¶
There are a few places where it is not possible for a Python exception
to be reported to SQLite as an error, typically because SQLite does
not allow an error to be signalled in that context. Another example
would be in VFS code, because SQLite takes actions to
recover from errors (eg it may try to rollback a transaction on a
write error). Python wants to return to callers, not continue
execution while the exception is pending. (Also only one exception
can be active at a time.)
Unraisable exceptions in VFS code are handled by calling
VFS.excepthook()
or VFSFile.excepthook()
(more info). In other code sys.unraisablehook is
called, and if that is not present then sys.excepthook is
called.
sqlite3_log is also called
so that you will have the context of when the exception happened
relative to the errors SQLite is logging.
Exception Classes¶
- exception Error¶
-
This is the base for APSW exceptions.
- Error.result¶
-
For exceptions corresponding to SQLite error codes codes this attribute
is the numeric error code.
- Error.extendedresult¶
-
APSW runs with extended result codes turned on.
This attribute includes the detailed code.
- Error.error_offset¶
-
The location of the error in the SQL when encoded in UTF-8.
The value is from sqlite3_error_offset.
As an example, if SQLite issued a read request and the system returned
less data than expected then result
would have the value
SQLITE_IOERR while extendedresult
would have
the value SQLITE_IOERR_SHORT_READ.
APSW specific exceptions¶
The following exceptions happen when APSW detects various problems.
- exception ThreadingViolationError¶
-
You have used an object concurrently in two threads. For example you
may try to use the same cursor in two different threads at the same
time, or tried to close the same connection in two threads at the
same time.You can also get this exception by using a cursor as an argument to
itself (eg as the input data forCursor.executemany()
).
Cursors can only be used for one thing at a time.
- exception ForkingViolationError¶
-
See
apsw.fork_checker()
.
- exception IncompleteExecutionError¶
-
You have tried to start a new SQL execute call before executing all
the previous ones. See the execution model
for more details.
- exception ConnectionNotClosedError¶
-
This exception is no longer generated. It was required in earlier
releases due to constraints in threading usage with SQLite.
- exception ConnectionClosedError¶
-
You have called
Connection.close()
and then continued to use
theConnection
or associatedcursors
.
- exception CursorClosedError¶
-
You have called
Cursor.close()
and then tried to use the cursor.
- exception BindingsError¶
-
There are several causes for this exception. When using tuples, an incorrect number of bindings where supplied:
cursor.execute("select ?,?,?", (1,2)) # too few bindings cursor.execute("select ?,?,?", (1,2,3,4)) # too many bindings
You are using named bindings, but not all bindings are named. You should either use entirely the
named style or entirely numeric (unnamed) style:cursor.execute("select * from foo where x=:name and y=?")
Note
It is not considered an error to have missing keys in a dictionary. For example this is perfectly valid:
cursor.execute("insert into foo values($a,:b,$c)", {'a': 1})
b and c are not in the dict. For missing keys, None/NULL
will be used. This is so you don’t have to add lots of spurious
values to the supplied dict. If your schema requires every column
have a value, then SQLite will generate an error due to some
values being None/NULL so that case will be caught.
- exception ExecutionCompleteError¶
-
A statement is complete but you try to run it more anyway!
- exception ExecTraceAbort¶
-
The execution tracer returned False so
execution was aborted.
- exception ExtensionLoadingError¶
-
An error happened loading an extension.
- exception VFSNotImplementedError¶
-
A call cannot be made to an inherited Virtual File System (VFS) method as the VFS
does not implement the method.
- exception VFSFileClosedError¶
-
The VFS file is closed so the operation cannot be performed.
SQLite Exceptions¶
The following lists which Exception classes correspond to which SQLite
error codes.
General Errors¶
- exception SQLError¶
-
SQLITE_ERROR. This error is documented as a bad SQL query
or missing database, but is also returned for a lot of other
situations. It is the default error code unless there is a more
specific one.
- exception MismatchError¶
-
SQLITE_MISMATCH. Data type mismatch. For example a rowid
or integer primary key must be an integer.
- exception NotFoundError¶
-
SQLITE_NOTFOUND. Returned when various internal items were
not found such as requests for non-existent system calls or file
controls.
Internal Errors¶
- exception InternalError¶
-
SQLITE_INTERNAL. (No longer used) Internal logic error in SQLite.
- exception ProtocolError¶
-
SQLITE_PROTOCOL. (No longer used) Database lock protocol error.
- exception MisuseError¶
-
SQLITE_MISUSE. SQLite library used incorrectly — typically similar to ValueError in Python. Examples include not
having enough flags when opening a connection (eg not including a READ or WRITE flag), or out of spec such as registering
a function with more than 127 parameters.
- exception RangeError¶
-
SQLITE_RANGE. (Cannot be generated using APSW). 2nd parameter to sqlite3_bind out of range
Permissions Etc¶
- exception PermissionsError¶
-
SQLITE_PERM. Access permission denied by the operating system, or parts of the database are readonly such as a cursor.
- exception ReadOnlyError¶
-
SQLITE_READONLY. Attempt to write to a readonly database.
- exception CantOpenError¶
-
SQLITE_CANTOPEN. Unable to open the database file.
- exception AuthError¶
-
SQLITE_AUTH.
Authorization
denied.
Abort/Busy Etc¶
- exception AbortError¶
-
SQLITE_ABORT. Callback routine requested an abort.
- exception BusyError¶
-
SQLITE_BUSY. The database file is locked. Use
Connection.setbusytimeout()
to change how long SQLite waits
for the database to be unlocked orConnection.setbusyhandler()
to use your own handler.
- exception LockedError¶
-
SQLITE_LOCKED. A table in the database is locked.
- exception InterruptError¶
-
SQLITE_INTERRUPT. Operation terminated by
sqlite3_interrupt —
useConnection.interrupt()
.
- exception SchemaChangeError¶
-
SQLITE_SCHEMA. The database schema changed. A
prepared statement
becomes invalid
if the database schema was changed. Behind the scenes SQLite
reprepares the statement. Another or the sameConnection
may change the schema again before the statement runs. SQLite will
attempt up to 5 times before giving up and returning this error.
- exception ConstraintError¶
-
SQLITE_CONSTRAINT. Abort due to constraint violation. This
would happen if the schema required a column to be within a specific
range. If you have multiple constraints, you can’t tell
which one was the cause.
Memory/Disk¶
- exception NoMemError¶
-
SQLITE_NOMEM. A memory allocation failed.
- exception IOError¶
-
SQLITE_IOERR. Some kind of disk I/O error occurred. The
extended error code will give more detail.
- exception CorruptError¶
-
SQLITE_CORRUPT. The database disk image appears to be a
SQLite database but the values inside are inconsistent.
- exception FullError¶
-
SQLITE_FULL. The disk appears to be full.
- exception TooBigError¶
-
SQLITE_TOOBIG. String or BLOB exceeds size limit. You can
change the limits usingConnection.limit()
.
- exception NoLFSError¶
-
SQLITE_NOLFS. SQLite has attempted to use a feature not
supported by the operating system such as large file support.
- exception EmptyError¶
-
SQLITE_EMPTY. Database is completely empty.
- exception FormatError¶
-
SQLITE_FORMAT. (No longer used) Auxiliary database format error.
- exception NotADBError¶
-
SQLITE_NOTADB. File opened that is not a database file.
SQLite has a header on database files to verify they are indeed
SQLite databases.
Augmented stack traces¶
When an exception occurs, Python does not include frames from
non-Python code (ie the C code called from Python). This can make it
more difficult to work out what was going on when an exception
occurred for example when there are callbacks to collations, functions
or virtual tables, triggers firing etc.
This is an example showing the difference between the tracebacks you
would have got with earlier versions of apsw and the augmented
traceback:
import apsw def myfunc(x): 1/0 con=apsw.Connection(":memory:") con.createscalarfunction("foo", myfunc) con.createscalarfunction("fam", myfunc) cursor=con.cursor() cursor.execute("create table bar(x,y,z);insert into bar values(1,2,3)") cursor.execute("select foo(1) from bar")
Original Traceback |
---|
Traceback (most recent call last): File "t.py", line 11, in <module> cursor.execute("select foo(1) from bar") File "t.py", line 4, in myfunc 1/0 ZeroDivisionError: integer division or modulo by zero |
Augmented Traceback |
---|
Traceback (most recent call last): File "t.py", line 11, in <module> cursor.execute("select foo(1) from bar") File "apsw.c", line 3412, in resetcursor File "apsw.c", line 1597, in user-defined-scalar-foo File "t.py", line 4, in myfunc 1/0 ZeroDivisionError: integer division or modulo by zero |
In the original traceback you can’t even see that code in apsw was
involved. The augmented traceback shows that there were indeed two
function calls within apsw and gives you line numbers should you need
to examine the code. Also note how you are told that the call was in
user-defined-scalar-foo (ie you can tell which function was called.)
But wait, there is more!!! In order to further aid troubleshooting,
the augmented stack traces make additional information available. Each
frame in the traceback has local variables defined with more
information. You can use apsw.ext.print_augmented_traceback()
to
print an exception with the local variables.
Here is a far more complex example from some virtual tables code I was writing. The BestIndex method in my code
had returned an incorrect value. The augmented traceback includes
local variables. I can see what was passed in to my method, what I
returned and which item was erroneous. The original traceback is
almost completely useless!
Original traceback:
Traceback (most recent call last): File "tests.py", line 1387, in testVtables cursor.execute(allconstraints) TypeError: Bad constraint (#2) - it should be one of None, an integer or a tuple of an integer and a boolean
Augmented traceback with local variables:
Traceback (most recent call last): File "tests.py", line 1387, in testVtables cursor.execute(allconstraints) VTable = __main__.VTable cur = <apsw.Cursor object at 0x988f30> i = 10 self = testVtables (__main__.APSW) allconstraints = select rowid,* from foo where rowid>-1000 .... File "apsw.c", line 4050, in Cursor_execute.sqlite3_prepare Connection = <apsw.Connection object at 0x978800> statement = select rowid,* from foo where rowid>-1000 .... File "apsw.c", line 2681, in VirtualTable.xBestIndex self = <__main__.VTable instance at 0x98d8c0> args = (((-1, 4), (0, 32), (1, 8), (2, 4), (3, 64)), ((2, False),)) result = ([4, (3,), [2, False], [1], [0]], 997, u'xea', False) File "apsw.c", line 2559, in VirtualTable.xBestIndex.result_constraint indices = [4, (3,), [2, False], [1], [0]] self = <__main__.VTable instance at 0x98d8c0> result = ([4, (3,), [2, False], [1], [0]], 997, u'xea', False) constraint = (3,) TypeError: Bad constraint (#2) - it should be one of None, an integer or a tuple of an integer and a boolean
Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07
Стандартный код (StandardCodes)
Ниже приведено стандартное возвращаемое значение и определение кода ошибки:
- #defineSQLITE_OK0/*Successfulresult*/
- /*beginning-of-error-codes*/
- #defineSQLITE_ERROR1/*SQLerrorormissingdatabase*/
- #defineSQLITE_INTERNAL2/*InternallogicerrorinSQLite*/
- #defineSQLITE_PERM3/*Accesspermissiondenied*/
- #defineSQLITE_ABORT4/*Callbackroutinerequestedanabort*/
- #defineSQLITE_BUSY5/*Thedatabasefileislocked*/
- #defineSQLITE_LOCKED6/*Atableinthedatabaseislocked*/
- #defineSQLITE_NOMEM7/*Amalloc()failed*/
- #defineSQLITE_READONLY8/*Attempttowriteareadonlydatabase*/
- #defineSQLITE_INTERRUPT9/*Operationterminatedbysqlite3_interrupt()*/
- #defineSQLITE_IOERR10/*SomekindofdiskI/Oerroroccurred*/
- #defineSQLITE_CORRUPT11/*Thedatabasediskimageismalformed*/
- #defineSQLITE_NOTFOUND12/*Unknownopcodeinsqlite3_file_control()*/
- #defineSQLITE_FULL13/*Insertionfailedbecausedatabaseisfull*/
- #defineSQLITE_CANTOPEN14/*Unabletoopenthedatabasefile*/
- #defineSQLITE_PROTOCOL15/*Databaselockprotocolerror*/
- #defineSQLITE_EMPTY16/*Databaseisempty*/
- #defineSQLITE_SCHEMA17/*Thedatabaseschemachanged*/
- #defineSQLITE_TOOBIG18/*StringorBLOBexceedssizelimit*/
- #defineSQLITE_CONSTRAINT19/*Abortduetoconstraintviolation*/
- #defineSQLITE_MISMATCH20/*Datatypemismatch*/
- #defineSQLITE_MISUSE21/*Libraryusedincorrectly*/
- #defineSQLITE_NOLFS22/*UsesOSfeaturesnotsupportedonhost*/
- #defineSQLITE_AUTH23/*Authorizationdenied*/
- #defineSQLITE_FORMAT24/*Auxiliarydatabaseformaterror*/
- #defineSQLITE_RANGE25/*2ndparametertosqlite3_bindoutofrange*/
- #defineSQLITE_NOTADB26/*Fileopenedthatisnotadatabasefile*/
- #defineSQLITE_ROW100/*sqlite3_step()hasanotherrowready*/
- #defineSQLITE_DONE101/*sqlite3_step()hasfinishedexecuting*/
- /*end-of-error-codes*/
#define SQLITE_OK 0 /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* Database is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_FORMAT 24 /* Auxiliary database format error */
#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB 26 /* File opened that is not a database file */
#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
/* end-of-error-codes */
Некоторые из этих констант возвращаются только определенной функцией, такой какSQLITE_RANGEТолькоsqlite3_bind_xxxФункция возвращает. Есть некоторые константы, такие какSQLITE_ERRORЭто может только объяснить, что произошла ошибка во время выполнения функции, но невозможно узнать причину ошибки.
SQLITE_MISUSEОт имениAPIБыл неправильно использован. Например, заявлениеsqlite3_stepПосле выполнения функции и до ее сброса, снова свяжите параметры с ней, в это времяbindФункция вернетсяSQLITE_MISUSE。
Код расширения (ExtendedCodes)
Стандартный код ошибки предоставляет меньше информации о причине ошибки. Поэтому иногда мы будем использовать расширенные коды ошибок. Расширенный код ошибки основан на стандартном коде ошибки, а его младший байт является исходным стандартным кодом ошибки, а затем дополнительная информация добавляется к старшему байту «или» для описания подробностей ошибки.
- intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);
Из-за учета совместимости старых программ заказчика эти расширенные коды ошибок не включены по умолчанию. Программисты могут пройтиsqlite3_extended_result_codesФункция включает или отключает расширенные коды ошибок.
Ниже приведены все расширенные коды ошибок (большинство из которых используются для описанияSQLITE_IOERR):
- #defineSQLITE_IOERR_READ(SQLITE_IOERR|(1<<8))
- #defineSQLITE_IOERR_SHORT_READ(SQLITE_IOERR|(2<<8))
- #defineSQLITE_IOERR_WRITE(SQLITE_IOERR|(3<<8))
- #defineSQLITE_IOERR_FSYNC(SQLITE_IOERR|(4<<8))
- #defineSQLITE_IOERR_DIR_FSYNC(SQLITE_IOERR|(5<<8))
- #defineSQLITE_IOERR_TRUNCATE(SQLITE_IOERR|(6<<8))
- #defineSQLITE_IOERR_FSTAT(SQLITE_IOERR|(7<<8))
- #defineSQLITE_IOERR_UNLOCK(SQLITE_IOERR|(8<<8))
- #defineSQLITE_IOERR_RDLOCK(SQLITE_IOERR|(9<<8))
- #defineSQLITE_IOERR_DELETE(SQLITE_IOERR|(10<<8))
- #defineSQLITE_IOERR_BLOCKED(SQLITE_IOERR|(11<<8))
- #defineSQLITE_IOERR_NOMEM(SQLITE_IOERR|(12<<8))
- #defineSQLITE_IOERR_ACCESS(SQLITE_IOERR|(13<<8))
- #defineSQLITE_IOERR_CHECKRESERVEDLOCK(SQLITE_IOERR|(14<<8))
- #defineSQLITE_IOERR_LOCK(SQLITE_IOERR|(15<<8))
- #defineSQLITE_IOERR_CLOSE(SQLITE_IOERR|(16<<8))
- #defineSQLITE_IOERR_DIR_CLOSE(SQLITE_IOERR|(17<<8))
- #defineSQLITE_IOERR_SHMOPEN(SQLITE_IOERR|(18<<8))
- #defineSQLITE_IOERR_SHMSIZE(SQLITE_IOERR|(19<<8))
- #defineSQLITE_IOERR_SHMLOCK(SQLITE_IOERR|(20<<8))
- #defineSQLITE_IOERR_SHMMAP(SQLITE_IOERR|(21<<8))
- #defineSQLITE_IOERR_SEEK(SQLITE_IOERR|(22<<8))
- #defineSQLITE_LOCKED_SHAREDCACHE(SQLITE_LOCKED|(1<<8))
- #defineSQLITE_BUSY_RECOVERY(SQLITE_BUSY|(1<<8))
- #defineSQLITE_CANTOPEN_NOTEMPDIR(SQLITE_CANTOPEN|(1<<8))
- #defineSQLITE_CORRUPT_VTAB(SQLITE_CORRUPT|(1<<8))
- #defineSQLITE_READONLY_RECOVERY(SQLITE_READONLY|(1<<8))
- #defineSQLITE_READONLY_CANTLOCK(SQLITE_READONLY|(2<<8))
#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8))
#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8))
#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8))
#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8))
#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
ErrorСвязанные функции (ErrorFunctions)
- intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);
Для подключения к базе данных включите или отключите использование расширенных кодов ошибок. Даваяsqlite3_extended_result_codesПервая функция2Параметры передают ненулевые значения, чтобы включить расширенные коды ошибок. Функция всегда возвращаетSQLITE_OK, Нет способа узнать, включен ли расширенный код ошибки в данный момент.
- intsqlite3_errcode(sqlite3*db);
int sqlite3_errcode(sqlite3 *db);
Если функция базы данных не возвращаетSQLITE_OK, Вы можете вызвать эту функцию, чтобы получить код ошибки. По умолчанию он возвращает стандартный код ошибки. Если в текущем соединении с базой данных включены расширенные коды ошибок, то эта функция также может возвращать расширенный код ошибки.
- intsqlite3_extended_errcode(sqlite3*db);
int sqlite3_extended_errcode(sqlite3 *db);
иsqlite3_errcodeФункция аналогична, за исключением того, что она возвращает только расширенный код ошибки.
- constchar*sqlite3_errmsg(sqlite3*);
- constvoid*sqlite3_errmsg16(sqlite3*);
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
Возвращает строку кода ошибки, используйтеUTF-8илиUTF-16Кодирование. Программист должен вызвать эти две функции сразу после получения информации о коде ошибки или сделать копию. Потому что следующая операция с базой данных может привести к тому, что возвращенный указатель на строку будет недействительным.
SQliteОбработка ошибок не может обрабатывать несколько ошибок одновременно, таких какAPIПроизошла ошибка при вызове функции, и программист не проверил ошибку, затем в следующий разAPIВызов функции может вернутьсяSQLITE_MISUSE, Указывая, что программа пыталась использовать недопустимую структуру данных. Так программисты должныAPIПроверьте и обработайте все ошибки, которые могут возникнуть после вызова функции.
Кроме того, если несколько потоков используют одно и то же соединение с базой данных, лучше всегоAPIКод части вызова и обработки ошибок инкапсулирован в области кода ключа (criticalsection) В. Программисты могут использоватьsqlite3_db_mutexФункция получает указатель мьютекса соединения с базой данных (указатель наsqlite3_mutexУказатель объекта).
V2ВерсияprepareФункция (Preparev2)
Следующая таблица является оригинальной версиейprepareФункция иv2ВерсияprepareСравнение функций:
V2ВерсияprepareЭта функция более лаконична для обработки ошибок, а также дляschemaПреимущества, поэтому рекомендуется использоватьv2ВерсияprepareФункция.
Транзакции и ошибки (TransactionsandErrors)
Как правило,SQliteОперация в режиме автоматической фиксации.SQliteАвтоматически ставить каждыйSQLКоманды заключены в транзакции. Если каждый оператор инкапсулирован в свою собственную транзакцию, то восстановление после ошибок просто. когдаSQLiteЕсли он оказывается в состоянии ошибки, он может просто откатить текущую транзакцию. Это может эффективно отменить текущийSQLВыполните команду и верните базу данных в состояние до появления ошибки.
Однако однаждыBEGINTRANSACTIONВыполнение команды,SQliteБольше не находится в режиме автоматической фиксации. Транзакция открыта, она останется открытой доENDTRANSACTIONилиCOMMITTRANSACTIONВыполнение команды. Это позволяет несколькоSQLКоманды инкапсулируются в транзакцию, поэтому ряд дискретных команд либо выполняется, либо не выполняется (атомарные операции), но это также ограничиваетSQLiteОшибка восстановления.
Когда отображается (explicit) Произошла ошибка во время выполнения транзакции,SQLiteПопытка отменить только что выполненное заявление. К сожалению, это не всегда возможно. Если дела плохи,SQliteИногда всю текущую транзакцию можно только откатить, и другого варианта нет.
Ошибка, наиболее вероятная для отката:SQLITE_FULL(База данных или дисковое пространство заполнено),SQLITE_IOERR(дискIOОшибка или файл заблокирован),SQLITE_BUSY(Блокировка базы данных),SQLITE_NOMEM(Недостаточно памяти),SQLITE_INTERRUPT(Прерывание). Если программа выполняет транзакцию отображения и получает одну из этих ошибок, будьте готовы к возможному откату транзакции.
- intsqlite3_get_autocommit(sqlite3*);
int sqlite3_get_autocommit(sqlite3*);
С помощью этой функции вы можете получить текущий статус отправки. Если он возвращает не0Значение, база данных отправляется автоматически (atutoconmit) Режим. Если вернуться0База данных находится в транзакции отображения (thedatabaseiscurrentlyinsideanexplicittransaction)。
еслиSQliteБаза данных вынуждена выполнить операцию полного отката транзакции, после чего база данных снова станет режимом автоматической фиксации транзакции. Если база данных не находится в режиме автоматической фиксации, она должна быть в транзакции, указывая, что откат не требуется.
Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07
Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07
Стандартный код (StandardCodes)
Ниже приведено стандартное возвращаемое значение и определение кода ошибки:
- #defineSQLITE_OK0/*Successfulresult*/
- /*beginning-of-error-codes*/
- #defineSQLITE_ERROR1/*SQLerrorormissingdatabase*/
- #defineSQLITE_INTERNAL2/*InternallogicerrorinSQLite*/
- #defineSQLITE_PERM3/*Accesspermissiondenied*/
- #defineSQLITE_ABORT4/*Callbackroutinerequestedanabort*/
- #defineSQLITE_BUSY5/*Thedatabasefileislocked*/
- #defineSQLITE_LOCKED6/*Atableinthedatabaseislocked*/
- #defineSQLITE_NOMEM7/*Amalloc()failed*/
- #defineSQLITE_READONLY8/*Attempttowriteareadonlydatabase*/
- #defineSQLITE_INTERRUPT9/*Operationterminatedbysqlite3_interrupt()*/
- #defineSQLITE_IOERR10/*SomekindofdiskI/Oerroroccurred*/
- #defineSQLITE_CORRUPT11/*Thedatabasediskimageismalformed*/
- #defineSQLITE_NOTFOUND12/*Unknownopcodeinsqlite3_file_control()*/
- #defineSQLITE_FULL13/*Insertionfailedbecausedatabaseisfull*/
- #defineSQLITE_CANTOPEN14/*Unabletoopenthedatabasefile*/
- #defineSQLITE_PROTOCOL15/*Databaselockprotocolerror*/
- #defineSQLITE_EMPTY16/*Databaseisempty*/
- #defineSQLITE_SCHEMA17/*Thedatabaseschemachanged*/
- #defineSQLITE_TOOBIG18/*StringorBLOBexceedssizelimit*/
- #defineSQLITE_CONSTRAINT19/*Abortduetoconstraintviolation*/
- #defineSQLITE_MISMATCH20/*Datatypemismatch*/
- #defineSQLITE_MISUSE21/*Libraryusedincorrectly*/
- #defineSQLITE_NOLFS22/*UsesOSfeaturesnotsupportedonhost*/
- #defineSQLITE_AUTH23/*Authorizationdenied*/
- #defineSQLITE_FORMAT24/*Auxiliarydatabaseformaterror*/
- #defineSQLITE_RANGE25/*2ndparametertosqlite3_bindoutofrange*/
- #defineSQLITE_NOTADB26/*Fileopenedthatisnotadatabasefile*/
- #defineSQLITE_ROW100/*sqlite3_step()hasanotherrowready*/
- #defineSQLITE_DONE101/*sqlite3_step()hasfinishedexecuting*/
- /*end-of-error-codes*/
#define SQLITE_OK 0 /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* Database is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_FORMAT 24 /* Auxiliary database format error */
#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB 26 /* File opened that is not a database file */
#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
/* end-of-error-codes */
Некоторые из этих констант возвращаются только определенной функцией, такой какSQLITE_RANGEТолькоsqlite3_bind_xxxФункция возвращает. Есть некоторые константы, такие какSQLITE_ERRORЭто может только объяснить, что произошла ошибка во время выполнения функции, но невозможно узнать причину ошибки.
SQLITE_MISUSEОт имениAPIБыл неправильно использован. Например, заявлениеsqlite3_stepПосле выполнения функции и до ее сброса, снова свяжите параметры с ней, в это времяbindФункция вернетсяSQLITE_MISUSE。
Код расширения (ExtendedCodes)
Стандартный код ошибки предоставляет меньше информации о причине ошибки. Поэтому иногда мы будем использовать расширенные коды ошибок. Расширенный код ошибки основан на стандартном коде ошибки, а его младший байт является исходным стандартным кодом ошибки, а затем дополнительная информация добавляется к старшему байту «или» для описания подробностей ошибки.
- intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);
Из-за учета совместимости старых программ заказчика эти расширенные коды ошибок не включены по умолчанию. Программисты могут пройтиsqlite3_extended_result_codesФункция включает или отключает расширенные коды ошибок.
Ниже приведены все расширенные коды ошибок (большинство из которых используются для описанияSQLITE_IOERR):
- #defineSQLITE_IOERR_READ(SQLITE_IOERR|(1<<8))
- #defineSQLITE_IOERR_SHORT_READ(SQLITE_IOERR|(2<<8))
- #defineSQLITE_IOERR_WRITE(SQLITE_IOERR|(3<<8))
- #defineSQLITE_IOERR_FSYNC(SQLITE_IOERR|(4<<8))
- #defineSQLITE_IOERR_DIR_FSYNC(SQLITE_IOERR|(5<<8))
- #defineSQLITE_IOERR_TRUNCATE(SQLITE_IOERR|(6<<8))
- #defineSQLITE_IOERR_FSTAT(SQLITE_IOERR|(7<<8))
- #defineSQLITE_IOERR_UNLOCK(SQLITE_IOERR|(8<<8))
- #defineSQLITE_IOERR_RDLOCK(SQLITE_IOERR|(9<<8))
- #defineSQLITE_IOERR_DELETE(SQLITE_IOERR|(10<<8))
- #defineSQLITE_IOERR_BLOCKED(SQLITE_IOERR|(11<<8))
- #defineSQLITE_IOERR_NOMEM(SQLITE_IOERR|(12<<8))
- #defineSQLITE_IOERR_ACCESS(SQLITE_IOERR|(13<<8))
- #defineSQLITE_IOERR_CHECKRESERVEDLOCK(SQLITE_IOERR|(14<<8))
- #defineSQLITE_IOERR_LOCK(SQLITE_IOERR|(15<<8))
- #defineSQLITE_IOERR_CLOSE(SQLITE_IOERR|(16<<8))
- #defineSQLITE_IOERR_DIR_CLOSE(SQLITE_IOERR|(17<<8))
- #defineSQLITE_IOERR_SHMOPEN(SQLITE_IOERR|(18<<8))
- #defineSQLITE_IOERR_SHMSIZE(SQLITE_IOERR|(19<<8))
- #defineSQLITE_IOERR_SHMLOCK(SQLITE_IOERR|(20<<8))
- #defineSQLITE_IOERR_SHMMAP(SQLITE_IOERR|(21<<8))
- #defineSQLITE_IOERR_SEEK(SQLITE_IOERR|(22<<8))
- #defineSQLITE_LOCKED_SHAREDCACHE(SQLITE_LOCKED|(1<<8))
- #defineSQLITE_BUSY_RECOVERY(SQLITE_BUSY|(1<<8))
- #defineSQLITE_CANTOPEN_NOTEMPDIR(SQLITE_CANTOPEN|(1<<8))
- #defineSQLITE_CORRUPT_VTAB(SQLITE_CORRUPT|(1<<8))
- #defineSQLITE_READONLY_RECOVERY(SQLITE_READONLY|(1<<8))
- #defineSQLITE_READONLY_CANTLOCK(SQLITE_READONLY|(2<<8))
#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8))
#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8))
#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8))
#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8))
#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
ErrorСвязанные функции (ErrorFunctions)
- intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);
Для подключения к базе данных включите или отключите использование расширенных кодов ошибок. Даваяsqlite3_extended_result_codesПервая функция2Параметры передают ненулевые значения, чтобы включить расширенные коды ошибок. Функция всегда возвращаетSQLITE_OK, Нет способа узнать, включен ли расширенный код ошибки в данный момент.
- intsqlite3_errcode(sqlite3*db);
int sqlite3_errcode(sqlite3 *db);
Если функция базы данных не возвращаетSQLITE_OK, Вы можете вызвать эту функцию, чтобы получить код ошибки. По умолчанию он возвращает стандартный код ошибки. Если в текущем соединении с базой данных включены расширенные коды ошибок, то эта функция также может возвращать расширенный код ошибки.
- intsqlite3_extended_errcode(sqlite3*db);
int sqlite3_extended_errcode(sqlite3 *db);
иsqlite3_errcodeФункция аналогична, за исключением того, что она возвращает только расширенный код ошибки.
- constchar*sqlite3_errmsg(sqlite3*);
- constvoid*sqlite3_errmsg16(sqlite3*);
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
Возвращает строку кода ошибки, используйтеUTF-8илиUTF-16Кодирование. Программист должен вызвать эти две функции сразу после получения информации о коде ошибки или сделать копию. Потому что следующая операция с базой данных может привести к тому, что возвращенный указатель на строку будет недействительным.
SQliteОбработка ошибок не может обрабатывать несколько ошибок одновременно, таких какAPIПроизошла ошибка при вызове функции, и программист не проверил ошибку, затем в следующий разAPIВызов функции может вернутьсяSQLITE_MISUSE, Указывая, что программа пыталась использовать недопустимую структуру данных. Так программисты должныAPIПроверьте и обработайте все ошибки, которые могут возникнуть после вызова функции.
Кроме того, если несколько потоков используют одно и то же соединение с базой данных, лучше всегоAPIКод части вызова и обработки ошибок инкапсулирован в области кода ключа (criticalsection) В. Программисты могут использоватьsqlite3_db_mutexФункция получает указатель мьютекса соединения с базой данных (указатель наsqlite3_mutexУказатель объекта).
V2ВерсияprepareФункция (Preparev2)
Следующая таблица является оригинальной версиейprepareФункция иv2ВерсияprepareСравнение функций:
V2ВерсияprepareЭта функция более лаконична для обработки ошибок, а также дляschemaПреимущества, поэтому рекомендуется использоватьv2ВерсияprepareФункция.
Транзакции и ошибки (TransactionsandErrors)
Как правило,SQliteОперация в режиме автоматической фиксации.SQliteАвтоматически ставить каждыйSQLКоманды заключены в транзакции. Если каждый оператор инкапсулирован в свою собственную транзакцию, то восстановление после ошибок просто. когдаSQLiteЕсли он оказывается в состоянии ошибки, он может просто откатить текущую транзакцию. Это может эффективно отменить текущийSQLВыполните команду и верните базу данных в состояние до появления ошибки.
Однако однаждыBEGINTRANSACTIONВыполнение команды,SQliteБольше не находится в режиме автоматической фиксации. Транзакция открыта, она останется открытой доENDTRANSACTIONилиCOMMITTRANSACTIONВыполнение команды. Это позволяет несколькоSQLКоманды инкапсулируются в транзакцию, поэтому ряд дискретных команд либо выполняется, либо не выполняется (атомарные операции), но это также ограничиваетSQLiteОшибка восстановления.
Когда отображается (explicit) Произошла ошибка во время выполнения транзакции,SQLiteПопытка отменить только что выполненное заявление. К сожалению, это не всегда возможно. Если дела плохи,SQliteИногда всю текущую транзакцию можно только откатить, и другого варианта нет.
Ошибка, наиболее вероятная для отката:SQLITE_FULL(База данных или дисковое пространство заполнено),SQLITE_IOERR(дискIOОшибка или файл заблокирован),SQLITE_BUSY(Блокировка базы данных),SQLITE_NOMEM(Недостаточно памяти),SQLITE_INTERRUPT(Прерывание). Если программа выполняет транзакцию отображения и получает одну из этих ошибок, будьте готовы к возможному откату транзакции.
- intsqlite3_get_autocommit(sqlite3*);
int sqlite3_get_autocommit(sqlite3*);
С помощью этой функции вы можете получить текущий статус отправки. Если он возвращает не0Значение, база данных отправляется автоматически (atutoconmit) Режим. Если вернуться0База данных находится в транзакции отображения (thedatabaseiscurrentlyinsideanexplicittransaction)。
еслиSQliteБаза данных вынуждена выполнить операцию полного отката транзакции, после чего база данных снова станет режимом автоматической фиксации транзакции. Если база данных не находится в режиме автоматической фиксации, она должна быть в транзакции, указывая, что откат не требуется.
Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07