pub trait AtomicOperation: Send {
// Required method
fn as_executor(&mut self) -> &mut PgConnection;
// Provided methods
fn maybe_now(&self) -> Option<DateTime<Utc>> { ... }
fn clock(&self) -> &ClockHandle { ... }
fn add_commit_hook<H: CommitHook>(&mut self, hook: H) -> Result<(), H> { ... }
}Expand description
Trait to signify we can make multiple consistent database roundtrips.
Its a stand in for &mut sqlx::Transaction<'_, DB>.
The reason for having a trait is to support custom types that wrap the inner
transaction while providing additional functionality.
See DbOp or DbOpWithTime.
Required Methods§
Sourcefn as_executor(&mut self) -> &mut PgConnection
fn as_executor(&mut self) -> &mut PgConnection
Returns the sqlx::Executor implementation.
The desired way to represent this would actually be as a GAT:
trait AtomicOperation {
type Executor<'c>: sqlx::PgExecutor<'c>
where Self: 'c;
fn as_executor<'c>(&'c mut self) -> Self::Executor<'c>;
}But GATs don’t play well with async_trait::async_trait due to lifetime constraints
so we return the concrete &mut sqlx::PgConnection instead as a work around.
Since this trait is generally applied to types that wrap a sqlx::Transaction
there is no variance in the return type - so its fine.
Provided Methods§
Sourcefn maybe_now(&self) -> Option<DateTime<Utc>>
fn maybe_now(&self) -> Option<DateTime<Utc>>
Function for querying when the operation is taking place - if it is cached.
Sourcefn clock(&self) -> &ClockHandle
fn clock(&self) -> &ClockHandle
Returns the clock handle for time operations.
Default implementation returns the global clock handle.
Sourcefn add_commit_hook<H: CommitHook>(&mut self, hook: H) -> Result<(), H>
fn add_commit_hook<H: CommitHook>(&mut self, hook: H) -> Result<(), H>
Registers a commit hook that will run pre_commit before and post_commit after the transaction commits. Returns Ok(()) if the hook was registered, Err(hook) if hooks are not supported.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.