Skip to main content

PostgresBackend

Struct PostgresBackend 

Source
pub struct PostgresBackend { /* private fields */ }
Expand description

PostgreSQL backend for FHIR resource storage.

Implementations§

Source§

impl PostgresBackend

Source

pub async fn new(config: PostgresConfig) -> StorageResult<Self>

Creates a new PostgreSQL backend with the given configuration.

Source

pub async fn from_connection_string(url: &str) -> StorageResult<Self>

Creates a backend from a connection string.

Source

pub async fn from_env() -> StorageResult<Self>

Creates a backend from environment variables.

Reads the following environment variables:

  • HFS_PG_HOST (default: “localhost”)
  • HFS_PG_PORT (default: 5432)
  • HFS_PG_DBNAME (default: “helios”)
  • HFS_PG_USER (default: “helios”)
  • HFS_PG_PASSWORD
  • HFS_PG_MAX_CONNECTIONS (default: 10)
Source

pub async fn init_schema(&self) -> StorageResult<()>

Initialize the database schema.

Source

pub fn config(&self) -> &PostgresConfig

Returns the backend configuration.

Source

pub fn search_registry(&self) -> &Arc<RwLock<SearchParameterRegistry>>

Returns a reference to the search parameter registry.

Source

pub fn search_extractor(&self) -> &Arc<SearchParameterExtractor>

Returns a reference to the search parameter extractor.

Source

pub fn is_search_offloaded(&self) -> bool

Returns whether search indexing is offloaded to a secondary backend.

Source

pub fn set_search_offloaded(&mut self, offloaded: bool)

Sets the search offloaded flag.

Trait Implementations§

Source§

impl Backend for PostgresBackend

Source§

type Connection = PostgresConnection

The type of raw connection used by this backend.
Source§

fn kind(&self) -> BackendKind

Returns the kind of backend.
Source§

fn name(&self) -> &'static str

Returns a human-readable name for this backend.
Source§

fn supports(&self, capability: BackendCapability) -> bool

Checks if this backend supports the given capability.
Source§

fn capabilities(&self) -> Vec<BackendCapability>

Returns all capabilities supported by this backend.
Source§

fn acquire<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Self::Connection, BackendError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Acquires a connection from the pool.
Source§

fn release<'life0, 'async_trait>( &'life0 self, _conn: Self::Connection, ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Returns the connection back to the pool.
Source§

fn health_check<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), BackendError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Checks if the backend is healthy and accepting connections.
Source§

fn initialize<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), BackendError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Initializes the database schema if needed.
Source§

fn migrate<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), BackendError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Runs any pending migrations.
Source§

impl BulkExportStorage for PostgresBackend

Source§

fn start_export<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, input: StartExportInput, ) -> Pin<Box<dyn Future<Output = StorageResult<ExportJobId>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Starts a new export job. Read more
Source§

fn get_export_status<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, ) -> Pin<Box<dyn Future<Output = StorageResult<ExportProgress>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Gets the current status of an export job. Read more
Source§

fn cancel_export<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Cancels an in-progress export job. Read more
Source§

fn delete_export<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Deletes an export job and its output files. Read more
Source§

fn get_export_manifest<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, ) -> Pin<Box<dyn Future<Output = StorageResult<RawExportManifest>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Gets the storage-side manifest for a completed export. Read more
Source§

fn get_export_job_metadata<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, ) -> Pin<Box<dyn Future<Output = StorageResult<ExportJobMetadata>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Returns lightweight job metadata for an authorization check. Read more
Source§

fn get_export_file_metadata<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, part: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<ExportFileMetadata>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Returns file metadata for a single output/error part, for the download handler. part is the {resource_type}-{part_index} route segment. Read more
Source§

fn count_active_exports<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Counts active (accepted or in_progress) jobs for a tenant — used to enforce the per-tenant concurrency cap at kickoff.
Source§

fn list_expired_exports<'life0, 'async_trait>( &'life0 self, now: DateTime<Utc>, output_ttl: StdDuration, limit: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<ExpiredExportRef>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Lists expired completed jobs across all tenants, for the cleanup task. Read more
Source§

fn list_exports<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, include_completed: bool, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<ExportProgress>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Lists export jobs for a tenant. Read more
Source§

impl BulkSubmitProvider for PostgresBackend

Source§

fn create_submission<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, metadata: Option<Value>, ) -> Pin<Box<dyn Future<Output = StorageResult<SubmissionSummary>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Creates a new submission. Read more
Source§

fn get_submission<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<SubmissionSummary>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Gets a submission by ID. Read more
Source§

fn list_submissions<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submitter: Option<&'life2 str>, status: Option<SubmissionStatus>, limit: u32, offset: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<SubmissionSummary>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Lists submissions. Read more
Source§

fn complete_submission<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<SubmissionSummary>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Marks a submission as complete. Read more
Source§

fn abort_submission<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, _reason: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Aborts a submission. Read more
Source§

fn add_manifest<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, manifest_url: Option<&'life3 str>, replaces_manifest_url: Option<&'life4 str>, ) -> Pin<Box<dyn Future<Output = StorageResult<SubmissionManifest>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Adds a manifest to a submission. Read more
Source§

fn get_manifest<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, manifest_id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<SubmissionManifest>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Gets a manifest by ID. Read more
Source§

fn list_manifests<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<SubmissionManifest>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Lists manifests in a submission. Read more
Source§

fn process_entries<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, manifest_id: &'life3 str, entries: Vec<NdjsonEntry>, options: &'life4 BulkProcessingOptions, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<BulkEntryResult>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Processes entries from a manifest. Read more
Source§

fn get_entry_results<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, manifest_id: &'life3 str, outcome_filter: Option<BulkEntryOutcome>, limit: u32, offset: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<BulkEntryResult>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Gets entry results for a manifest. Read more
Source§

fn get_entry_counts<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, manifest_id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<EntryCountSummary>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Gets entry counts for a manifest. Read more
Source§

impl BulkSubmitRollbackProvider for PostgresBackend

Source§

fn record_change<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, change: &'life3 SubmissionChange, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Records a change for potential rollback. Read more
Source§

fn list_changes<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, limit: u32, offset: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<SubmissionChange>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Lists recorded changes for a submission. Read more
Source§

fn rollback_change<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, _submission_id: &'life2 SubmissionId, change: &'life3 SubmissionChange, ) -> Pin<Box<dyn Future<Output = StorageResult<bool>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Rolls back a single change. Read more
Source§

impl BundleProvider for PostgresBackend

Source§

fn process_transaction<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, entries: Vec<BundleEntry>, ) -> Pin<Box<dyn Future<Output = Result<BundleResult, TransactionError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Processes a transaction bundle (all-or-nothing). Read more
Source§

fn process_batch<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, entries: Vec<BundleEntry>, ) -> Pin<Box<dyn Future<Output = StorageResult<BundleResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Processes a batch bundle (independent operations). Read more
Source§

impl ChainedSearchProvider for PostgresBackend

Source§

fn resolve_chain<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, base_type: &'life2 str, chain: &'life3 str, value: &'life4 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Evaluates a chained search and returns matching resource IDs. Read more
Source§

fn resolve_reverse_chain<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, base_type: &'life2 str, reverse_chain: &'life3 ReverseChainedParameter, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Evaluates a reverse chain (_has) and returns matching resource IDs. Read more
Source§

impl ConditionalStorage for PostgresBackend

Source§

fn conditional_create<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, resource: Value, search_params: &'life3 str, fhir_version: FhirVersion, ) -> Pin<Box<dyn Future<Output = StorageResult<ConditionalCreateResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Creates a resource only if no matching resource exists. Read more
Source§

fn conditional_update<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, resource: Value, search_params: &'life3 str, upsert: bool, fhir_version: FhirVersion, ) -> Pin<Box<dyn Future<Output = StorageResult<ConditionalUpdateResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Updates a resource based on search criteria. Read more
Source§

fn conditional_delete<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, search_params: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<ConditionalDeleteResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Deletes a resource based on search criteria. Read more
Source§

fn conditional_patch<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, search_params: &'life3 str, patch: &'life4 PatchFormat, ) -> Pin<Box<dyn Future<Output = StorageResult<ConditionalPatchResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Patches a resource based on search criteria. Read more
Source§

impl Debug for PostgresBackend

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DifferentialHistoryProvider for PostgresBackend

Source§

fn modified_since<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: Option<&'life2 str>, since: DateTime<Utc>, pagination: &'life3 Pagination, ) -> Pin<Box<dyn Future<Output = StorageResult<Page<StoredResource>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Gets resources modified since a given timestamp. Read more
Source§

impl ExportClaimStrategy for PostgresBackend

Source§

fn claim_next<'life0, 'life1, 'async_trait>( &'life0 self, worker_id: &'life1 WorkerId, lease_duration: StdDuration, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<ExportJobLease>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Atomically transitions one eligible job (accepted, or in_progress with an expired lease) to held-by-this-worker, bumping the fencing token. Returns Ok(None) when no job is available.
Source§

fn heartbeat<'life0, 'life1, 'async_trait>( &'life0 self, lease: &'life1 ExportJobLease, ) -> Pin<Box<dyn Future<Output = Result<DateTime<Utc>, LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Renews a lease the worker still holds; returns the new expiry, or LeaseError::LeaseLost if the job was reclaimed.
Source§

fn release<'life0, 'async_trait>( &'life0 self, lease: ExportJobLease, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Releases a lease early (graceful shutdown). Best-effort.
Source§

impl ExportDataProvider for PostgresBackend

Source§

fn list_export_types<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, request: &'life2 ExportRequest, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Lists resource types available for export. Read more
Source§

fn count_export_resources<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, request: &'life2 ExportRequest, resource_type: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Counts resources of a type for export. Read more
Source§

fn fetch_export_batch<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, request: &'life2 ExportRequest, resource_type: &'life3 str, cursor: Option<&'life4 str>, batch_size: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<NdjsonBatch>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Fetches a batch of resources for export. Read more
Source§

impl ExportWorkerStorage for PostgresBackend

Source§

fn get_export_job_for_worker<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, worker_id: &'life3 WorkerId, fencing_token: u64, ) -> Pin<Box<dyn Future<Output = Result<WorkerJobView, LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Loads the claimed job’s request, level, frozen metadata and persisted per-type progress (for resume). Fenced.
Source§

fn mark_export_in_progress<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, worker_id: &'life3 WorkerId, fencing_token: u64, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Marks the job in_progress (sets started_at if unset). Fenced.
Source§

fn update_export_type_progress<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, worker_id: &'life3 WorkerId, fencing_token: u64, progress: &'life4 TypeExportProgress, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Idempotent upsert of per-type progress (cursor + counts). Fenced.
Source§

fn record_export_file<'life0, 'life1, 'life2, 'life3, 'life4, 'life5, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, worker_id: &'life3 WorkerId, fencing_token: u64, part: &'life4 FinalizedPart, file_type: &'life5 str, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait, 'life5: 'async_trait,

Idempotent upsert of a finalized output/error file row. Fenced.
Source§

fn finish_export_job<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, worker_id: &'life3 WorkerId, fencing_token: u64, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Marks the job complete (sets completed_at). Fenced.
Source§

fn fail_export_job<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, job_id: &'life2 ExportJobId, worker_id: &'life3 WorkerId, fencing_token: u64, error_message: &'life4 str, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Marks the job error with a message (sets completed_at). Fenced.
Source§

impl GroupExportProvider for PostgresBackend

Source§

fn get_group_members<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, group_id: &'life2 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Gets the members of a group. Read more
Source§

fn resolve_group_patient_ids<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, group_id: &'life2 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Resolves group members to patient IDs. Read more
Source§

fn get_group_members_with_periods<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, group_id: &'life2 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<(String, Option<DateTime<Utc>>)>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Returns each member’s reference together with its Group.member.period.start. Read more
Source§

impl IncludeProvider for PostgresBackend

Source§

fn resolve_includes<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resources: &'life2 [StoredResource], includes: &'life3 [IncludeDirective], ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<StoredResource>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Resolves _include directives for search results. Read more
Source§

impl InstanceHistoryProvider for PostgresBackend

Source§

fn history_instance<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, params: &'life4 HistoryParams, ) -> Pin<Box<dyn Future<Output = StorageResult<HistoryPage>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Gets the history for a specific resource instance. Read more
Source§

fn history_instance_count<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Gets the total number of versions for a resource.
Source§

fn delete_instance_history<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Deletes all history for a specific resource instance. Read more
Source§

fn delete_version<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, version_id: &'life4 str, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Deletes a specific version from a resource’s history. Read more
Source§

impl MultiTypeSearchProvider for PostgresBackend

Source§

fn search_multi<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_types: &'life2 [&'life3 str], query: &'life4 SearchQuery, ) -> Pin<Box<dyn Future<Output = StorageResult<SearchResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Searches across multiple resource types. Read more
Source§

impl PatientExportProvider for PostgresBackend

Source§

fn list_patient_ids<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, request: &'life2 ExportRequest, cursor: Option<&'life3 str>, batch_size: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<(Vec<String>, Option<String>)>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Lists patient IDs to include in the export. Read more
Source§

fn fetch_patient_compartment_batch<'life0, 'life1, 'life2, 'life3, 'life4, 'life5, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, request: &'life2 ExportRequest, resource_type: &'life3 str, patient_ids: &'life4 [String], cursor: Option<&'life5 str>, batch_size: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<NdjsonBatch>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait, 'life5: 'async_trait,

Fetches a batch of resources from the patient compartment. Read more
Source§

impl PurgableStorage for PostgresBackend

Source§

fn purge<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Permanently deletes a resource and all its history. Read more
Source§

fn purge_all<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Permanently deletes all resources of a type for a tenant. Read more
Source§

impl ReindexableStorage for PostgresBackend

Source§

fn list_resource_types<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Lists all resource types that have resources in the tenant.
Source§

fn count_resources<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Counts resources of a specific type.
Source§

fn fetch_resources_page<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, cursor: Option<&'life3 str>, limit: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<ResourcePage>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Fetches a page of resources for reindexing. Read more
Source§

fn delete_search_entries<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, resource_id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Deletes search index entries for a resource.
Source§

fn write_search_entries<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, resource_id: &'life3 str, resource: &'life4 Value, ) -> Pin<Box<dyn Future<Output = StorageResult<usize>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Writes search index entries for a resource.
Source§

fn clear_search_index<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Clears all search index entries for a tenant.
Source§

impl ResourceStorage for PostgresBackend

Source§

fn backend_name(&self) -> &'static str

Returns a human-readable name for this storage backend.
Source§

fn sof_runner(&self) -> Option<Arc<dyn SofRunner>>

Returns the SQL-on-FHIR runner for this backend, if it supports in-DB execution. Read more
Source§

fn create<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, resource: Value, fhir_version: FhirVersion, ) -> Pin<Box<dyn Future<Output = StorageResult<StoredResource>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Creates a new resource. Read more
Source§

fn create_or_update<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, resource: Value, fhir_version: FhirVersion, ) -> Pin<Box<dyn Future<Output = StorageResult<(StoredResource, bool)>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Creates a resource with a specific ID (PUT semantics). Read more
Source§

fn read<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<StoredResource>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Reads a resource by type and ID. Read more
Source§

fn update<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, current: &'life2 StoredResource, resource: Value, ) -> Pin<Box<dyn Future<Output = StorageResult<StoredResource>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Updates an existing resource. Read more
Source§

fn delete<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Deletes a resource (soft delete). Read more
Source§

fn count<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: Option<&'life2 str>, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Counts the total number of resources of a given type. Read more
Source§

fn exists<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<bool>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Checks if a resource exists. Read more
Source§

fn read_batch<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, ids: &'life3 [&'life4 str], ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<StoredResource>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Reads multiple resources by their IDs. Read more
Source§

impl RevincludeProvider for PostgresBackend

Source§

fn resolve_revincludes<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resources: &'life2 [StoredResource], revincludes: &'life3 [IncludeDirective], ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<StoredResource>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Resolves _revinclude directives for search results. Read more
Source§

impl SearchCapabilityProvider for PostgresBackend

Source§

fn resource_search_capabilities( &self, resource_type: &str, ) -> Option<ResourceSearchCapabilities>

Returns detailed search capabilities for a resource type. Read more
Source§

fn global_search_capabilities(&self) -> GlobalSearchCapabilities

Returns global search capabilities that apply to all resource types.
Source§

fn validate_search_query( &self, query: &SearchQuery, ) -> Result<(), UnsupportedSearchFeature>

Validates a search query against the backend’s capabilities. Read more
Source§

impl SearchProvider for PostgresBackend

Source§

fn search<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, query: &'life2 SearchQuery, ) -> Pin<Box<dyn Future<Output = StorageResult<SearchResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Searches for resources matching the query. Read more
Source§

fn search_count<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, query: &'life2 SearchQuery, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Counts resources matching the query without returning them. Read more
Source§

fn search_param_registry(&self) -> &Arc<RwLock<SearchParameterRegistry>>

Returns the backend’s search parameter registry. Read more
Whether this backend can evaluate _contained=true|both searches (which require contained-resource indexing). Defaults to false; backends that index contained[] entries override this. The REST layer uses it to reject _contained with 501 on backends that don’t support it rather than silently returning an unfiltered result.
Source§

fn modifiers_for_param_type( &self, param_type: SearchParamType, ) -> Vec<&'static str>

Returns the search modifiers this backend actually honors for a given parameter type (e.g. exact, contains for strings; not, in for tokens). Used by the REST layer to advertise supported modifiers in the CapabilityStatement. Read more
Source§

impl StreamingBulkSubmitProvider for PostgresBackend

Source§

fn process_ndjson_stream<'life0, 'life1, 'life2, 'life3, 'life4, 'life5, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, submission_id: &'life2 SubmissionId, manifest_id: &'life3 str, resource_type: &'life4 str, reader: Box<dyn AsyncBufRead + Send + Unpin>, options: &'life5 BulkProcessingOptions, ) -> Pin<Box<dyn Future<Output = StorageResult<StreamProcessingResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait, 'life5: 'async_trait,

Processes NDJSON data from a stream. Read more
Source§

impl SubmitClaimStrategy for PostgresBackend

Source§

fn claim_next_manifest<'life0, 'life1, 'async_trait>( &'life0 self, worker_id: &'life1 WorkerId, lease_duration: StdDuration, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<ManifestLease>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Atomically transitions one eligible manifest (pending, or processing with an expired lease) to held-by-this-worker, bumping the fencing token. Returns Ok(None) when no manifest is available.
Source§

fn heartbeat<'life0, 'life1, 'async_trait>( &'life0 self, lease: &'life1 ManifestLease, ) -> Pin<Box<dyn Future<Output = Result<DateTime<Utc>, LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Renews a lease the worker still holds; returns the new expiry, or LeaseError::LeaseLost if the manifest was reclaimed.
Source§

fn release<'life0, 'async_trait>( &'life0 self, lease: ManifestLease, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Releases a lease early (graceful shutdown). Best-effort.
Source§

impl SubmitWorkerStorage for PostgresBackend

Source§

fn get_manifest_for_worker<'life0, 'life1, 'async_trait>( &'life0 self, lease: &'life1 ManifestLease, ) -> Pin<Box<dyn Future<Output = Result<ManifestWorkerView, LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Loads the claimed manifest’s fetch parameters and resume cursor. Fenced.
Source§

fn mark_manifest_processing<'life0, 'life1, 'async_trait>( &'life0 self, lease: &'life1 ManifestLease, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Marks the manifest processing. Fenced.
Source§

fn update_manifest_progress<'life0, 'life1, 'async_trait>( &'life0 self, lease: &'life1 ManifestLease, processed_entries: u64, failed_entries: u64, last_processed_line: u64, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Idempotent update of per-manifest progress (counts + resume cursor). Fenced.
Source§

fn record_submit_file<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, lease: &'life1 ManifestLease, file: &'life2 SubmitFileRecord, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Idempotent upsert of a finalized status-manifest artifact row. Fenced.
Source§

fn finish_manifest<'life0, 'life1, 'async_trait>( &'life0 self, lease: &'life1 ManifestLease, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Marks the manifest completed. Fenced.
Source§

fn fail_manifest<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, lease: &'life1 ManifestLease, _error_message: &'life2 str, ) -> Pin<Box<dyn Future<Output = Result<(), LeaseError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Marks the manifest failed with a message. Fenced.
Source§

fn set_manifest_fetch_params<'life0, 'life1, 'life2, 'life3, 'life4, 'life5, 'life6, 'life7, 'life8, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, manifest_id: &'life3 str, fhir_base_url: Option<&'life4 str>, output_format: Option<&'life5 str>, file_request_headers: &'life6 [(String, String)], oauth_metadata_urls: &'life7 [String], file_encryption_key: Option<&'life8 Value>, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait, 'life5: 'async_trait, 'life6: 'async_trait, 'life7: 'async_trait, 'life8: 'async_trait,

Persists the remote-fetch parameters for a manifest that the kickoff handler added via crate::core::bulk_submit::BulkSubmitProvider::add_manifest. Read more
Source§

fn replace_manifest_by_url<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, manifest_url: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Marks a previously-submitted manifest (identified by its submitted manifest_url) as replaced, for replacesManifestUrl handling. Returns the manifest_ids that were superseded (so the caller can roll back their changes).
Source§

fn set_submission_kickoff_meta<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, owner_subject: Option<&'life3 str>, request_url: &'life4 str, requires_access_token: bool, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Persists kickoff metadata (owner subject, request URL, access-token posture).
Source§

fn ensure_poll_token<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<String>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Idempotently mints + stores a poll token on the submission (UNIQUE index guards collisions). Returns the existing token if one is already set.
Source§

fn list_expired_submissions<'life0, 'async_trait>( &'life0 self, now: DateTime<Utc>, ttl: StdDuration, limit: u32, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<(TenantContext, SubmissionId)>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Lists submissions whose updated_at is older than now - ttl, across all tenants, for the periodic cleanup task. Returns (tenant, submission_id) pairs (bounded by limit) so the caller can delete their output-store artifacts and rows.
Source§

fn resolve_poll_token<'life0, 'life1, 'async_trait>( &'life0 self, token: &'life1 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<PollTokenTarget>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Resolves a poll token to its submission, or None after deletion/unknown.
Source§

fn clear_poll_token<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Clears the poll token so subsequent Self::resolve_poll_token returns None.
Source§

fn list_submit_files<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<SubmitFileRow>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Lists the recorded status-manifest artifact rows for a submission.
Source§

fn delete_submission_artifacts<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Deletes the bulk_submit_files rows for a submission (idempotent). Read more
Source§

fn count_active_submissions<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Counts non-terminal submissions for a tenant (per-tenant concurrency cap).
Source§

fn ensure_transaction_time<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, id: &'life2 SubmissionId, ) -> Pin<Box<dyn Future<Output = StorageResult<DateTime<Utc>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Records a transaction time on the submission when its status manifest is first finalized (idempotent — only sets if currently unset).
Source§

impl SystemHistoryProvider for PostgresBackend

Source§

fn history_system<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, params: &'life2 HistoryParams, ) -> Pin<Box<dyn Future<Output = StorageResult<HistoryPage>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Gets the history for all resources in the system. Read more
Source§

fn history_system_count<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Gets the total number of history entries in the system.
Source§

impl TextSearchProvider for PostgresBackend

Source§

fn search_text<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, text: &'life3 str, pagination: &'life4 Pagination, ) -> Pin<Box<dyn Future<Output = StorageResult<SearchResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Performs a full-text search on resource narratives. Read more
Source§

fn search_content<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, content: &'life3 str, pagination: &'life4 Pagination, ) -> Pin<Box<dyn Future<Output = StorageResult<SearchResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Performs a full-text search on entire resource content. Read more
Source§

impl TransactionProvider for PostgresBackend

Source§

type Transaction = PostgresTransaction

The transaction type returned by this provider.
Source§

fn begin_transaction<'life0, 'life1, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, _options: TransactionOptions, ) -> Pin<Box<dyn Future<Output = StorageResult<Self::Transaction>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Begins a new transaction. Read more
Source§

fn with_transaction<'life0, 'life1, 'async_trait, F, Fut, R>( &'life0 self, tenant: &'life1 TenantContext, options: TransactionOptions, f: F, ) -> Pin<Box<dyn Future<Output = StorageResult<R>> + Send + 'async_trait>>
where F: FnOnce(Self::Transaction) -> Fut + Send + 'async_trait, Fut: Future<Output = StorageResult<R>> + Send + 'async_trait, R: Send + 'async_trait, Self: Sync + 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Executes a function within a transaction. Read more
Source§

impl TypeHistoryProvider for PostgresBackend

Source§

fn history_type<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, params: &'life3 HistoryParams, ) -> Pin<Box<dyn Future<Output = StorageResult<HistoryPage>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Gets the history for all resources of a type. Read more
Source§

fn history_type_count<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, ) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Gets the total number of history entries for a resource type.
Source§

impl VersionedStorage for PostgresBackend

Source§

fn vread<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, version_id: &'life4 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<StoredResource>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Reads a specific version of a resource (vread). Read more
Source§

fn update_with_match<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, expected_version: &'life4 str, resource: Value, ) -> Pin<Box<dyn Future<Output = StorageResult<StoredResource>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Updates a resource with optimistic locking (If-Match). Read more
Source§

fn delete_with_match<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, expected_version: &'life4 str, ) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait, 'life4: 'async_trait,

Deletes a resource with optimistic locking (If-Match). Read more
Source§

fn list_versions<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Lists all version IDs for a resource. Read more
Source§

fn current_version<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, tenant: &'life1 TenantContext, resource_type: &'life2 str, id: &'life3 str, ) -> Pin<Box<dyn Future<Output = StorageResult<Option<String>>> + Send + 'async_trait>>
where Self: Sync + 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Gets the current version ID of a resource without reading the full content. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> BulkExportJobStore for T

Source§

impl<T> BulkSubmitJobStore for T

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> ExportResourceProvider for T

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FullSearchProvider for T

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<'src, T> IntoMaybe<'src, T> for T
where T: 'src,

Source§

type Proj<U: 'src> = U

Source§

fn map_maybe<R>( self, _f: impl FnOnce(&'src T) -> &'src R, g: impl FnOnce(T) -> R, ) -> <T as IntoMaybe<'src, T>>::Proj<R>
where R: 'src,

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more