1 //
2 // sqlite_error.hpp
3 //
4 // Copyright © 2024 Apple Inc. All rights reserved.
5 //
6 // Please refer to the license found in the LICENSE file in the root directory of the source tree.
7
8 #pragma once
9
10
11 #include <types.hpp>
12
13 #include <sqlite3.h>
14
15 namespace executorchcoreml {
16 namespace sqlite {
17
18 /// The error codes representing sqlite error codes.
19 enum class ErrorCode: int32_t {
20 ERROR = SQLITE_ERROR,
21 INTERNAL = SQLITE_INTERNAL,
22 PERM = SQLITE_PERM,
23 ABORT = SQLITE_ABORT,
24 BUSY = SQLITE_BUSY,
25 LOCKED = SQLITE_LOCKED,
26 NOMEM = SQLITE_NOMEM,
27 READONLY = SQLITE_READONLY,
28 INTERRUPT = SQLITE_INTERRUPT,
29 IOERR = SQLITE_IOERR,
30 CORRUPT = SQLITE_CORRUPT,
31 NOTFOUND = SQLITE_NOTFOUND,
32 FULL = SQLITE_FULL,
33 CANTOPEN = SQLITE_CANTOPEN,
34 PROTOCOL = SQLITE_PROTOCOL,
35 EMPTY = SQLITE_EMPTY,
36 SCHEMA = SQLITE_SCHEMA,
37 TOOBIG = SQLITE_TOOBIG,
38 CONSTRAINT = SQLITE_CONSTRAINT,
39 MISMATCH = SQLITE_MISMATCH,
40 MISUSE = SQLITE_MISUSE,
41 NOLFS = SQLITE_NOLFS,
42 AUTH = SQLITE_AUTH,
43 FORMAT = SQLITE_FORMAT,
44 RANGE = SQLITE_RANGE,
45 NOTADB = SQLITE_NOTADB,
46 NOTICE = SQLITE_NOTICE,
47 WARNING = SQLITE_WARNING,
48 ROW = SQLITE_ROW,
49 DONE = SQLITE_DONE,
50
51 // Extended
52 ABORT_ROLLBACK = SQLITE_ABORT_ROLLBACK,
53 BUSY_RECOVERY = SQLITE_BUSY_RECOVERY,
54 BUSY_SNAPSHOT = SQLITE_BUSY_SNAPSHOT,
55 CANTOPEN_CONVPATH = SQLITE_CANTOPEN_CONVPATH,
56 CANTOPEN_FULLPATH = SQLITE_CANTOPEN_FULLPATH,
57 CANTOPEN_ISDIR = SQLITE_CANTOPEN_ISDIR,
58 CANTOPEN_NOTEMPDIR = SQLITE_CANTOPEN_NOTEMPDIR,
59 CONSTRAINT_CHECK = SQLITE_CONSTRAINT_CHECK,
60 CONSTRAINT_COMMITHOOK = SQLITE_CONSTRAINT_COMMITHOOK,
61 CONSTRAINT_FOREIGNKEY = SQLITE_CONSTRAINT_FOREIGNKEY,
62 CONSTRAINT_FUNCTION = SQLITE_CONSTRAINT_FUNCTION,
63 CONSTRAINT_NOTNULL = SQLITE_CONSTRAINT_NOTNULL,
64 CONSTRAINT_PRIMARYKEY = SQLITE_CONSTRAINT_PRIMARYKEY,
65 CONSTRAINT_ROWID = SQLITE_CONSTRAINT_ROWID,
66 CONSTRAINT_TRIGGER = SQLITE_CONSTRAINT_TRIGGER,
67 CONSTRAINT_UNIQUE = SQLITE_CONSTRAINT_UNIQUE,
68 CONSTRAINT_VTAB = SQLITE_CONSTRAINT_VTAB,
69 CORRUPT_VTAB = SQLITE_CORRUPT_VTAB,
70 IOERR_ACCESS = SQLITE_IOERR_ACCESS,
71 IOERR_BLOCKED = SQLITE_IOERR_BLOCKED,
72 IOERR_CHECKRESERVEDLOCK = SQLITE_IOERR_CHECKRESERVEDLOCK,
73 IOERR_CLOSE = SQLITE_IOERR_CLOSE,
74 IOERR_CONVPATH = SQLITE_IOERR_CONVPATH,
75 IOERR_DELETE = SQLITE_IOERR_DELETE,
76 IOERR_DELETE_NOENT = SQLITE_IOERR_DELETE_NOENT,
77 IOERR_DIR_CLOSE = SQLITE_IOERR_DIR_CLOSE,
78 IOERR_DIR_FSYNC = SQLITE_IOERR_DIR_FSYNC,
79 IOERR_FSTAT = SQLITE_IOERR_FSTAT,
80 IOERR_FSYNC = SQLITE_IOERR_FSYNC,
81 IOERR_GETTEMPPATH = SQLITE_IOERR_GETTEMPPATH,
82 IOERR_LOCK = SQLITE_IOERR_LOCK,
83 IOERR_MMAP = SQLITE_IOERR_MMAP,
84 IOERR_NOMEM = SQLITE_IOERR_NOMEM,
85 IOERR_RDLOCK = SQLITE_IOERR_RDLOCK,
86 IOERR_READ = SQLITE_IOERR_READ,
87 IOERR_SEEK = SQLITE_IOERR_SEEK,
88 IOERR_SHMLOCK = SQLITE_IOERR_SHMLOCK,
89 IOERR_SHMMAP = SQLITE_IOERR_SHMMAP,
90 IOERR_SHMOPEN = SQLITE_IOERR_SHMOPEN,
91 IOERR_SHMSIZE = SQLITE_IOERR_SHMSIZE,
92 IOERR_SHORT_READ = SQLITE_IOERR_SHORT_READ,
93 IOERR_TRUNCATE = SQLITE_IOERR_TRUNCATE,
94 IOERR_UNLOCK = SQLITE_IOERR_UNLOCK,
95 IOERR_WRITE = SQLITE_IOERR_WRITE,
96 LOCKED_SHAREDCACHE = SQLITE_LOCKED_SHAREDCACHE,
97 NOTICE_RECOVER_ROLLBACK = SQLITE_NOTICE_RECOVER_ROLLBACK,
98 NOTICE_RECOVER_WAL = SQLITE_NOTICE_RECOVER_WAL,
99 OK_LOAD_PERMANENTLY = SQLITE_OK_LOAD_PERMANENTLY,
100 READONLY_CANTLOCK = SQLITE_READONLY_CANTLOCK,
101 READONLY_DBMOVED = SQLITE_READONLY_DBMOVED,
102 READONLY_RECOVERY = SQLITE_READONLY_RECOVERY,
103 READONLY_ROLLBACK = SQLITE_READONLY_ROLLBACK,
104 WARNING_AUTOINDEX = SQLITE_WARNING_AUTOINDEX
105 };
106
107 enum class Status {
108 success = 1,
109 error,
110 internal,
111 perm,
112 abort,
113 busy,
114 locked,
115 nomem,
116 readonly,
117 interrupt,
118 ioerr,
119 corrupt,
120 notfound,
121 full,
122 cantopen,
123 protocol,
124 empty,
125 schema,
126 toobig,
127 constraint,
128 mismatch,
129 misuse,
130 nolfs,
131 auth,
132 format,
133 range,
134 notadb,
135 notice,
136 warning,
137 row,
138 done
139 };
140
141 /// The category for a sqlite error.
142 struct ErrorCategory final : std::error_category {
nameexecutorchcoreml::sqlite::ErrorCategory143 inline const char* name() const noexcept override {
144 return "sqlite";
145 }
146
messageexecutorchcoreml::sqlite::ErrorCategory147 inline std::string message(int v) const override {
148 return std::string(sqlite3_errstr(v));
149 }
150
instanceexecutorchcoreml::sqlite::ErrorCategory151 static inline ErrorCategory& instance() {
152 static ErrorCategory c;
153 return c;
154 }
155
156 bool equivalent(const std::error_code& ec, int condition) const noexcept override;
157 };
158
159
make_error_code(ErrorCode code)160 inline std::error_code make_error_code(ErrorCode code) {
161 return {static_cast<int>(code), ErrorCategory::instance()};
162 }
163
164 /// Checks if the sqlite status is not an error.
165 ///
166 /// @param status The sqlite status.
167 /// @retval `true` if the status is not an error otherwise `false`.
168 bool is_status_ok(int status);
169
170 /// Processes sqlite return status.
171 ///
172 /// @param status The sqlite status.
173 /// @param error if the sqlite status is an error then it is converted to `error_code` and is assigned to `error`.
174 /// @retval `true` if the status is not an error otherwise `false`.
175 bool process_sqlite_status(int status, std::error_code& error);
176
177 } // namespace sqlite
178 } // namespace executorchcoreml
179
180 namespace std {
181
182 template <>
183 struct is_error_code_enum<executorchcoreml::sqlite::ErrorCode> : true_type {};
184
185 } // namespace std
186