From a016ed111bc4525420281f0f6fffb198c139a2e0 Mon Sep 17 00:00:00 2001 From: gwenn Date: Thu, 28 Mar 2024 20:32:07 +0100 Subject: [PATCH 1/3] Activate SQLITE_OPEN_EXRESCODE by default I am not completly sure that it is fine to activate this flag with an old SQLite version. See http://sqlite.org/c3ref/open.html > If the 3rd parameter to sqlite3_open_v2() is not one of the required combinations shown above optionally combined with other SQLITE_OPEN_* bits then the behavior is undefined. --- src/inner_connection.rs | 6 ++++-- src/lib.rs | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/inner_connection.rs b/src/inner_connection.rs index 0070b75..056f83a 100644 --- a/src/inner_connection.rs +++ b/src/inner_connection.rs @@ -12,6 +12,7 @@ use super::{Connection, InterruptHandle, OpenFlags, PrepFlags, Result}; use crate::error::{error_from_handle, error_from_sqlite_code, error_with_offset, Error}; use crate::raw_statement::RawStatement; use crate::statement::Statement; +use crate::version_number; pub struct InnerConnection { pub db: *mut ffi::sqlite3, @@ -99,7 +100,9 @@ impl InnerConnection { } // attempt to turn on extended results code; don't fail if we can't. - ffi::sqlite3_extended_result_codes(db, 1); + if version_number() < 3_037_000 || !flags.contains(OpenFlags::SQLITE_OPEN_EXRESCODE) { + ffi::sqlite3_extended_result_codes(db, 1); + } let r = ffi::sqlite3_busy_timeout(db, 5000); if r != ffi::SQLITE_OK { @@ -210,7 +213,6 @@ impl InnerConnection { let mut c_stmt: *mut ffi::sqlite3_stmt = ptr::null_mut(); let (c_sql, len, _) = str_for_sqlite(sql.as_bytes())?; let mut c_tail: *const c_char = ptr::null(); - // TODO sqlite3_prepare_v3 (https://sqlite.org/c3ref/c_prepare_normalize.html) // 3.20.0, #728 #[cfg(not(feature = "unlock_notify"))] let r = unsafe { self.prepare_(c_sql, len, flags, &mut c_stmt, &mut c_tail) }; #[cfg(feature = "unlock_notify")] diff --git a/src/lib.rs b/src/lib.rs index 7572908..2ca74bc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1214,6 +1214,7 @@ impl Default for OpenFlags { | OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_NO_MUTEX | OpenFlags::SQLITE_OPEN_URI + | OpenFlags::SQLITE_OPEN_EXRESCODE } } From f6dd9c3a2c2a3209140c3e44952112bc76c98091 Mon Sep 17 00:00:00 2001 From: gwenn Date: Thu, 28 Mar 2024 20:55:15 +0100 Subject: [PATCH 2/3] Always activate SQLITE_OPEN_EXRESCODE for SQLite >= 3.37.0 --- src/inner_connection.rs | 14 ++++++++++++-- src/lib.rs | 1 - 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/inner_connection.rs b/src/inner_connection.rs index 056f83a..801ea0f 100644 --- a/src/inner_connection.rs +++ b/src/inner_connection.rs @@ -61,7 +61,7 @@ impl InnerConnection { pub fn open_with_flags( c_path: &CStr, - flags: OpenFlags, + mut flags: OpenFlags, vfs: Option<&CStr>, ) -> Result { ensure_safe_sqlite_threading_mode()?; @@ -71,6 +71,16 @@ impl InnerConnection { None => ptr::null(), }; + // turn on extended results code before opening database to have a better diagnostic if a failure happens + let exrescode = if version_number() >= 3_037_000 { + if !flags.contains(OpenFlags::SQLITE_OPEN_EXRESCODE) { + flags |= OpenFlags::SQLITE_OPEN_EXRESCODE; + } + true + } else { + false // flag SQLITE_OPEN_EXRESCODE is ignored by SQLite version < 3.37.0 + }; + unsafe { let mut db: *mut ffi::sqlite3 = ptr::null_mut(); let r = ffi::sqlite3_open_v2(c_path.as_ptr(), &mut db, flags.bits(), z_vfs); @@ -100,7 +110,7 @@ impl InnerConnection { } // attempt to turn on extended results code; don't fail if we can't. - if version_number() < 3_037_000 || !flags.contains(OpenFlags::SQLITE_OPEN_EXRESCODE) { + if !exrescode { ffi::sqlite3_extended_result_codes(db, 1); } diff --git a/src/lib.rs b/src/lib.rs index 2ca74bc..7572908 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1214,7 +1214,6 @@ impl Default for OpenFlags { | OpenFlags::SQLITE_OPEN_CREATE | OpenFlags::SQLITE_OPEN_NO_MUTEX | OpenFlags::SQLITE_OPEN_URI - | OpenFlags::SQLITE_OPEN_EXRESCODE } } From 25787021b748261fba1f411dc7ab91d75a123d25 Mon Sep 17 00:00:00 2001 From: gwenn Date: Thu, 28 Mar 2024 21:03:42 +0100 Subject: [PATCH 3/3] Simplify code --- src/inner_connection.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/inner_connection.rs b/src/inner_connection.rs index 801ea0f..13d872f 100644 --- a/src/inner_connection.rs +++ b/src/inner_connection.rs @@ -73,9 +73,7 @@ impl InnerConnection { // turn on extended results code before opening database to have a better diagnostic if a failure happens let exrescode = if version_number() >= 3_037_000 { - if !flags.contains(OpenFlags::SQLITE_OPEN_EXRESCODE) { - flags |= OpenFlags::SQLITE_OPEN_EXRESCODE; - } + flags |= OpenFlags::SQLITE_OPEN_EXRESCODE; true } else { false // flag SQLITE_OPEN_EXRESCODE is ignored by SQLite version < 3.37.0