Skip to main content

icydb_core/db/session/
mod.rs

1//! Module: session
2//! Responsibility: user-facing query/write execution facade over db executors.
3//! Does not own: planning semantics, cursor validation rules, or storage mutation protocol.
4//! Boundary: converts fluent/query intent calls into executor operations and response DTOs.
5
6mod accepted_schema;
7mod bounded_cache;
8mod catalog;
9mod integrity;
10mod mutation_job;
11mod query;
12mod read_set;
13mod request;
14mod response;
15mod resumable_job;
16#[cfg(feature = "sql")]
17mod sql;
18mod write;
19
20#[cfg(all(test, feature = "sql"))]
21mod tests;
22
23use crate::{
24    db::{Db, StoreRegistry},
25    traits::CanisterKind,
26};
27use std::thread::LocalKey;
28
29pub(in crate::db) use accepted_schema::AcceptedSchemaCatalogContext;
30pub(in crate::db) use bounded_cache::CacheEntryWeight;
31#[cfg(feature = "sql")]
32pub(in crate::db) use query::QueryPlanCacheReuse;
33#[doc(hidden)]
34pub use query::{
35    MAX_TYPED_EXACT_KEY_BATCH_INPUT_BYTES, MAX_TYPED_EXACT_KEY_BATCH_ITEMS,
36    MAX_TYPED_EXACT_KEY_BATCH_RESULT_BYTES, MAX_TYPED_EXACT_KEY_BATCH_STORED_BYTES,
37};
38pub use request::RequestExecutionRoot;
39pub(in crate::db) use request::RequestExecutionScope;
40pub(in crate::db) use response::finalize_structural_grouped_projection_result;
41pub(in crate::db) use response::grouped_cursor_from_bytes;
42#[cfg(feature = "sql")]
43pub use sql::{
44    SqlConstraintValidationPage, SqlConstraintValidationRevisionStatus,
45    SqlConstraintValidationState, SqlDdlExecutionStatus, SqlDdlMutationKind,
46    SqlDdlPreparationReport, SqlIntegrityError, SqlStatementDispatch, SqlStatementResult,
47    SqlStatementShellSurface, SqlStatementSurface, sql_statement_dispatch,
48    sql_statement_shell_surface, sql_statement_surface,
49};
50#[cfg(feature = "sql")]
51pub(in crate::db::session) use write::{
52    AcceptedStructuralMutation, AcceptedStructuralMutationTarget,
53};
54
55///
56/// DbSession
57///
58/// Session-scoped database handle with execution routing.
59///
60
61pub struct DbSession<C: CanisterKind> {
62    db: Db<C>,
63}
64
65impl<C: CanisterKind> DbSession<C> {
66    /// Construct one session facade over a sealed runtime store registry.
67    #[must_use]
68    pub fn new(
69        store: &'static LocalKey<StoreRegistry>,
70        request_root: &RequestExecutionRoot,
71    ) -> Self {
72        Self {
73            db: Db::new(store, request_root.scope()),
74        }
75    }
76
77    /// Drive one bounded startup page while retaining its persisted failure owner.
78    pub(in crate::db) fn drive_startup_recovery_page_with_failure_authority(
79        &self,
80    ) -> Result<bool, crate::db::commit::StartupRecoveryFailure> {
81        self.db.drive_startup_recovery_page_with_failure_authority()
82    }
83
84    /// Construct a session from the active synchronous request scope.
85    ///
86    /// Generated zero-argument `db!()` wiring uses this entry. `None` means
87    /// that the caller did not establish a request execution boundary.
88    #[doc(hidden)]
89    #[must_use]
90    pub fn __new_from_current_request(store: &'static LocalKey<StoreRegistry>) -> Option<Self> {
91        request::current_request_scope().map(|scope| Self {
92            db: Db::new(store, scope),
93        })
94    }
95}