pub struct PostgresResultBackend { /* private fields */ }Expand description
PostgreSQL-backed result storage.
Results are stored in the kojin_results table as JSONB with a configurable
TTL (default 24 hours). Group state is tracked in kojin_groups.
Important: call migrate() before first use to create
the required tables and indexes.
Implementations§
Source§impl PostgresResultBackend
impl PostgresResultBackend
Sourcepub async fn connect(url: &str) -> TaskResult<Self>
pub async fn connect(url: &str) -> TaskResult<Self>
Connect to PostgreSQL by URL and create the backend.
This is a convenience wrapper around PgPool::connect + new.
Sourcepub fn with_ttl(self, ttl: Duration) -> Self
pub fn with_ttl(self, ttl: Duration) -> Self
Override the result TTL (time-to-live).
Expired results are not automatically deleted; they are filtered out at
read time. Run periodic cleanup queries against kojin_results.expires_at
if storage reclamation is needed. Defaults to 24 hours if not called.
Sourcepub async fn migrate(&self) -> TaskResult<()>
pub async fn migrate(&self) -> TaskResult<()>
Run migrations to create the required tables (kojin_results, kojin_groups)
and indexes. Safe to call multiple times — all statements use IF NOT EXISTS.
Trait Implementations§
Source§impl ResultBackend for PostgresResultBackend
impl ResultBackend for PostgresResultBackend
Source§fn store<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
result: &'life2 Value,
) -> Pin<Box<dyn Future<Output = TaskResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn store<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
result: &'life2 Value,
) -> Pin<Box<dyn Future<Output = TaskResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
) -> Pin<Box<dyn Future<Output = TaskResult<Option<Value>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
) -> Pin<Box<dyn Future<Output = TaskResult<Option<Value>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn wait<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
timeout: Duration,
) -> Pin<Box<dyn Future<Output = TaskResult<Value>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn wait<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
timeout: Duration,
) -> Pin<Box<dyn Future<Output = TaskResult<Value>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
) -> Pin<Box<dyn Future<Output = TaskResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 TaskId,
) -> Pin<Box<dyn Future<Output = TaskResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn init_group<'life0, 'life1, 'async_trait>(
&'life0 self,
group_id: &'life1 str,
total: u32,
) -> Pin<Box<dyn Future<Output = TaskResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn init_group<'life0, 'life1, 'async_trait>(
&'life0 self,
group_id: &'life1 str,
total: u32,
) -> Pin<Box<dyn Future<Output = TaskResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn complete_group_member<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
group_id: &'life1 str,
task_id: &'life2 TaskId,
result: &'life3 Value,
) -> Pin<Box<dyn Future<Output = TaskResult<u32>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn complete_group_member<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
group_id: &'life1 str,
task_id: &'life2 TaskId,
result: &'life3 Value,
) -> Pin<Box<dyn Future<Output = TaskResult<u32>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Auto Trait Implementations§
impl Freeze for PostgresResultBackend
impl !RefUnwindSafe for PostgresResultBackend
impl Send for PostgresResultBackend
impl Sync for PostgresResultBackend
impl Unpin for PostgresResultBackend
impl UnsafeUnpin for PostgresResultBackend
impl !UnwindSafe for PostgresResultBackend
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more