mirror of
https://github.com/isar/rusqlite.git
synced 2025-04-20 16:27:46 +08:00
commit
5ae7b5c5db
20
src/error.rs
20
src/error.rs
@ -414,12 +414,20 @@ pub fn error_from_sqlite_code(code: c_int, message: Option<String>) -> Error {
|
|||||||
|
|
||||||
#[cold]
|
#[cold]
|
||||||
pub unsafe fn error_from_handle(db: *mut ffi::sqlite3, code: c_int) -> Error {
|
pub unsafe fn error_from_handle(db: *mut ffi::sqlite3, code: c_int) -> Error {
|
||||||
let message = if db.is_null() {
|
error_from_sqlite_code(code, error_msg(db, code))
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe fn error_msg(db: *mut ffi::sqlite3, code: c_int) -> Option<String> {
|
||||||
|
if db.is_null() || ffi::sqlite3_errcode(db) != code {
|
||||||
|
let err_str = ffi::sqlite3_errstr(code);
|
||||||
|
if err_str.is_null() {
|
||||||
None
|
None
|
||||||
|
} else {
|
||||||
|
Some(errmsg_to_string(err_str))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Some(errmsg_to_string(ffi::sqlite3_errmsg(db)))
|
Some(errmsg_to_string(ffi::sqlite3_errmsg(db)))
|
||||||
};
|
}
|
||||||
error_from_sqlite_code(code, message)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn decode_result_raw(db: *mut ffi::sqlite3, code: c_int) -> Result<()> {
|
pub unsafe fn decode_result_raw(db: *mut ffi::sqlite3, code: c_int) -> Result<()> {
|
||||||
@ -443,19 +451,19 @@ pub unsafe fn error_with_offset(db: *mut ffi::sqlite3, code: c_int, sql: &str) -
|
|||||||
error_from_sqlite_code(code, None)
|
error_from_sqlite_code(code, None)
|
||||||
} else {
|
} else {
|
||||||
let error = ffi::Error::new(code);
|
let error = ffi::Error::new(code);
|
||||||
let msg = errmsg_to_string(ffi::sqlite3_errmsg(db));
|
let msg = error_msg(db, code);
|
||||||
if ffi::ErrorCode::Unknown == error.code {
|
if ffi::ErrorCode::Unknown == error.code {
|
||||||
let offset = ffi::sqlite3_error_offset(db);
|
let offset = ffi::sqlite3_error_offset(db);
|
||||||
if offset >= 0 {
|
if offset >= 0 {
|
||||||
return Error::SqlInputError {
|
return Error::SqlInputError {
|
||||||
error,
|
error,
|
||||||
msg,
|
msg: msg.unwrap_or("error".to_owned()),
|
||||||
sql: sql.to_owned(),
|
sql: sql.to_owned(),
|
||||||
offset,
|
offset,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Error::SqliteFailure(error, Some(msg))
|
Error::SqliteFailure(error, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1286,7 +1286,10 @@ mod test {
|
|||||||
let mut stmt = conn.prepare("")?;
|
let mut stmt = conn.prepare("")?;
|
||||||
assert_eq!(0, stmt.column_count());
|
assert_eq!(0, stmt.column_count());
|
||||||
stmt.parameter_index("test")?;
|
stmt.parameter_index("test")?;
|
||||||
stmt.step().unwrap_err();
|
let err = stmt.step().unwrap_err();
|
||||||
|
assert_eq!(err.sqlite_error_code(), Some(crate::ErrorCode::ApiMisuse));
|
||||||
|
// error msg is different with sqlcipher, so we use assert_ne:
|
||||||
|
assert_ne!(err.to_string(), "not an error".to_owned());
|
||||||
stmt.reset()?; // SQLITE_OMIT_AUTORESET = false
|
stmt.reset()?; // SQLITE_OMIT_AUTORESET = false
|
||||||
stmt.execute([]).unwrap_err();
|
stmt.execute([]).unwrap_err();
|
||||||
Ok(())
|
Ok(())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user