Transaction
This commit is contained in:
parent
ddcdd33bd5
commit
f9ba6eeb1f
@ -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"),
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
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::{
|
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 {
|
||||||
|
@ -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(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user