stoptime-rs/src/helpers.rs

75 lines
2.2 KiB
Rust

//! Some ORM helpers.
//!
//! These macros can be used to shorten repetative ORM queries.
#![allow(unused_macros)]
macro_rules! all {
($model_name:ident, $conn:expr) => {{
use diesel::associations::HasTable;
let table = $crate::models::$model_name::table();
table.load(&$conn)
}};
}
macro_rules! retrieve {
($model_name:ident, $primary_key:expr, $conn:expr) => {{
use diesel::associations::HasTable;
let table = $crate::models::$model_name::table();
table.find($primary_key).first(&$conn)
}};
}
macro_rules! create {
($model_name:ident, $object:expr, $conn:expr) => {{
use diesel::associations::HasTable;
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, Table};
let table = $crate::models::$model_name::table();
let primary_key = table.primary_key();
$conn.transaction::<$model_name, diesel::result::Error, _>(|| {
diesel::insert_into(table).values($object).execute(&$conn)?;
table.order(primary_key.desc()).first(&$conn)
})
}};
}
macro_rules! update {
($model_name:ident, $primary_key:expr, $object:expr, $conn:expr) => {{
use diesel::associations::HasTable;
let table = $crate::models::$model_name::table();
$conn.transaction::<_, diesel::result::Error, _>(|| {
diesel::update(table.find($primary_key))
.set($object)
.execute(&$conn)?;
table.find($primary_key).first(&$conn)
})
}};
}
macro_rules! destroy {
($model_name:ident, $primary_key:expr, $conn:expr) => {{
use diesel::associations::HasTable;
let table = $crate::models::$model_name::table();
let result: Result<$model_name, _> = get!($model_name, $primary_key, $conn);
match result {
Ok(_) => diesel::delete(table.find($primary_key)).execute(&$conn),
Err(e) => Err(e),
}
}};
}
macro_rules! destroy_all {
($model_name:ident, $conn:expr) => {{
use diesel::associations::HasTable;
use diesel::RunQueryDsl;
let table = $crate::models::$model_name::table();
diesel::delete(table).execute(&$conn)
}};
}