Skip to main content

Crate reliar_store_postgres

Crate reliar_store_postgres 

Source
Expand description

reliar-store-postgres is Reliar’s PostgreSQL provider: the schema, the explicit migrate API, and PostgresOutboxStore — the only crate where an sqlx/Postgres type appears (SRS §20–§26, §35, ADR 0002).

§MSRV

This crate declares rust-version = "1.94", six releases above the workspace floor (1.88): sqlx 0.9 requires it. Pure crates (reliar-core, reliar-outbox) stay reachable on 1.88 for hosts bringing their own store (ADR 0025).

§Features

§search_path setup

Every Reliar object lives in one configurable schema, reliar by default, with unprefixed table names (outbox). sqlx::query! checks SQL at compile time, so every identifier in every statement is a static, unqualified literal — the schema is resolved at connection time through search_path, never compiled in (ADR 0017).

  • The host puts reliar first on the connection URL: ?options=-c%20search_path%3Dreliar,public.
  • Behind a transaction-mode pooler that drops startup options (some reject the parameter outright with 08P01), use a server-side default instead: ALTER ROLE <app> SET search_path = reliar, public. This is the portable mechanism — verify it against your own pooler build/version rather than assuming: PgDog (ghcr.io/pgdogdev/pgdog:v0.1.46, the pooler this crate’s suite runs behind) was found to pass the options parameter through to the upstream server instead of dropping it, so the URL-options path above works unmodified behind it too, with no ALTER ROLE required — but a different pooler, or a different PgDog configuration, could behave either way (§43.A.35).
  • PostgresOutboxStore::connect/PostgresOutboxStore::new verify once at construction that the unqualified name outbox resolves to the configured schema, and fail fast — naming the configured schema, the observed search_path, and the ALTER ROLE remedy — rather than surprise-failing on the first acquire.
  • migrate does not depend on the caller’s search_path: it creates the schema itself and qualifies its own bookkeeping table name (ADR 0018).

§Guarantees

  • Migrations never run implicitly. migrate is the only entry point, and it is idempotent and safe under concurrent callers (SRS §35).
  • The claim is one statement. PostgresOutboxStore’s acquire (via reliar_outbox::OutboxStore) uses a FOR UPDATE SKIP LOCKED claim that commits before the call returns; no network I/O ever happens while a Reliar transaction is open (ADR 0006).
  • enqueue joins the caller’s own transaction — atomicity is visible in the signature — and performs no I/O beyond the one INSERT (plus, opt-in, a search_path wrap).

Structs§

EnqueueOptions
Options specific to one enqueue call (contract §4 #9): the application-supplied ordering_key, which is deliberately not part of Metadata (§22.2).
JsonSerializer
The default Serializer: JSON via serde_json. Ships behind the default json feature; disable it to supply a different wire format (ADR 0010).
MigrateOptions
Where migrate creates Reliar’s schema and its bookkeeping table.
PostgresOutboxSettings
What is provider-specific about the outbox (contract §4). Everything portable lives in reliar_outbox::OutboxSettings.
PostgresOutboxStore
Reliar’s PostgreSQL outbox provider. Cheap to clone into an AppState — it wraps a PgPool; no outer Arc required. The connection pool stays the host’s: Reliar never owns or reads a DATABASE_URL.

Enums§

EnqueueError
crate::PostgresOutboxStore::enqueue/enqueue_with failures. enqueue runs on the host’s write path, where the host decides whether to retry its own transaction, so this implements Classify on the same rules as PostgresStoreError rather than making the host re-derive which SQLSTATEs are worth retrying (contract §4).
MigrateError
migrate’s failure. Provider-owned, not a re-export of sqlx::migrate::MigrateError (contract §7 J3/J4): a rejected schema identifier has no variant in sqlx’s own type to report it as, since that check happens before any sqlx::migrate code runs at all.
PostgresStoreError
A failure of a crate::PostgresOutboxStore OutboxStore/OutboxDeadLetters call — never a property of one row’s content. Row-content problems surface as reliar_outbox::PoisonedRows instead (ADR 0008).
SettingsError
Why a *Settings::from_env call failed. OutboxSettings::from_env (reliar-outbox) was the first caller; every provider’s own from_env returns this same type (contract §7 I3).

Functions§

migrate
Applies Reliar’s migrations. Never invoked implicitly (SRS §35).