Transaction

This commit is contained in:
Chris Tsang 2021-06-19 16:41:47 +08:00
parent ddcdd33bd5
commit f9ba6eeb1f
6 changed files with 47 additions and 13 deletions

View File

@ -94,6 +94,7 @@ impl DatabaseConnection {
pub fn as_mock_connection(&self) -> &MockDatabaseConnection { pub fn as_mock_connection(&self) -> &MockDatabaseConnection {
match self { match self {
#[cfg(feature = "mock")]
DatabaseConnection::MockDatabaseConnection(mock_conn) => mock_conn, DatabaseConnection::MockDatabaseConnection(mock_conn) => mock_conn,
_ => panic!("not mock connection"), _ => panic!("not mock connection"),
} }

View File

@ -1,14 +1,14 @@
use crate::{ use crate::{
Database, DatabaseConnection, EntityTrait, ExecErr, ExecResult, ExecResultHolder, Iden, Database, DatabaseConnection, EntityTrait, ExecErr, ExecResult, ExecResultHolder, Iden,
Iterable, MockDatabaseConnection, MockDatabaseTrait, ModelTrait, QueryErr, QueryResult, Iterable, MockDatabaseConnection, MockDatabaseTrait, ModelTrait, QueryErr, QueryResult,
QueryResultRow, Statement, TypeErr, QueryResultRow, Statement, Transaction, TypeErr,
}; };
use sea_query::{Value, ValueType}; use sea_query::{Value, ValueType};
use std::collections::BTreeMap; use std::collections::BTreeMap;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct MockDatabase { pub struct MockDatabase {
transaction_log: Vec<Statement>, transaction_log: Vec<Transaction>,
exec_results: Vec<MockExecResult>, exec_results: Vec<MockExecResult>,
query_results: Vec<Vec<MockRow>>, query_results: Vec<Vec<MockRow>>,
} }
@ -73,7 +73,7 @@ impl MockDatabase {
impl MockDatabaseTrait for MockDatabase { impl MockDatabaseTrait for MockDatabase {
fn execute(&mut self, counter: usize, statement: Statement) -> Result<ExecResult, ExecErr> { fn execute(&mut self, counter: usize, statement: Statement) -> Result<ExecResult, ExecErr> {
self.transaction_log.push(statement); self.transaction_log.push(Transaction::one(statement));
if counter < self.exec_results.len() { if counter < self.exec_results.len() {
Ok(ExecResult { Ok(ExecResult {
result: ExecResultHolder::Mock(std::mem::take(&mut self.exec_results[counter])), result: ExecResultHolder::Mock(std::mem::take(&mut self.exec_results[counter])),
@ -88,7 +88,7 @@ impl MockDatabaseTrait for MockDatabase {
counter: usize, counter: usize,
statement: Statement, statement: Statement,
) -> Result<Vec<QueryResult>, QueryErr> { ) -> Result<Vec<QueryResult>, QueryErr> {
self.transaction_log.push(statement); self.transaction_log.push(Transaction::one(statement));
if counter < self.query_results.len() { if counter < self.query_results.len() {
Ok(std::mem::take(&mut self.query_results[counter]) Ok(std::mem::take(&mut self.query_results[counter])
.into_iter() .into_iter()
@ -101,7 +101,7 @@ impl MockDatabaseTrait for MockDatabase {
} }
} }
fn drain_transaction_log(&mut self) -> Vec<Statement> { fn drain_transaction_log(&mut self) -> Vec<Transaction> {
std::mem::take(&mut self.transaction_log) std::mem::take(&mut self.transaction_log)
} }
} }

View File

@ -2,11 +2,13 @@ mod connection;
#[cfg(feature = "mock")] #[cfg(feature = "mock")]
mod mock; mod mock;
mod statement; mod statement;
mod transaction;
pub use connection::*; pub use connection::*;
#[cfg(feature = "mock")] #[cfg(feature = "mock")]
pub use mock::*; pub use mock::*;
pub use statement::*; pub use statement::*;
pub use transaction::*;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Database { pub struct Database {

View File

@ -0,0 +1,31 @@
use crate::Statement;
#[derive(Debug, Clone, PartialEq)]
pub struct Transaction {
stmts: Vec<Statement>,
}
impl Transaction {
/// Create a Transaction with one statement
pub fn one(stmt: Statement) -> Self {
Self { stmts: vec![stmt] }
}
/// Create a Transaction with many statements
pub fn many<I>(stmts: I) -> Self
where
I: IntoIterator<Item = Statement>,
{
Self {
stmts: stmts.into_iter().collect(),
}
}
/// Wrap each Statement as a single-statement Transaction
pub fn wrap<I>(stmts: I) -> Vec<Self>
where
I: IntoIterator<Item = Statement>,
{
stmts.into_iter().map(Self::one).collect()
}
}

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
debug_print, ConnectionErr, DatabaseConnection, ExecErr, ExecResult, MockDatabase, QueryErr, debug_print, ConnectionErr, DatabaseConnection, ExecErr, ExecResult, MockDatabase, QueryErr,
QueryResult, Statement, QueryResult, Statement, Transaction,
}; };
use std::sync::{ use std::sync::{
atomic::{AtomicUsize, Ordering}, atomic::{AtomicUsize, Ordering},
@ -19,7 +19,7 @@ pub trait MockDatabaseTrait: Send {
fn query(&mut self, counter: usize, stmt: Statement) -> Result<Vec<QueryResult>, QueryErr>; fn query(&mut self, counter: usize, stmt: Statement) -> Result<Vec<QueryResult>, QueryErr>;
fn drain_transaction_log(&mut self) -> Vec<Statement>; fn drain_transaction_log(&mut self) -> Vec<Transaction>;
} }
impl MockDatabaseConnector { impl MockDatabaseConnector {

View File

@ -105,7 +105,7 @@ where
mod tests { mod tests {
use crate::entity::prelude::*; use crate::entity::prelude::*;
use crate::tests_cfg::*; use crate::tests_cfg::*;
use crate::{Database, MockDatabase, QueryErr}; use crate::{Database, MockDatabase, QueryErr, Transaction};
use futures::TryStreamExt; use futures::TryStreamExt;
use sea_query::{Alias, Expr, SelectStatement, Value}; use sea_query::{Alias, Expr, SelectStatement, Value};
@ -181,7 +181,7 @@ mod tests {
.lock() .lock()
.unwrap(); .unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts); assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
Ok(()) Ok(())
} }
@ -221,7 +221,7 @@ mod tests {
.lock() .lock()
.unwrap(); .unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts); assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
Ok(()) Ok(())
} }
@ -259,7 +259,7 @@ mod tests {
.lock() .lock()
.unwrap(); .unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts); assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
Ok(()) Ok(())
} }
@ -316,7 +316,7 @@ mod tests {
.lock() .lock()
.unwrap(); .unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts); assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
Ok(()) Ok(())
} }
@ -354,7 +354,7 @@ mod tests {
.lock() .lock()
.unwrap(); .unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts); assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
Ok(()) Ok(())
} }
} }