cometindex/
database.rs

1use sqlx::{postgres::PgPoolOptions, PgPool};
2
3/// Create a Database, with, for sanity, some read only settings.
4///
5/// These will be overrideable by a consumer who knows what they're doing,
6/// but prevents basic mistakes.
7/// c.f. https://github.com/launchbadge/sqlx/issues/481#issuecomment-727011811
8pub async fn read_only_db(url: &str) -> anyhow::Result<PgPool> {
9    PgPoolOptions::new()
10        .after_connect(|conn, _| {
11            Box::pin(async move {
12                sqlx::query("SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;")
13                    .execute(conn)
14                    .await?;
15                Ok(())
16            })
17        })
18        .connect(url)
19        .await
20        .map_err(Into::into)
21}
22
23pub async fn read_write_db(url: &str) -> anyhow::Result<PgPool> {
24    PgPoolOptions::new().connect(url).await.map_err(Into::into)
25}