From 9109dbf8ec8d0efa2d1441843d25d2c12254bfca Mon Sep 17 00:00:00 2001 From: Lemon-Peppermint <141275572+Lemon-Peppermint@users.noreply.github.com> Date: Wed, 1 Jan 2025 11:47:12 +0200 Subject: [PATCH] Add changes tracking to the 'Connection' struct + 'Insn::InsertAwait' now affects changes counter --- core/lib.rs | 6 ++++++ core/translate/expr.rs | 18 ++++++++++++------ core/vdbe/mod.rs | 13 +++++++++---- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/core/lib.rs b/core/lib.rs index 124c16b57..affe137b8 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -141,6 +141,8 @@ impl Database { header, transaction_state: RefCell::new(TransactionState::None), last_insert_rowid: Cell::new(0), + last_change: Cell::new(0), + total_changes: Cell::new(0), }); let rows = conn.query("SELECT * FROM sqlite_schema")?; let mut schema = schema.borrow_mut(); @@ -156,6 +158,8 @@ impl Database { header: self.header.clone(), last_insert_rowid: Cell::new(0), transaction_state: RefCell::new(TransactionState::None), + last_change: Cell::new(0), + total_changes: Cell::new(0), }) } @@ -231,6 +235,8 @@ pub struct Connection { header: Rc>, transaction_state: RefCell, last_insert_rowid: Cell, + last_change: Cell, + total_changes: Cell, } impl Connection { diff --git a/core/translate/expr.rs b/core/translate/expr.rs index 4ac6654c0..223ddf4fb 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -1012,11 +1012,14 @@ pub fn translate_expr( unreachable!("this is always ast::Expr::Cast") } ScalarFunc::Changes => { - if let Some(args) = args{ - crate::bail_parse_error!("{} fucntion with more than 0 arguments", srf); + if let Some(_) = args { + crate::bail_parse_error!( + "{} fucntion with more than 0 arguments", + srf + ); } let start_reg = program.alloc_register(); - program.emit_insn(Insn::Function{ + program.emit_insn(Insn::Function { constant_mask: 0, start_reg, dest: target_register, @@ -1515,11 +1518,14 @@ pub fn translate_expr( Ok(target_register) } ScalarFunc::TotalChanges => { - if let Some(args) = args { - crate::bail_parse_error!("{} fucntion with more than 0 arguments", srf.to_string()); + if let Some(_) = args { + crate::bail_parse_error!( + "{} fucntion with more than 0 arguments", + srf.to_string() + ); } let start_reg = program.alloc_register(); - program.emit_insn(Insn::Function{ + program.emit_insn(Insn::Function { constant_mask: 0, start_reg, dest: target_register, diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index c3612c8ae..d70a0d960 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -1322,8 +1322,9 @@ impl Program { state.registers[*dest] = result; } ScalarFunc::Changes => { - //placeholder - state.registers[*dest] = OwnedValue::Integer(0); + let res = &self.connection.upgrade().unwrap().last_change; + let changes = res.get(); + state.registers[*dest] = OwnedValue::Integer(changes); } ScalarFunc::Char => { let reg_values = @@ -1534,8 +1535,9 @@ impl Program { state.registers[*dest] = result; } ScalarFunc::TotalChanges => { - //placeholder - state.registers[*dest] = OwnedValue::Integer(0); + let res = &self.connection.upgrade().unwrap().total_changes; + let total_changes = res.get(); + state.registers[*dest] = OwnedValue::Integer(total_changes); } ScalarFunc::UnixEpoch => { if *start_reg == 0 { @@ -1739,6 +1741,9 @@ impl Program { if let Some(rowid) = cursor.rowid()? { if let Some(conn) = self.connection.upgrade() { conn.update_last_rowid(rowid); + let prev_total_changes = conn.total_changes.get(); + conn.last_change.set(1); + conn.total_changes.set(prev_total_changes + 1); } } }