sqlite_ll/
error.rs

1use core::error;
2use core::ffi::{CStr, c_int};
3use core::fmt;
4
5/// A result type.
6pub type Result<T, E = Error> = core::result::Result<T, E>;
7
8/// Error code.
9#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
10#[repr(transparent)]
11pub struct Code(c_int);
12
13impl Code {
14    pub const OK: Self = Self(sqlite3_sys::SQLITE_OK);
15    pub const ERROR: Self = Self(sqlite3_sys::SQLITE_ERROR);
16    pub const INTERNAL: Self = Self(sqlite3_sys::SQLITE_INTERNAL);
17    pub const PERM: Self = Self(sqlite3_sys::SQLITE_PERM);
18    pub const ABORT: Self = Self(sqlite3_sys::SQLITE_ABORT);
19    pub const BUSY: Self = Self(sqlite3_sys::SQLITE_BUSY);
20    pub const LOCKED: Self = Self(sqlite3_sys::SQLITE_LOCKED);
21    pub const NOMEM: Self = Self(sqlite3_sys::SQLITE_NOMEM);
22    pub const READONLY: Self = Self(sqlite3_sys::SQLITE_READONLY);
23    pub const INTERRUPT: Self = Self(sqlite3_sys::SQLITE_INTERRUPT);
24    pub const IOERR: Self = Self(sqlite3_sys::SQLITE_IOERR);
25    pub const CORRUPT: Self = Self(sqlite3_sys::SQLITE_CORRUPT);
26    pub const NOTFOUND: Self = Self(sqlite3_sys::SQLITE_NOTFOUND);
27    pub const FULL: Self = Self(sqlite3_sys::SQLITE_FULL);
28    pub const CANTOPEN: Self = Self(sqlite3_sys::SQLITE_CANTOPEN);
29    pub const PROTOCOL: Self = Self(sqlite3_sys::SQLITE_PROTOCOL);
30    pub const EMPTY: Self = Self(sqlite3_sys::SQLITE_EMPTY);
31    pub const SCHEMA: Self = Self(sqlite3_sys::SQLITE_SCHEMA);
32    pub const TOOBIG: Self = Self(sqlite3_sys::SQLITE_TOOBIG);
33    pub const CONSTRAINT: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT);
34    pub const MISMATCH: Self = Self(sqlite3_sys::SQLITE_MISMATCH);
35    pub const MISUSE: Self = Self(sqlite3_sys::SQLITE_MISUSE);
36    pub const NOLFS: Self = Self(sqlite3_sys::SQLITE_NOLFS);
37    pub const AUTH: Self = Self(sqlite3_sys::SQLITE_AUTH);
38    pub const FORMAT: Self = Self(sqlite3_sys::SQLITE_FORMAT);
39    pub const RANGE: Self = Self(sqlite3_sys::SQLITE_RANGE);
40    pub const NOTADB: Self = Self(sqlite3_sys::SQLITE_NOTADB);
41    pub const NOTICE: Self = Self(sqlite3_sys::SQLITE_NOTICE);
42    pub const WARNING: Self = Self(sqlite3_sys::SQLITE_WARNING);
43    pub const IOERR_READ: Self = Self(sqlite3_sys::SQLITE_IOERR_READ);
44    pub const IOERR_SHORT_READ: Self = Self(sqlite3_sys::SQLITE_IOERR_SHORT_READ);
45    pub const IOERR_WRITE: Self = Self(sqlite3_sys::SQLITE_IOERR_WRITE);
46    pub const IOERR_FSYNC: Self = Self(sqlite3_sys::SQLITE_IOERR_FSYNC);
47    pub const IOERR_DIR_FSYNC: Self = Self(sqlite3_sys::SQLITE_IOERR_DIR_FSYNC);
48    pub const IOERR_TRUNCATE: Self = Self(sqlite3_sys::SQLITE_IOERR_TRUNCATE);
49    pub const IOERR_FSTAT: Self = Self(sqlite3_sys::SQLITE_IOERR_FSTAT);
50    pub const IOERR_UNLOCK: Self = Self(sqlite3_sys::SQLITE_IOERR_UNLOCK);
51    pub const IOERR_RDLOCK: Self = Self(sqlite3_sys::SQLITE_IOERR_RDLOCK);
52    pub const IOERR_DELETE: Self = Self(sqlite3_sys::SQLITE_IOERR_DELETE);
53    pub const IOERR_BLOCKED: Self = Self(sqlite3_sys::SQLITE_IOERR_BLOCKED);
54    pub const IOERR_NOMEM: Self = Self(sqlite3_sys::SQLITE_IOERR_NOMEM);
55    pub const IOERR_ACCESS: Self = Self(sqlite3_sys::SQLITE_IOERR_ACCESS);
56    pub const IOERR_CHECKRESERVEDLOCK: Self = Self(sqlite3_sys::SQLITE_IOERR_CHECKRESERVEDLOCK);
57    pub const IOERR_LOCK: Self = Self(sqlite3_sys::SQLITE_IOERR_LOCK);
58    pub const IOERR_CLOSE: Self = Self(sqlite3_sys::SQLITE_IOERR_CLOSE);
59    pub const IOERR_DIR_CLOSE: Self = Self(sqlite3_sys::SQLITE_IOERR_DIR_CLOSE);
60    pub const IOERR_SHMOPEN: Self = Self(sqlite3_sys::SQLITE_IOERR_SHMOPEN);
61    pub const IOERR_SHMSIZE: Self = Self(sqlite3_sys::SQLITE_IOERR_SHMSIZE);
62    pub const IOERR_SHMLOCK: Self = Self(sqlite3_sys::SQLITE_IOERR_SHMLOCK);
63    pub const IOERR_SHMMAP: Self = Self(sqlite3_sys::SQLITE_IOERR_SHMMAP);
64    pub const IOERR_SEEK: Self = Self(sqlite3_sys::SQLITE_IOERR_SEEK);
65    pub const IOERR_DELETE_NOENT: Self = Self(sqlite3_sys::SQLITE_IOERR_DELETE_NOENT);
66    pub const IOERR_MMAP: Self = Self(sqlite3_sys::SQLITE_IOERR_MMAP);
67    pub const IOERR_GETTEMPPATH: Self = Self(sqlite3_sys::SQLITE_IOERR_GETTEMPPATH);
68    pub const IOERR_CONVPATH: Self = Self(sqlite3_sys::SQLITE_IOERR_CONVPATH);
69    pub const LOCKED_SHAREDCACHE: Self = Self(sqlite3_sys::SQLITE_LOCKED_SHAREDCACHE);
70    pub const BUSY_RECOVERY: Self = Self(sqlite3_sys::SQLITE_BUSY_RECOVERY);
71    pub const BUSY_SNAPSHOT: Self = Self(sqlite3_sys::SQLITE_BUSY_SNAPSHOT);
72    pub const CANTOPEN_NOTEMPDIR: Self = Self(sqlite3_sys::SQLITE_CANTOPEN_NOTEMPDIR);
73    pub const CANTOPEN_ISDIR: Self = Self(sqlite3_sys::SQLITE_CANTOPEN_ISDIR);
74    pub const CANTOPEN_FULLPATH: Self = Self(sqlite3_sys::SQLITE_CANTOPEN_FULLPATH);
75    pub const CANTOPEN_CONVPATH: Self = Self(sqlite3_sys::SQLITE_CANTOPEN_CONVPATH);
76    pub const CORRUPT_VTAB: Self = Self(sqlite3_sys::SQLITE_CORRUPT_VTAB);
77    pub const READONLY_RECOVERY: Self = Self(sqlite3_sys::SQLITE_READONLY_RECOVERY);
78    pub const READONLY_CANTLOCK: Self = Self(sqlite3_sys::SQLITE_READONLY_CANTLOCK);
79    pub const READONLY_ROLLBACK: Self = Self(sqlite3_sys::SQLITE_READONLY_ROLLBACK);
80    pub const READONLY_DBMOVED: Self = Self(sqlite3_sys::SQLITE_READONLY_DBMOVED);
81    pub const ABORT_ROLLBACK: Self = Self(sqlite3_sys::SQLITE_ABORT_ROLLBACK);
82    pub const CONSTRAINT_CHECK: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_CHECK);
83    pub const CONSTRAINT_COMMITHOOK: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_COMMITHOOK);
84    pub const CONSTRAINT_FOREIGNKEY: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_FOREIGNKEY);
85    pub const CONSTRAINT_FUNCTION: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_FUNCTION);
86    pub const CONSTRAINT_NOTNULL: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_NOTNULL);
87    pub const CONSTRAINT_PRIMARYKEY: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_PRIMARYKEY);
88    pub const CONSTRAINT_TRIGGER: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_TRIGGER);
89    pub const CONSTRAINT_UNIQUE: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_UNIQUE);
90    pub const CONSTRAINT_VTAB: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_VTAB);
91    pub const CONSTRAINT_ROWID: Self = Self(sqlite3_sys::SQLITE_CONSTRAINT_ROWID);
92    pub const NOTICE_RECOVER_WAL: Self = Self(sqlite3_sys::SQLITE_NOTICE_RECOVER_WAL);
93    pub const NOTICE_RECOVER_ROLLBACK: Self = Self(sqlite3_sys::SQLITE_NOTICE_RECOVER_ROLLBACK);
94    pub const WARNING_AUTOINDEX: Self = Self(sqlite3_sys::SQLITE_WARNING_AUTOINDEX);
95    pub const AUTH_USER: Self = Self(sqlite3_sys::SQLITE_AUTH_USER);
96    pub const OK_LOAD_PERMANENTLY: Self = Self(sqlite3_sys::SQLITE_OK_LOAD_PERMANENTLY);
97}
98
99impl Code {
100    /// Return the numeric representation of the error code.
101    #[inline]
102    fn number(self) -> c_int {
103        self.0
104    }
105
106    /// Return the string representation of the error code.
107    #[inline]
108    fn message(self) -> &'static CStr {
109        unsafe { CStr::from_ptr(sqlite3_sys::sqlite3_errstr(self.0)) }
110    }
111}
112
113impl fmt::Debug for Code {
114    #[inline]
115    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
116        self.0.fmt(f)
117    }
118}
119
120/// An error.
121pub struct Error {
122    /// Error code.
123    code: Code,
124}
125
126impl Error {
127    /// Construct a new error with the specified message.
128    pub(crate) fn new(code: c_int) -> Self {
129        Self { code: Code(code) }
130    }
131
132    /// Construct a new error from the specified code.
133    pub(crate) fn from_code(code: Code) -> Self {
134        Self { code }
135    }
136
137    /// The error code that caused this error.
138    pub fn code(&self) -> Code {
139        self.code
140    }
141}
142
143impl fmt::Debug for Error {
144    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
145        let mut st = f.debug_struct("Error");
146        st.field("code", &self.code);
147
148        if let Ok(message) = self.code.message().to_str() {
149            st.field("message", &message);
150        }
151
152        st.finish()
153    }
154}
155
156impl fmt::Display for Error {
157    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
158        write!(f, "sqlite3 error {}", self.code.number())?;
159
160        if let Ok(string) = self.code.message().to_str() {
161            write!(f, ": {string}")?;
162        } else {
163            write!(f, ": no message")?;
164        }
165
166        Ok(())
167    }
168}
169
170impl error::Error for Error {}