Merge pull request #1606 from gwenn/sqlite3_errstr

Use sqlite3_errstr
This commit is contained in:
gwenn 2024-12-07 11:08:18 +01:00 committed by GitHub
commit 5ae7b5c5db
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 8 deletions

View File

@ -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)
} }
} }

View File

@ -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(())