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) const16bool 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)142bool 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)147bool 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