pub struct PgStorage { /* private fields */ }Implementations§
Source§impl PgStorage
impl PgStorage
Sourcepub async fn connect(database_url: &str) -> Result<Self, Error>
pub async fn connect(database_url: &str) -> Result<Self, Error>
Connect and apply this crate’s migrations (src/migrations/), the
behaviour every release before 1.1.0 had. Equivalent to
connect_with(database_url, true).
Sourcepub async fn connect_with(
database_url: &str,
migrate: bool,
) -> Result<Self, Error>
pub async fn connect_with( database_url: &str, migrate: bool, ) -> Result<Self, Error>
Connect, applying the migrations only if migrate is true.
migrate = false is for deployments where something else owns the
schema — typednotes-infra applies src/migrations/ as a declared
history, so the SQL is reviewed in a plan before it runs and the
serving identity needs no DDL rights. The schema is then checked
rather than assumed: a missing kv_store fails here, at startup,
naming the cause, instead of as a confusing error on the first
request. Note that the two modes do not mix on one database: sqlx
records what it applied in _sqlx_migrations, an external runner does
not, so switching an existing database from one to the other means
reconciling that bookkeeping first.
Trait Implementations§
Source§impl StorageBackend for PgStorage
impl StorageBackend for PgStorage
Source§fn list_expired<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 str,
now: DateTime<Utc>,
) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn list_expired<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 str,
now: DateTime<Utc>,
) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Served by the partial index on expires_at from the initial
migration, so the reaper no longer reads every lease to find the few
that expired.
Source§fn replace_if_unchanged<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
path: &'life1 str,
expected: &'life2 [u8],
entry: StorageEntry,
) -> Pin<Box<dyn Future<Output = StorageResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn replace_if_unchanged<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
path: &'life1 str,
expected: &'life2 [u8],
entry: StorageEntry,
) -> Pin<Box<dyn Future<Output = StorageResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
One statement, so the comparison and the write cannot be interleaved.
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
path: &'life1 str,
) -> Pin<Box<dyn Future<Output = StorageResult<Option<StorageEntry>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn put<'life0, 'life1, 'async_trait>(
&'life0 self,
path: &'life1 str,
entry: StorageEntry,
) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
path: &'life1 str,
) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn ping<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn ping<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn try_acquire_lock<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = StorageResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn try_acquire_lock<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = StorageResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn list<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 str,
) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Auto Trait Implementations§
impl !Freeze for PgStorage
impl !RefUnwindSafe for PgStorage
impl !UnwindSafe for PgStorage
impl Send for PgStorage
impl Sync for PgStorage
impl Unpin for PgStorage
impl UnsafeUnpin for PgStorage
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