1#[derive(Debug, thiserror::Error)]
9#[allow(dead_code)]
10pub enum AppError {
11 #[error("Database connection error: {0}")]
13 Connection(String),
14
15 #[error("Query blocked: only SELECT, SHOW, DESC, DESCRIBE, USE queries are allowed in read-only mode")]
17 ReadOnlyViolation,
18
19 #[error("Operation forbidden: LOAD_FILE() is not allowed for security reasons")]
21 LoadFileBlocked,
22
23 #[error("Operation forbidden: SELECT INTO OUTFILE/DUMPFILE is not allowed for security reasons")]
25 IntoOutfileBlocked,
26
27 #[error("Query blocked: only single statements are allowed")]
29 MultiStatement,
30
31 #[error("Invalid identifier '{0}': must not be empty, whitespace-only, or contain control characters")]
33 InvalidIdentifier(String),
34
35 #[error("Database error: {0}")]
37 Query(String),
38
39 #[error("Table not found: {0}")]
41 TableNotFound(String),
42}
43
44impl From<sqlx::Error> for AppError {
45 fn from(e: sqlx::Error) -> Self {
46 AppError::Connection(e.to_string())
47 }
48}