#![cfg(feature = "sqlx")]
use crate::errors::PgmqError;
use log::LevelFilter;
use sqlx::postgres::{PgConnectOptions, PgPoolOptions};
use sqlx::{ConnectOptions, Transaction};
use sqlx::{Pool, Postgres};
use url::{ParseError, Url};
pub fn conn_options(url: &str) -> Result<PgConnectOptions, ParseError> {
let parsed = Url::parse(url)?;
let options = PgConnectOptions::new()
.host(parsed.host_str().ok_or(ParseError::EmptyHost)?)
.port(parsed.port().ok_or(ParseError::InvalidPort)?)
.username(parsed.username())
.password(parsed.password().ok_or(ParseError::IdnaError)?)
.database(parsed.path().trim_start_matches('/'))
.log_statements(LevelFilter::Debug);
Ok(options)
}
pub async fn connect(url: &str, max_connections: u32) -> Result<Pool<Postgres>, PgmqError> {
let options = conn_options(url)?;
let pgp = PgPoolOptions::new()
.acquire_timeout(std::time::Duration::from_secs(10))
.max_connections(max_connections)
.connect_with(options)
.await?;
Ok(pgp)
}
#[cfg(feature = "install-sql-github")]
#[deprecated(
note = "Use pgmq::install::install_sql_from_github or pgmq::install::install_sql_from_embedded instead.",
since = "0.33.0"
)]
pub async fn install_pgmq(
pool: &Pool<Postgres>,
version: Option<&String>,
) -> Result<(), PgmqError> {
log::info!("Executing PGMQ installation SQL...");
crate::install::install_sql_from_github(pool, version.map(|v| v.as_str())).await?;
log::info!("PGMQ installation completed successfully!");
Ok(())
}
const ADVISORY_LOCK_KEY: i64 = -9223372036854775808 + 4149;
pub(crate) async fn init_lock<'c>(txn: &mut Transaction<'c, Postgres>) -> Result<(), PgmqError> {
sqlx::query("SELECT pg_advisory_xact_lock($1);")
.bind(ADVISORY_LOCK_KEY)
.execute(&mut **txn)
.await?;
Ok(())
}