mod catalog;
pub mod delete;
pub(crate) mod generated;
pub mod load;
mod macros;
#[cfg(feature = "sql")]
mod sql;
mod write;
#[cfg(feature = "diagnostics")]
use crate::db::response::QueryResponse;
#[cfg(feature = "diagnostics")]
use crate::traits::Entity;
use crate::{
db::query::{MissingRowPolicy, Query, QueryTracePlan},
error::Error,
metrics::MetricsSink,
traits::CanisterKind,
};
use icydb_core as core;
pub use delete::SessionDeleteQuery;
pub use load::{FluentLoadQuery, PartialWindowLoadQuery};
#[cfg(feature = "sql")]
pub use sql::{
SqlExecutionPerfAttribution, SqlPureCoveringPerfAttribution, SqlQueryPerfAttribution,
};
pub use write::{MutationMode, StructuralPatch};
pub struct DbSession<C: CanisterKind> {
inner: core::db::DbSession<C>,
}
impl<C: CanisterKind> DbSession<C> {
#[cfg(feature = "diagnostics")]
fn query_response_from_core<E>(inner: core::db::LoadQueryResult<E>) -> QueryResponse<E>
where
E: Entity,
{
QueryResponse::from_core(inner)
}
#[must_use]
pub const fn new(session: core::db::DbSession<C>) -> Self {
Self { inner: session }
}
#[must_use]
pub const fn debug(mut self) -> Self {
self.inner = self.inner.debug();
self
}
#[must_use]
pub fn metrics_sink(mut self, sink: &'static dyn MetricsSink) -> Self {
self.inner = self.inner.metrics_sink(sink);
self
}
#[must_use]
pub const fn load<E>(&self) -> FluentLoadQuery<'_, E>
where
E: crate::traits::EntityFor<C>,
{
FluentLoadQuery {
inner: self.inner.load::<E>(),
}
}
#[must_use]
pub const fn load_with_consistency<E>(
&self,
consistency: MissingRowPolicy,
) -> FluentLoadQuery<'_, E>
where
E: crate::traits::EntityFor<C>,
{
FluentLoadQuery {
inner: self.inner.load_with_consistency::<E>(consistency),
}
}
#[cfg(feature = "diagnostics")]
#[doc(hidden)]
pub fn execute_query_result_with_attribution<E>(
&self,
query: &Query<E>,
) -> Result<(QueryResponse<E>, crate::db::QueryExecutionAttribution), Error>
where
E: crate::traits::EntityFor<C>,
{
let (result, attribution) = self.inner.execute_query_result_with_attribution(query)?;
Ok((Self::query_response_from_core(result), attribution))
}
#[must_use]
pub fn delete<E>(&self) -> SessionDeleteQuery<'_, E>
where
E: crate::traits::EntityFor<C>,
{
SessionDeleteQuery {
inner: self.inner.delete::<E>(),
}
}
#[must_use]
pub fn delete_with_consistency<E>(
&self,
consistency: MissingRowPolicy,
) -> SessionDeleteQuery<'_, E>
where
E: crate::traits::EntityFor<C>,
{
SessionDeleteQuery {
inner: self.inner.delete_with_consistency::<E>(consistency),
}
}
#[doc(hidden)]
pub fn trace_query<E>(&self, query: &Query<E>) -> Result<QueryTracePlan, Error>
where
E: crate::traits::EntityFor<C>,
{
Ok(self.inner.trace_query(query)?)
}
}