|
|
|
@ -206,87 +206,44 @@ macro_rules! db_run {
|
|
|
|
|
// Different code for each db
|
|
|
|
|
( $conn:ident: $( $($db:ident),+ $body:block )+ ) => {{
|
|
|
|
|
#[allow(unused)] use diesel::prelude::*;
|
|
|
|
|
#[allow(unused)] use crate::db::FromDb;
|
|
|
|
|
|
|
|
|
|
// It is important that this inner Arc<Mutex<>> (or the OwnedMutexGuard
|
|
|
|
|
// derived from it) never be a variable on the stack at an await point,
|
|
|
|
|
// where Drop might be called at any time. This causes (synchronous)
|
|
|
|
|
// Drop to be called from asynchronous code, which some database
|
|
|
|
|
// wrappers do not or can not handle.
|
|
|
|
|
let conn = $conn.conn.clone();
|
|
|
|
|
let mut conn = conn.lock_owned().await;
|
|
|
|
|
match conn.as_mut().expect("internal invariant broken: self.connection is Some") {
|
|
|
|
|
$($(
|
|
|
|
|
#[cfg($db)]
|
|
|
|
|
crate::db::DbConnInner::$db($conn) => {
|
|
|
|
|
paste::paste! {
|
|
|
|
|
#[allow(unused)] use crate::db::[<__ $db _schema>]::{self as schema, *};
|
|
|
|
|
#[allow(unused)] use [<__ $db _model>]::*;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Since connection can't be on the stack in an async fn during an
|
|
|
|
|
// await, we have to spawn a new blocking-safe thread...
|
|
|
|
|
/*
|
|
|
|
|
run_blocking(move || {
|
|
|
|
|
// And then re-enter the runtime to wait on the async mutex, but in
|
|
|
|
|
// a blocking fashion.
|
|
|
|
|
let mut conn = tokio::runtime::Handle::current().block_on(conn.lock_owned());
|
|
|
|
|
let conn = conn.as_mut().expect("internal invariant broken: self.connection is Some");
|
|
|
|
|
*/
|
|
|
|
|
let mut __conn_mutex = conn.try_lock_owned().unwrap();
|
|
|
|
|
let conn = __conn_mutex.as_mut().unwrap();
|
|
|
|
|
match conn {
|
|
|
|
|
$($(
|
|
|
|
|
#[cfg($db)]
|
|
|
|
|
crate::db::DbConnInner::$db($conn) => {
|
|
|
|
|
paste::paste! {
|
|
|
|
|
#[allow(unused)] use crate::db::[<__ $db _schema>]::{self as schema, *};
|
|
|
|
|
#[allow(unused)] use [<__ $db _model>]::*;
|
|
|
|
|
#[allow(unused)] use crate::db::FromDb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
// Since connection can't be on the stack in an async fn during an
|
|
|
|
|
// await, we have to spawn a new blocking-safe thread...
|
|
|
|
|
run_blocking(move || {
|
|
|
|
|
// And then re-enter the runtime to wait on the async mutex, but in
|
|
|
|
|
// a blocking fashion.
|
|
|
|
|
let mut conn = tokio::runtime::Handle::current().block_on(async {
|
|
|
|
|
conn.lock_owned().await
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let conn = conn.as_mut().expect("internal invariant broken: self.connection is Some");
|
|
|
|
|
f(conn)
|
|
|
|
|
}).await;*/
|
|
|
|
|
|
|
|
|
|
$body
|
|
|
|
|
},
|
|
|
|
|
)+)+
|
|
|
|
|
}
|
|
|
|
|
// }).await
|
|
|
|
|
tokio::task::block_in_place(move || { $body }) // Run blocking can't be used due to the 'static limitation, use block_in_place instead
|
|
|
|
|
},
|
|
|
|
|
)+)+
|
|
|
|
|
}
|
|
|
|
|
}};
|
|
|
|
|
|
|
|
|
|
( @raw $conn:ident: $( $($db:ident),+ $body:block )+ ) => {{
|
|
|
|
|
#[allow(unused)] use diesel::prelude::*;
|
|
|
|
|
#[allow(unused)] use crate::db::FromDb;
|
|
|
|
|
|
|
|
|
|
// It is important that this inner Arc<Mutex<>> (or the OwnedMutexGuard
|
|
|
|
|
// derived from it) never be a variable on the stack at an await point,
|
|
|
|
|
// where Drop might be called at any time. This causes (synchronous)
|
|
|
|
|
// Drop to be called from asynchronous code, which some database
|
|
|
|
|
// wrappers do not or can not handle.
|
|
|
|
|
let conn = $conn.conn.clone();
|
|
|
|
|
let mut conn = conn.lock_owned().await;
|
|
|
|
|
match conn.as_mut().expect("internal invariant broken: self.connection is Some") {
|
|
|
|
|
$($(
|
|
|
|
|
#[cfg($db)]
|
|
|
|
|
crate::db::DbConnInner::$db($conn) => {
|
|
|
|
|
paste::paste! {
|
|
|
|
|
#[allow(unused)] use crate::db::[<__ $db _schema>]::{self as schema, *};
|
|
|
|
|
// @ RAW: #[allow(unused)] use [<__ $db _model>]::*;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Since connection can't be on the stack in an async fn during an
|
|
|
|
|
// await, we have to spawn a new blocking-safe thread...
|
|
|
|
|
run_blocking(move || {
|
|
|
|
|
// And then re-enter the runtime to wait on the async mutex, but in
|
|
|
|
|
// a blocking fashion.
|
|
|
|
|
let mut conn = tokio::runtime::Handle::current().block_on(conn.lock_owned());
|
|
|
|
|
match conn.as_mut().expect("internal invariant broken: self.connection is Some") {
|
|
|
|
|
$($(
|
|
|
|
|
#[cfg($db)]
|
|
|
|
|
crate::db::DbConnInner::$db($conn) => {
|
|
|
|
|
paste::paste! {
|
|
|
|
|
#[allow(unused)] use crate::db::[<__ $db _schema>]::{self as schema, *};
|
|
|
|
|
// @RAW: #[allow(unused)] use [<__ $db _model>]::*;
|
|
|
|
|
#[allow(unused)] use crate::db::FromDb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$body
|
|
|
|
|
},
|
|
|
|
|
)+)+
|
|
|
|
|
}
|
|
|
|
|
}).await
|
|
|
|
|
tokio::task::block_in_place(move || { $body }) // Run blocking can't be used due to the 'static limitation, use block_in_place instead
|
|
|
|
|
},
|
|
|
|
|
)+)+
|
|
|
|
|
}
|
|
|
|
|
}};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|