Skip to main content

limbo_core/
error.rs

1use thiserror::Error;
2
3#[derive(Debug, Error, miette::Diagnostic)]
4pub enum LimboError {
5    #[error("Corrupt database: {0}")]
6    Corrupt(String),
7    #[error("File is not a database")]
8    NotADB,
9    #[error("Internal error: {0}")]
10    InternalError(String),
11    #[error("Page cache is full")]
12    CacheFull,
13    #[error("Parse error: {0}")]
14    ParseError(String),
15    #[error(transparent)]
16    #[diagnostic(transparent)]
17    LexerError(#[from] limbo_sqlite3_parser::lexer::sql::Error),
18    #[error("Conversion error: {0}")]
19    ConversionError(String),
20    #[error("Env variable error: {0}")]
21    EnvVarError(#[from] std::env::VarError),
22    #[error("Transaction error: {0}")]
23    TxError(String),
24    #[error("I/O error: {0}")]
25    IOError(#[from] std::io::Error),
26    #[cfg(all(target_os = "linux", feature = "io_uring"))]
27    #[error("I/O error: {0}")]
28    UringIOError(String),
29    #[error("Locking error: {0}")]
30    LockingError(String),
31    #[cfg(target_family = "unix")]
32    #[error("I/O error: {0}")]
33    RustixIOError(#[from] rustix::io::Errno),
34    #[error("Parse error: {0}")]
35    ParseIntError(#[from] std::num::ParseIntError),
36    #[error("Parse error: {0}")]
37    ParseFloatError(#[from] std::num::ParseFloatError),
38    #[error("Parse error: {0}")]
39    InvalidDate(String),
40    #[error("Parse error: {0}")]
41    InvalidTime(String),
42    #[error("Modifier parsing error: {0}")]
43    InvalidModifier(String),
44    #[error("Invalid argument supplied: {0}")]
45    InvalidArgument(String),
46    #[error("Invalid formatter supplied: {0}")]
47    InvalidFormatter(String),
48    #[error("Runtime error: {0}")]
49    Constraint(String),
50    #[error("Extension error: {0}")]
51    ExtensionError(String),
52    #[error("Runtime error: integer overflow")]
53    IntegerOverflow,
54    #[error("Schema is locked for write")]
55    SchemaLocked,
56    #[error("Database Connection is read-only")]
57    ReadOnly,
58    #[error("Database is busy")]
59    Busy,
60}
61
62#[macro_export]
63macro_rules! bail_parse_error {
64    ($($arg:tt)*) => {
65        return Err($crate::error::LimboError::ParseError(format!($($arg)*)))
66    };
67}
68
69#[macro_export]
70macro_rules! bail_corrupt_error {
71    ($($arg:tt)*) => {
72        return Err($crate::error::LimboError::Corrupt(format!($($arg)*)))
73    };
74}
75
76#[macro_export]
77macro_rules! bail_constraint_error {
78    ($($arg:tt)*) => {
79        return Err($crate::error::LimboError::Constraint(format!($($arg)*)))
80    };
81}
82
83impl From<limbo_ext::ResultCode> for LimboError {
84    fn from(err: limbo_ext::ResultCode) -> Self {
85        LimboError::ExtensionError(err.to_string())
86    }
87}
88
89pub const SQLITE_CONSTRAINT: usize = 19;
90pub const SQLITE_CONSTRAINT_PRIMARYKEY: usize = SQLITE_CONSTRAINT | (6 << 8);
91pub const SQLITE_CONSTRAINT_NOTNULL: usize = SQLITE_CONSTRAINT | (5 << 8);