From 673a69d3c6129c20fd9db896757b4e79eac27ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 27 Feb 2024 02:16:15 +0100 Subject: [PATCH 1/4] expose total_changes() --- src/inner_connection.rs | 12 ++++++++++++ src/lib.rs | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/inner_connection.rs b/src/inner_connection.rs index 23c9c4a..8d86a48 100644 --- a/src/inner_connection.rs +++ b/src/inner_connection.rs @@ -288,6 +288,18 @@ impl InnerConnection { } } + #[inline] + pub fn total_changes(&self) -> u64 { + #[cfg(not(feature = "modern_sqlite"))] + unsafe { + ffi::sqlite3_total_changes(self.db()) as u64 + } + #[cfg(feature = "modern_sqlite")] // 3.37.0 + unsafe { + ffi::sqlite3_total_changes64(self.db()) as u64 + } + } + #[inline] pub fn is_autocommit(&self) -> bool { unsafe { ffi::sqlite3_get_autocommit(self.db()) != 0 } diff --git a/src/lib.rs b/src/lib.rs index d5a8f0d..64542cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1005,6 +1005,16 @@ impl Connection { self.db.borrow().changes() } + /// Return the total number of rows modified, inserted or deleted by all + /// completed INSERT, UPDATE or DELETE statements since the database + /// connection was opened, including those executed as part of trigger programs. + /// + /// See + #[inline] + pub fn total_changes(&self) -> u64 { + self.db.borrow().total_changes() + } + /// Test for auto-commit mode. /// Autocommit mode is on by default. #[inline] From 87e5e192e5d1c28746b2b9d3be5e284f077e3211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 27 Feb 2024 14:53:50 +0100 Subject: [PATCH 2/4] test_total_changes --- src/lib.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 64542cc..87474c3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1703,6 +1703,27 @@ mod test { Ok(()) } + #[test] + fn test_total_changes() -> Result<()> { + let db = Connection::open_in_memory()?; + let sql = "CREATE TABLE foo(x INTEGER PRIMARY KEY, value TEXT defaut '' NOT NULL, + desc TEXT default ''); + CREATE VIEW foo_bar AS SELECT x, desc FROM foo WHERE value = 'bar'; + CREATE TRIGGER INSERT_FOOBAR + INSTEAD OF INSERT + ON foo_bar + BEGIN + INSERT INTO foo VALUES(new.x, 'bar', new.desc); + END;"; + db.execute_batch(sql)?; + let total_changes_before = db.total_changes(); + let changes = db.prepare("INSERT INTO foo_bar VALUES(null, 'baz');")?.execute([])?; + let total_changes_after = db.total_changes(); + assert_eq!(changes, 0); + assert_eq!(total_changes_after - total_changes_before, 1); + Ok(()) + } + #[test] fn test_is_autocommit() -> Result<()> { let db = Connection::open_in_memory()?; From 695651ec32e4ce465b236bd2b9c23126fd317096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 27 Feb 2024 14:57:58 +0100 Subject: [PATCH 3/4] typo --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 87474c3..e66b75b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1706,7 +1706,7 @@ mod test { #[test] fn test_total_changes() -> Result<()> { let db = Connection::open_in_memory()?; - let sql = "CREATE TABLE foo(x INTEGER PRIMARY KEY, value TEXT defaut '' NOT NULL, + let sql = "CREATE TABLE foo(x INTEGER PRIMARY KEY, value TEXT default '' NOT NULL, desc TEXT default ''); CREATE VIEW foo_bar AS SELECT x, desc FROM foo WHERE value = 'bar'; CREATE TRIGGER INSERT_FOOBAR From c91face5521ff8db6843a9df4d2ee62e35082dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 27 Feb 2024 15:02:46 +0100 Subject: [PATCH 4/4] format --- src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index e66b75b..8a25e70 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1717,7 +1717,9 @@ mod test { END;"; db.execute_batch(sql)?; let total_changes_before = db.total_changes(); - let changes = db.prepare("INSERT INTO foo_bar VALUES(null, 'baz');")?.execute([])?; + let changes = db + .prepare("INSERT INTO foo_bar VALUES(null, 'baz');")? + .execute([])?; let total_changes_after = db.total_changes(); assert_eq!(changes, 0); assert_eq!(total_changes_after - total_changes_before, 1);