Transaction
This commit is contained in:
parent
ddcdd33bd5
commit
f9ba6eeb1f
@ -94,6 +94,7 @@ impl DatabaseConnection {
|
||||
|
||||
pub fn as_mock_connection(&self) -> &MockDatabaseConnection {
|
||||
match self {
|
||||
#[cfg(feature = "mock")]
|
||||
DatabaseConnection::MockDatabaseConnection(mock_conn) => mock_conn,
|
||||
_ => panic!("not mock connection"),
|
||||
}
|
||||
|
@ -1,14 +1,14 @@
|
||||
use crate::{
|
||||
Database, DatabaseConnection, EntityTrait, ExecErr, ExecResult, ExecResultHolder, Iden,
|
||||
Iterable, MockDatabaseConnection, MockDatabaseTrait, ModelTrait, QueryErr, QueryResult,
|
||||
QueryResultRow, Statement, TypeErr,
|
||||
QueryResultRow, Statement, Transaction, TypeErr,
|
||||
};
|
||||
use sea_query::{Value, ValueType};
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
pub struct MockDatabase {
|
||||
transaction_log: Vec<Statement>,
|
||||
transaction_log: Vec<Transaction>,
|
||||
exec_results: Vec<MockExecResult>,
|
||||
query_results: Vec<Vec<MockRow>>,
|
||||
}
|
||||
@ -73,7 +73,7 @@ impl MockDatabase {
|
||||
|
||||
impl MockDatabaseTrait for MockDatabase {
|
||||
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() {
|
||||
Ok(ExecResult {
|
||||
result: ExecResultHolder::Mock(std::mem::take(&mut self.exec_results[counter])),
|
||||
@ -88,7 +88,7 @@ impl MockDatabaseTrait for MockDatabase {
|
||||
counter: usize,
|
||||
statement: Statement,
|
||||
) -> Result<Vec<QueryResult>, QueryErr> {
|
||||
self.transaction_log.push(statement);
|
||||
self.transaction_log.push(Transaction::one(statement));
|
||||
if counter < self.query_results.len() {
|
||||
Ok(std::mem::take(&mut self.query_results[counter])
|
||||
.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)
|
||||
}
|
||||
}
|
||||
|
@ -2,11 +2,13 @@ mod connection;
|
||||
#[cfg(feature = "mock")]
|
||||
mod mock;
|
||||
mod statement;
|
||||
mod transaction;
|
||||
|
||||
pub use connection::*;
|
||||
#[cfg(feature = "mock")]
|
||||
pub use mock::*;
|
||||
pub use statement::*;
|
||||
pub use transaction::*;
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
pub struct Database {
|
||||
|
31
src/database/transaction.rs
Normal file
31
src/database/transaction.rs
Normal 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()
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
debug_print, ConnectionErr, DatabaseConnection, ExecErr, ExecResult, MockDatabase, QueryErr,
|
||||
QueryResult, Statement,
|
||||
QueryResult, Statement, Transaction,
|
||||
};
|
||||
use std::sync::{
|
||||
atomic::{AtomicUsize, Ordering},
|
||||
@ -19,7 +19,7 @@ pub trait MockDatabaseTrait: Send {
|
||||
|
||||
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 {
|
||||
|
@ -105,7 +105,7 @@ where
|
||||
mod tests {
|
||||
use crate::entity::prelude::*;
|
||||
use crate::tests_cfg::*;
|
||||
use crate::{Database, MockDatabase, QueryErr};
|
||||
use crate::{Database, MockDatabase, QueryErr, Transaction};
|
||||
use futures::TryStreamExt;
|
||||
use sea_query::{Alias, Expr, SelectStatement, Value};
|
||||
|
||||
@ -181,7 +181,7 @@ mod tests {
|
||||
.lock()
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(mocker.drain_transaction_log(), stmts);
|
||||
assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -221,7 +221,7 @@ mod tests {
|
||||
.lock()
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(mocker.drain_transaction_log(), stmts);
|
||||
assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -259,7 +259,7 @@ mod tests {
|
||||
.lock()
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(mocker.drain_transaction_log(), stmts);
|
||||
assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -316,7 +316,7 @@ mod tests {
|
||||
.lock()
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(mocker.drain_transaction_log(), stmts);
|
||||
assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -354,7 +354,7 @@ mod tests {
|
||||
.lock()
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(mocker.drain_transaction_log(), stmts);
|
||||
assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts));
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user