use crate::error::Error;
use libsqlite3_sys as ffi;
use rusqlite::types::FromSqlError;
impl From<rusqlite::Error> for Error {
fn from(e: rusqlite::Error) -> Error {
match e {
rusqlite::Error::QueryReturnedNoRows => Error::NotFound,
rusqlite::Error::SqliteFailure(
ffi::Error {
code: ffi::ErrorCode::ConstraintViolation,
extended_code: 2067,
},
Some(description),
) => {
let splitted: Vec<&str> = description.split(": ").collect();
let splitted: Vec<&str> = splitted[1].split('.').collect();
Error::UniqueConstraintViolation {
field_name: splitted[1].into(),
}
}
rusqlite::Error::SqliteFailure(
ffi::Error {
code: ffi::ErrorCode::ConstraintViolation,
extended_code: 1555,
},
Some(description),
) => {
let splitted: Vec<&str> = description.split(": ").collect();
let splitted: Vec<&str> = splitted[1].split('.').collect();
Error::UniqueConstraintViolation {
field_name: splitted[1].into(),
}
}
rusqlite::Error::SqliteFailure(
ffi::Error {
code: ffi::ErrorCode::ConstraintViolation,
extended_code: 1299,
},
Some(description),
) => {
let splitted: Vec<&str> = description.split(": ").collect();
let splitted: Vec<&str> = splitted[1].split('.').collect();
Error::NullConstraintViolation {
field_name: splitted[1].into(),
}
}
rusqlite::Error::SqliteFailure(
ffi::Error {
code: ffi::ErrorCode::DatabaseBusy,
..
},
_
) => {
Error::Timeout
}
e => Error::QueryError(e.into()),
}
}
}
impl From<FromSqlError> for Error {
fn from(e: FromSqlError) -> Error {
Error::ColumnReadFailure(e.into())
}
}