| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -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
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            )+)+ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |