1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//! # mempill-postgres
//!
//! PostgreSQL-backed `PersistencePort` adapter for mempill.
//!
//! ## Usage
//!
//! ```no_run
//! use mempill_postgres::{open_postgres, PostgresEngine};
//! use mempill_core::{EngineConfig, NoOpOracle, NoOpVector};
//! use std::sync::Arc;
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let conn_str = "host=localhost port=5432 user=mempill dbname=mempill password=secret";
//! let engine: PostgresEngine<NoOpOracle, NoOpVector> = open_postgres(conn_str, None, None, EngineConfig::default())?;
//! # Ok(())
//! # }
//! ```
//!
//! ## Topology-b vs topology-a
//!
//! One backend per deployment: downstream consumers depend on EITHER `mempill-sqlite`
//! OR `mempill-postgres`, never both.
//!
//! ## Concurrency model
//!
//! - r2d2 pool (max 20 connections) enables concurrent cross-agent transactions.
//! - `pg_advisory_xact_lock(hashtext(agent_id)::bigint)` serializes same-agent writes at the DB level.
//! - `UNIQUE(agent_id, stream_seq)` on `ledger_entries` provides OCC belt-and-suspenders against duplicate sequence numbers.
//! - `requires_global_write_serialization()` returns `false` — EngineHandle skips the
//! global write lock, enabling true Postgres concurrency across agents.
// Embed migrations at compile time; no live DB needed to compile.
embed_migrations!;
pub use ;
pub use ;
pub use PostgresTxn;
/// Type alias for an `EngineHandle` backed by `PostgresPersistenceStore`.
///
/// `O` = OraclePort implementation, `V` = VectorPort implementation.
pub type PostgresEngine<O, V> = EngineHandle;