diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index 9979f3e1e..d1c85ca45 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -1130,38 +1130,7 @@ impl Program { ))); } } - let connection = self - .connection - .upgrade() - .expect("only weak ref to connection?"); - let auto_commit = *connection.auto_commit.borrow(); - tracing::trace!("Halt auto_commit {}", auto_commit); - let current_state = connection.transaction_state.borrow().clone(); - if current_state == TransactionState::Read { - pager.end_read_tx()?; - return Ok(StepResult::Done); - } - return if auto_commit { - match pager.end_tx() { - Ok(crate::storage::wal::CheckpointStatus::IO) => Ok(StepResult::IO), - Ok(crate::storage::wal::CheckpointStatus::Done(_)) => { - if self.change_cnt_on { - if let Some(conn) = self.connection.upgrade() { - conn.set_changes(self.n_change.get()); - } - } - Ok(StepResult::Done) - } - Err(e) => Err(e), - } - } else { - if self.change_cnt_on { - if let Some(conn) = self.connection.upgrade() { - conn.set_changes(self.n_change.get()); - } - } - return Ok(StepResult::Done); - }; + return self.halt(pager); } Insn::Transaction { write } => { let connection = self.connection.upgrade().unwrap(); @@ -2773,6 +2742,41 @@ impl Program { } } } + + fn halt(&self, pager: Rc) -> Result { + let connection = self + .connection + .upgrade() + .expect("only weak ref to connection?"); + let auto_commit = *connection.auto_commit.borrow(); + tracing::trace!("Halt auto_commit {}", auto_commit); + let current_state = connection.transaction_state.borrow().clone(); + if current_state == TransactionState::Read { + pager.end_read_tx()?; + return Ok(StepResult::Done); + } + return if auto_commit { + match pager.end_tx() { + Ok(crate::storage::wal::CheckpointStatus::IO) => Ok(StepResult::IO), + Ok(crate::storage::wal::CheckpointStatus::Done(_)) => { + if self.change_cnt_on { + if let Some(conn) = self.connection.upgrade() { + conn.set_changes(self.n_change.get()); + } + } + Ok(StepResult::Done) + } + Err(e) => Err(e), + } + } else { + if self.change_cnt_on { + if let Some(conn) = self.connection.upgrade() { + conn.set_changes(self.n_change.get()); + } + } + return Ok(StepResult::Done); + }; + } } fn get_new_rowid(cursor: &mut BTreeCursor, mut rng: R) -> Result> {