1use core::error;
2use core::ffi::{CStr, c_int};
3use core::fmt;
4
5pub type Result<T, E = Error> = core::result::Result<T, E>;
7
8#[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 #[inline]
102 fn number(self) -> c_int {
103 self.0
104 }
105
106 #[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
120pub struct Error {
122 code: Code,
124}
125
126impl Error {
127 pub(crate) fn new(code: c_int) -> Self {
129 Self { code: Code(code) }
130 }
131
132 pub(crate) fn from_code(code: Code) -> Self {
134 Self { code }
135 }
136
137 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 {}