use super::*;
macro_rules! named_storage {
($name:ident, $inner:ident, $operation:ident,
$argument:ident: $input:ty, $output:ty, $validate:expr) => {
pub fn $name<O: $operation>(
&mut self,
$argument: $input,
) -> impl Future<Output = Result<$output, QueryFailure<$input>>> + Send {
saddle_admission::lazy_framework_future(move || {
if let Err(error) = O::validate_parameters($validate, &self.target()) {
return Err(Err(QueryFailure::Target {
parameters: $argument,
error,
}));
}
if self.state.reserved_failure.lock().unwrap().is_some() {
return Err(Err(QueryFailure::Database(ScopeDatabaseError::State)));
}
let memory = self.framework_future_memory();
let reporter = self.shared();
saddle_admission::managed_framework_future(
&memory,
move || {
#[cfg(test)]
controls::inner_constructed();
self.$inner::<O>($argument)
},
|error| reporter.record_database_future_error_at_source(error),
)
.map_err(|_| Err(QueryFailure::Database(ScopeDatabaseError::Resource)))
})
}
};
}
impl DatabaseRequest {
named_storage!(named_write, named_write_inner, GeneratedOwnedWrite,
parameters: O::NamedParameters, ManagedWriteResult, ¶meters);
named_storage!(named_rows, named_rows_inner, GeneratedOwnedQuery,
parameters: O::NamedParameters,
crate::database::Rows<O::Row, O::NamedRow>, ¶meters);
named_storage!(named_optional, named_optional_inner, GeneratedOwnedQuery,
parameters: O::NamedParameters, Option<O::NamedRow>, ¶meters);
named_storage!(named_probe, named_probe_inner, GeneratedOwnedQuery,
parameters: O::NamedParameters,
crate::database::MatchCardinality<O::NamedRow>, ¶meters);
named_storage!(named_page, named_page_inner, GeneratedPageQuery,
request: crate::database_rows::PageRequest<O>,
crate::database_rows::Page<O>, &request.parameters);
}
#[cfg(test)]
mod controls;