| 23 | namespace { |
| 24 | |
| 25 | error::Code GetTfErrorCode(int code) { |
| 26 | // See: https://sqlite.org/rescode.html |
| 27 | switch (code & 0xff) { |
| 28 | case SQLITE_OK: // Successful result |
| 29 | case SQLITE_ROW: // Step has another row ready |
| 30 | case SQLITE_DONE: // Step has finished executing |
| 31 | return error::OK; |
| 32 | case SQLITE_ABORT: // Callback routine requested an abort |
| 33 | return error::ABORTED; |
| 34 | case SQLITE_READONLY: // Attempt to write a readonly database |
| 35 | case SQLITE_MISMATCH: // Data type mismatch |
| 36 | return error::FAILED_PRECONDITION; |
| 37 | case SQLITE_MISUSE: // Library used incorrectly |
| 38 | case SQLITE_INTERNAL: // Internal logic error in SQLite |
| 39 | return error::INTERNAL; |
| 40 | case SQLITE_RANGE: // 2nd parameter to sqlite3_bind out of range |
| 41 | return error::OUT_OF_RANGE; |
| 42 | case SQLITE_CANTOPEN: // Unable to open the database file |
| 43 | case SQLITE_CONSTRAINT: // Abort due to constraint violation |
| 44 | case SQLITE_NOTFOUND: // Unknown opcode or statement parameter name |
| 45 | case SQLITE_NOTADB: // File opened that is not a database file |
| 46 | return error::INVALID_ARGUMENT; |
| 47 | case SQLITE_CORRUPT: // The database disk image is malformed |
| 48 | return error::DATA_LOSS; |
| 49 | case SQLITE_AUTH: // Authorization denied |
| 50 | case SQLITE_PERM: // Access permission denied |
| 51 | return error::PERMISSION_DENIED; |
| 52 | case SQLITE_FULL: // Insertion failed because database is full |
| 53 | case SQLITE_TOOBIG: // String or BLOB exceeds size limit |
| 54 | case SQLITE_NOLFS: // Uses OS features not supported on host |
| 55 | return error::RESOURCE_EXHAUSTED; |
| 56 | case SQLITE_BUSY: // The database file is locked |
| 57 | case SQLITE_LOCKED: // A table in the database is locked |
| 58 | case SQLITE_PROTOCOL: // Database lock protocol error |
| 59 | case SQLITE_NOMEM: // Out of heap or perhaps lookaside memory |
| 60 | return error::UNAVAILABLE; |
| 61 | case SQLITE_INTERRUPT: // Operation terminated by sqlite3_interrupt |
| 62 | return error::CANCELLED; |
| 63 | case SQLITE_ERROR: // SQL error or missing database |
| 64 | case SQLITE_IOERR: // Some kind of disk I/O error occurred |
| 65 | case SQLITE_SCHEMA: // The database schema changed |
| 66 | default: |
| 67 | return error::UNKNOWN; |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | template <typename... Args> |
| 72 | Status PrintfStatus(int rc, const char* fmt, Args&&... args) { |