xref: /aosp_15_r20/external/executorch/backends/apple/coreml/runtime/kvstore/sqlite_error.hpp (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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