xref: /aosp_15_r20/external/executorch/backends/apple/coreml/runtime/kvstore/sqlite_error.cpp (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1 //
2 // sqlite_error.cpp
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 
9 #include <sqlite_error.hpp>
10 
11 #include <sqlite3.h>
12 
13 namespace executorchcoreml {
14 namespace sqlite {
15 
equivalent(const std::error_code & code,int condition) const16 bool ErrorCategory::equivalent(const std::error_code& code, int condition) const noexcept {
17     switch (static_cast<Status>(condition)) {
18         case Status::success: {
19             return !code || (code == ErrorCode::OK_LOAD_PERMANENTLY) || (code == ErrorCode::ROW) ||
20                 (code == ErrorCode::DONE);
21         }
22         case Status::error: {
23             return (code == ErrorCode::ERROR);
24         }
25         case Status::internal: {
26             return (code == ErrorCode::INTERNAL);
27         }
28         case Status::perm: {
29             return (code == ErrorCode::PERM);
30         }
31         case Status::abort: {
32             return (code == ErrorCode::ABORT) || (code == ErrorCode::ABORT_ROLLBACK);
33         }
34         case Status::busy: {
35             return (code == ErrorCode::BUSY) || (code == ErrorCode::BUSY_RECOVERY) ||
36                 (code == ErrorCode::BUSY_SNAPSHOT);
37         }
38         case Status::locked: {
39             return (code == ErrorCode::LOCKED) || (code == ErrorCode::LOCKED_SHAREDCACHE);
40         }
41         case Status::nomem: {
42             return (code == ErrorCode::NOMEM);
43         }
44         case Status::readonly: {
45             return (code == ErrorCode::READONLY) || (code == ErrorCode::READONLY_CANTLOCK) ||
46                 (code == ErrorCode::READONLY_DBMOVED) || (code == ErrorCode::READONLY_RECOVERY) ||
47                 (code == ErrorCode::READONLY_ROLLBACK);
48         }
49         case Status::interrupt: {
50             return (code == ErrorCode::INTERRUPT);
51         }
52         case Status::ioerr: {
53             return (code == ErrorCode::IOERR) || (code == ErrorCode::IOERR_ACCESS) ||
54                 (code == ErrorCode::IOERR_BLOCKED) || (code == ErrorCode::IOERR_CHECKRESERVEDLOCK) ||
55                 (code == ErrorCode::IOERR_CLOSE) || (code == ErrorCode::IOERR_CONVPATH) ||
56                 (code == ErrorCode::IOERR_DELETE) || (code == ErrorCode::IOERR_DELETE_NOENT) ||
57                 (code == ErrorCode::IOERR_DIR_CLOSE) || (code == ErrorCode::IOERR_DIR_FSYNC) ||
58                 (code == ErrorCode::IOERR_FSTAT) || (code == ErrorCode::IOERR_FSYNC) ||
59                 (code == ErrorCode::IOERR_GETTEMPPATH) || (code == ErrorCode::IOERR_LOCK) ||
60                 (code == ErrorCode::IOERR_MMAP) || (code == ErrorCode::IOERR_NOMEM) ||
61                 (code == ErrorCode::IOERR_RDLOCK) || (code == ErrorCode::IOERR_READ) ||
62                 (code == ErrorCode::IOERR_SEEK) || (code == ErrorCode::IOERR_SHMLOCK) ||
63                 (code == ErrorCode::IOERR_SHMMAP) || (code == ErrorCode::IOERR_SHMOPEN) ||
64                 (code == ErrorCode::IOERR_SHMSIZE) || (code == ErrorCode::IOERR_SHORT_READ) ||
65                 (code == ErrorCode::IOERR_TRUNCATE) || (code == ErrorCode::IOERR_UNLOCK) ||
66                 (code == ErrorCode::IOERR_WRITE);
67         }
68         case Status::corrupt: {
69             return (code == ErrorCode::CORRUPT) || (code == ErrorCode::CORRUPT_VTAB);
70         }
71         case Status::notfound: {
72             return (code == ErrorCode::NOTFOUND);
73         }
74         case Status::full: {
75             return (code == ErrorCode::FULL);
76         }
77         case Status::cantopen: {
78             return (code == ErrorCode::CANTOPEN) || (code == ErrorCode::CANTOPEN_CONVPATH) ||
79                 (code == ErrorCode::CANTOPEN_FULLPATH) || (code == ErrorCode::CANTOPEN_ISDIR) ||
80                 (code == ErrorCode::CANTOPEN_NOTEMPDIR);
81         }
82         case Status::protocol: {
83             return (code == ErrorCode::PROTOCOL);
84         }
85         case Status::empty: {
86             return (code == ErrorCode::EMPTY);
87         }
88         case Status::schema: {
89             return (code == ErrorCode::SCHEMA);
90         }
91         case Status::toobig: {
92             return (code == ErrorCode::TOOBIG);
93         }
94         case Status::constraint: {
95             return (code == ErrorCode::CONSTRAINT) || (code == ErrorCode::CONSTRAINT_CHECK) ||
96                 (code == ErrorCode::CONSTRAINT_COMMITHOOK) || (code == ErrorCode::CONSTRAINT_FOREIGNKEY) ||
97                 (code == ErrorCode::CONSTRAINT_FUNCTION) || (code == ErrorCode::CONSTRAINT_NOTNULL) ||
98                 (code == ErrorCode::CONSTRAINT_PRIMARYKEY) || (code == ErrorCode::CONSTRAINT_ROWID) ||
99                 (code == ErrorCode::CONSTRAINT_TRIGGER) || (code == ErrorCode::CONSTRAINT_UNIQUE) ||
100                 (code == ErrorCode::CONSTRAINT_VTAB);
101         }
102         case Status::mismatch: {
103             return (code == ErrorCode::MISMATCH);
104         }
105         case Status::misuse: {
106             return (code == ErrorCode::MISUSE);
107         }
108         case Status::nolfs: {
109             return (code == ErrorCode::NOLFS);
110         }
111         case Status::auth: {
112             return (code == ErrorCode::AUTH);
113         }
114         case Status::format: {
115             return (code == ErrorCode::FORMAT);
116         }
117         case Status::range: {
118             return (code == ErrorCode::RANGE);
119         }
120         case Status::notadb: {
121             return (code == ErrorCode::NOTADB);
122         }
123         case Status::notice: {
124             return (code == ErrorCode::NOTICE) || (code == ErrorCode::NOTICE_RECOVER_ROLLBACK) ||
125                 (code == ErrorCode::NOTICE_RECOVER_WAL);
126         }
127         case Status::warning: {
128             return (code == ErrorCode::WARNING) || (code == ErrorCode::WARNING_AUTOINDEX);
129         }
130         case Status::row: {
131             return (code == ErrorCode::ROW);
132         }
133         case Status::done: {
134             return (code == ErrorCode::DONE);
135         }
136         default: {
137             return false;
138         }
139     }
140 }
141 
is_status_ok(int status)142 bool is_status_ok(int status) {
143     return (status == SQLITE_OK || status == SQLITE_DONE || status == SQLITE_OK_LOAD_PERMANENTLY ||
144             status == SQLITE_ROW);
145 }
146 
process_sqlite_status(int status,std::error_code & code)147 bool process_sqlite_status(int status, std::error_code& code) {
148     if (is_status_ok(status)) {
149         return true;
150     }
151     code = std::error_code(status, ErrorCategory::instance());
152     return false;
153 }
154 
155 } // namespace sqlite
156 } // namespace executorchcoreml
157