#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SqlState(pub [u8; 5]);
impl SqlState {
pub const fn new(s: &str) -> Self {
let bytes = s.as_bytes();
debug_assert!(bytes.len() == 5, "SQLSTATE must be 5 chars");
let mut buf = [b'?'; 5];
let mut i = 0;
while i < 5 && i < bytes.len() {
buf[i] = bytes[i];
i += 1;
}
Self(buf)
}
pub fn class(&self) -> &str {
std::str::from_utf8(&self.0[..2]).unwrap_or("??")
}
pub fn as_str(&self) -> &str {
std::str::from_utf8(&self.0).unwrap_or("?????")
}
}
impl std::fmt::Display for SqlState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
pub const SUCCESSFUL_COMPLETION: SqlState = SqlState::new("00000");
pub const CONNECTION_EXCEPTION: SqlState = SqlState::new("08000");
pub const CONNECTION_FAILURE: SqlState = SqlState::new("08006");
pub const CONNECTION_DOES_NOT_EXIST: SqlState = SqlState::new("08003");
pub const SQLSERVER_REJECTED_ESTABLISHMENT: SqlState = SqlState::new("08004");
pub const DATA_EXCEPTION: SqlState = SqlState::new("22000");
pub const DIVISION_BY_ZERO: SqlState = SqlState::new("22012");
pub const NUMERIC_VALUE_OUT_OF_RANGE: SqlState = SqlState::new("22003");
pub const NULL_VALUE_NOT_ALLOWED_DATA: SqlState = SqlState::new("22004");
pub const STRING_DATA_RIGHT_TRUNCATION: SqlState = SqlState::new("22001");
pub const INVALID_DATETIME_FORMAT: SqlState = SqlState::new("22007");
pub const INVALID_TEXT_REPRESENTATION: SqlState = SqlState::new("22P02");
pub const INTEGRITY_CONSTRAINT_VIOLATION: SqlState = SqlState::new("23000");
pub const NOT_NULL_VIOLATION: SqlState = SqlState::new("23502");
pub const FOREIGN_KEY_VIOLATION: SqlState = SqlState::new("23503");
pub const UNIQUE_VIOLATION: SqlState = SqlState::new("23505");
pub const CHECK_VIOLATION: SqlState = SqlState::new("23514");
pub const INVALID_TRANSACTION_STATE: SqlState = SqlState::new("25000");
pub const ACTIVE_SQL_TRANSACTION: SqlState = SqlState::new("25001");
pub const NO_ACTIVE_SQL_TRANSACTION: SqlState = SqlState::new("25P01");
pub const READ_ONLY_SQL_TRANSACTION: SqlState = SqlState::new("25006");
pub const INVALID_PASSWORD: SqlState = SqlState::new("28P01");
pub const TRANSACTION_ROLLBACK: SqlState = SqlState::new("40000");
pub const SERIALIZATION_FAILURE: SqlState = SqlState::new("40001");
pub const DEADLOCK_DETECTED: SqlState = SqlState::new("40P01");
pub const SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION: SqlState = SqlState::new("42000");
pub const SYNTAX_ERROR: SqlState = SqlState::new("42601");
pub const UNDEFINED_COLUMN: SqlState = SqlState::new("42703");
pub const UNDEFINED_FUNCTION: SqlState = SqlState::new("42883");
pub const UNDEFINED_TABLE: SqlState = SqlState::new("42P01");
pub const UNDEFINED_PARAMETER: SqlState = SqlState::new("42P02");
pub const DUPLICATE_COLUMN: SqlState = SqlState::new("42701");
pub const DUPLICATE_TABLE: SqlState = SqlState::new("42P07");
pub const AMBIGUOUS_COLUMN: SqlState = SqlState::new("42702");
pub const DATATYPE_MISMATCH: SqlState = SqlState::new("42804");
pub const WRONG_OBJECT_TYPE: SqlState = SqlState::new("42809");
pub const INSUFFICIENT_RESOURCES: SqlState = SqlState::new("53000");
pub const DISK_FULL: SqlState = SqlState::new("53100");
pub const OUT_OF_MEMORY: SqlState = SqlState::new("53200");
pub const TOO_MANY_CONNECTIONS: SqlState = SqlState::new("53300");
pub const OPERATOR_INTERVENTION: SqlState = SqlState::new("57000");
pub const QUERY_CANCELED: SqlState = SqlState::new("57014");
pub const SYSTEM_ERROR: SqlState = SqlState::new("58000");
pub const IO_ERROR: SqlState = SqlState::new("58030");
pub const INTERNAL_ERROR: SqlState = SqlState::new("XX000");
pub const DATA_CORRUPTED: SqlState = SqlState::new("XX001");
pub fn sqlstate_for_reddb_error(err: &crate::api::RedDBError) -> SqlState {
use crate::api::RedDBError as E;
match err {
E::InvalidConfig(_) => SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION,
E::SchemaVersionMismatch { .. } => DATA_CORRUPTED,
E::FeatureNotEnabled(_) => SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION,
E::NotFound(_) => UNDEFINED_TABLE,
E::ReadOnly(_) => READ_ONLY_SQL_TRANSACTION,
E::InvalidOperation(_) => WRONG_OBJECT_TYPE,
E::Engine(_) => INTERNAL_ERROR,
E::Catalog(_) => INTERNAL_ERROR,
E::Query(_) => SYNTAX_ERROR,
E::Validation { .. } => SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION,
E::Io(_) => IO_ERROR,
E::VersionUnavailable => INTERNAL_ERROR,
E::QuotaExceeded(_) => SqlState::new("53400"),
E::Internal(_) => INTERNAL_ERROR,
}
}