From d2a71a1352fc67d7cb3516be854445e7b7c14532 Mon Sep 17 00:00:00 2001 From: gwenn Date: Sat, 10 Mar 2018 19:17:22 +0100 Subject: [PATCH] Improve error message when we can't open a database Ensure the error message contains the database path --- src/lib.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3d497b8..f36704a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -756,9 +756,14 @@ impl InnerConnection { let r = ffi::sqlite3_open_v2(c_path.as_ptr(), &mut db, flags.bits(), ptr::null()); 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 }; @@ -951,6 +956,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();