mirror of
https://github.com/element-hq/synapse.git
synced 2026-11-05 04:37:45 +00:00
Synapse has always connected to Postgres through libpq (via psycopg2), so a connection string that omits `host=` gets libpq's default: the compiled-in socket directory (which distributions such as Debian patch) and environment variables like `PGHOST`. A Rust Postgres client such as `tokio-postgres` applies its own default (`localhost`) instead. To keep the existing connection behaviour, the Rust driver will ask the real libpq what it would do and copy that across. This adds the asking: `libpq::default_host` calls `PQconnectStart` on an empty conninfo, which applies libpq's defaults and environment, and reads the host libpq settled on back with `PQhost`. The connection attempt that `PQconnectStart` begins is never polled and its outcome is ignored: `PQhost` reports the resolved default whether or not a server is listening there. libpq is an optional runtime dependency, not a build-time one. The shared library is loaded with `dlopen` (via `libloading`) the first time `default_host` is called, and the five entry points we use are declared by hand. Synapse therefore builds and imports without libpq installed; only a deployment that needs the default host has to have `libpq5`, and `default_host` returns a clear error if it is missing. Split out of the Rust Postgres driver branch so the libpq dependency can be reviewed on its own. Nothing calls `default_host` yet; the driver's DSN fixup is the consumer. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>