RelationDef
& RelationBuilder
are Send
& Sync
(#898)
* `RelationDef` & `RelationBuilder` are `Send` & `Sync` * [issues] add tests Co-authored-by: Chris Tsang <chris.2y3@outlook.com>
This commit is contained in:
parent
41116499e0
commit
83c6e4a4db
17
issues/892/Cargo.toml
Normal file
17
issues/892/Cargo.toml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
[workspace]
|
||||||
|
# A separate workspace
|
||||||
|
|
||||||
|
[package]
|
||||||
|
name = "sea-orm-issues-892"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = []
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tokio = { version = "1.20.0", features = ["rt-multi-thread", "macros"] }
|
||||||
|
|
||||||
|
[dependencies.sea-orm]
|
||||||
|
path = "../../" # remove this line in your own project
|
||||||
|
features = ["runtime-tokio-rustls", "sqlx-sqlite", "macros"]
|
||||||
|
default-features = false
|
19
issues/892/src/main.rs
Normal file
19
issues/892/src/main.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
use sea_orm::tests_cfg::{cake, cake_filling};
|
||||||
|
use sea_orm::{Database, DbErr, EntityTrait, JoinType, QuerySelect, RelationTrait};
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), DbErr> {
|
||||||
|
let db = Database::connect("sqlite::memory:").await?;
|
||||||
|
|
||||||
|
tokio::spawn(async move {
|
||||||
|
let _cakes = cake::Entity::find()
|
||||||
|
.join_rev(JoinType::InnerJoin, cake_filling::Relation::Cake.def())
|
||||||
|
.all(&db)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -62,7 +62,7 @@ pub struct RelationDef {
|
|||||||
/// `UPDATE` Operation is performed
|
/// `UPDATE` Operation is performed
|
||||||
pub on_update: Option<ForeignKeyAction>,
|
pub on_update: Option<ForeignKeyAction>,
|
||||||
/// Custom join ON condition
|
/// Custom join ON condition
|
||||||
pub on_condition: Option<Box<dyn Fn(DynIden, DynIden) -> Condition>>,
|
pub on_condition: Option<Box<dyn Fn(DynIden, DynIden) -> Condition + Send + Sync>>,
|
||||||
/// The name of foreign key constraint
|
/// The name of foreign key constraint
|
||||||
pub fk_name: Option<String>,
|
pub fk_name: Option<String>,
|
||||||
}
|
}
|
||||||
@ -85,7 +85,7 @@ impl std::fmt::Debug for RelationDef {
|
|||||||
|
|
||||||
fn debug_on_condition(
|
fn debug_on_condition(
|
||||||
d: &mut core::fmt::DebugStruct<'_, '_>,
|
d: &mut core::fmt::DebugStruct<'_, '_>,
|
||||||
on_condition: &Option<Box<dyn Fn(DynIden, DynIden) -> Condition>>,
|
on_condition: &Option<Box<dyn Fn(DynIden, DynIden) -> Condition + Send + Sync>>,
|
||||||
) {
|
) {
|
||||||
match on_condition {
|
match on_condition {
|
||||||
Some(func) => {
|
Some(func) => {
|
||||||
@ -118,7 +118,7 @@ where
|
|||||||
is_owner: bool,
|
is_owner: bool,
|
||||||
on_delete: Option<ForeignKeyAction>,
|
on_delete: Option<ForeignKeyAction>,
|
||||||
on_update: Option<ForeignKeyAction>,
|
on_update: Option<ForeignKeyAction>,
|
||||||
on_condition: Option<Box<dyn Fn(DynIden, DynIden) -> Condition>>,
|
on_condition: Option<Box<dyn Fn(DynIden, DynIden) -> Condition + Send + Sync>>,
|
||||||
fk_name: Option<String>,
|
fk_name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ impl RelationDef {
|
|||||||
/// );
|
/// );
|
||||||
pub fn on_condition<F>(mut self, f: F) -> Self
|
pub fn on_condition<F>(mut self, f: F) -> Self
|
||||||
where
|
where
|
||||||
F: Fn(DynIden, DynIden) -> Condition + 'static,
|
F: Fn(DynIden, DynIden) -> Condition + 'static + Send + Sync,
|
||||||
{
|
{
|
||||||
self.on_condition = Some(Box::new(f));
|
self.on_condition = Some(Box::new(f));
|
||||||
self
|
self
|
||||||
@ -270,7 +270,7 @@ where
|
|||||||
/// denoting the left-hand side and right-hand side table in the join expression.
|
/// denoting the left-hand side and right-hand side table in the join expression.
|
||||||
pub fn on_condition<F>(mut self, f: F) -> Self
|
pub fn on_condition<F>(mut self, f: F) -> Self
|
||||||
where
|
where
|
||||||
F: Fn(DynIden, DynIden) -> Condition + 'static,
|
F: Fn(DynIden, DynIden) -> Condition + 'static + Send + Sync,
|
||||||
{
|
{
|
||||||
self.on_condition = Some(Box::new(f));
|
self.on_condition = Some(Box::new(f));
|
||||||
self
|
self
|
||||||
@ -303,3 +303,19 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::{
|
||||||
|
tests_cfg::{cake, fruit},
|
||||||
|
RelationBuilder, RelationDef,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn assert_relation_traits() {
|
||||||
|
fn assert_send_sync<T: Send + Sync>() {}
|
||||||
|
|
||||||
|
assert_send_sync::<RelationDef>();
|
||||||
|
assert_send_sync::<RelationBuilder<cake::Entity, fruit::Entity>>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user