use crate::CommandExecute;
use crate::command::get::get_property;
use crate::command::run::exec_psql;
use crate::command::start::start_postgres;
use crate::manifest::{get_package_manifest, pg_config_and_version};
use clap_cargo::Features;
use eyre::{WrapErr, eyre};
use owo_colors::OwoColorize;
use pgrx_pg_config::{PgConfig, Pgrx, createdb};
use std::path::PathBuf;
#[derive(clap::Args, Debug)]
#[clap(author)]
pub(crate) struct Connect {
#[clap(env = "PG_VERSION")]
pg_version: Option<String>,
#[clap(env = "DBNAME")]
dbname: Option<String>,
#[clap(from_global, action = ArgAction::Count)]
verbose: u8,
#[clap(long, short)]
package: Option<String>,
#[clap(long, value_parser)]
manifest_path: Option<PathBuf>,
#[clap(env = "PGRX_PGCLI", long)]
pgcli: bool,
#[clap(long)]
valgrind: bool,
}
impl CommandExecute for Connect {
#[tracing::instrument(level = "error", skip(self))]
fn execute(mut self) -> eyre::Result<()> {
let pgrx = Pgrx::from_config()?;
let (package_manifest, package_manifest_path) = get_package_manifest(
&Features::default(),
self.package.as_deref(),
self.manifest_path.as_deref(),
)?;
let (pg_config, _pg_version) = match pg_config_and_version(
&pgrx,
&package_manifest,
self.pg_version.clone(),
None,
true,
) {
Ok(values) => values,
Err(_) => {
self.dbname = self.pg_version.clone();
self.pg_version = None;
pg_config_and_version(&pgrx, &package_manifest, self.pg_version, None, true)?
}
};
let dbname = match self.dbname {
Some(dbname) => dbname,
None => {
get_property(&package_manifest_path, "extname")
.wrap_err("could not determine extension name")?
.ok_or(eyre!("extname not found in control file"))?
}
};
connect_psql(&pg_config, &dbname, self.pgcli, self.valgrind)
}
}
#[tracing::instrument(level = "error", skip_all, fields(
pg_version = %pg_config.version()?,
dbname,
))]
pub(crate) fn connect_psql(
pg_config: &PgConfig,
dbname: &str,
pgcli: bool,
use_valgrind: bool,
) -> eyre::Result<()> {
start_postgres(pg_config, &Default::default(), use_valgrind)?;
if !createdb(pg_config, dbname, false, true, None)? {
println!("{} existing database {}", " Re-using".bold().cyan(), dbname);
}
exec_psql(pg_config, dbname, pgcli)
}