diff --git a/src/inner_connection.rs b/src/inner_connection.rs index fc4f4a1..e48623d 100644 --- a/src/inner_connection.rs +++ b/src/inner_connection.rs @@ -86,9 +86,14 @@ impl InnerConnection { let db: *mut ffi::sqlite3 = db.assume_init(); if r != ffi::SQLITE_OK { let e = if db.is_null() { - error_from_sqlite_code(r, None) + error_from_sqlite_code(r, Some(c_path.to_string_lossy().to_string())) } else { - let e = error_from_handle(db, r); + let mut e = error_from_handle(db, r); + if let Error::SqliteFailure( + ffi::Error{code: ffi::ErrorCode::CannotOpen, extended_code: _}, Some(msg)) = e { + e = Error::SqliteFailure( + ffi::Error::new(r), Some(format!("{}: {}", msg, c_path.to_string_lossy()))); + } ffi::sqlite3_close(db); e }; diff --git a/src/lib.rs b/src/lib.rs index 7e302d9..ed74003 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -957,6 +957,21 @@ mod test { assert!(db.close().is_ok()); } + #[test] + fn test_open_failure() { + let filename = "no_such_file.db"; + let result = Connection::open_with_flags(filename, OpenFlags::SQLITE_OPEN_READ_ONLY); + assert!(!result.is_ok()); + let err = result.err().unwrap(); + if let Error::SqliteFailure(e, Some(msg)) = err { + assert_eq!(ErrorCode::CannotOpen, e.code); + assert_eq!(ffi::SQLITE_CANTOPEN, e.extended_code); + assert!(msg.contains(filename), "error message '{}' does not contain '{}'", msg, filename); + } else { + panic!("SqliteFailure expected"); + } + } + #[test] fn test_close_retry() { let db = checked_memory_handle();