#![doc = include_str!("../README.md")]
use std::{env, thread, time::Duration};
use structopt::StructOpt;
use url::Url;
#[derive(Debug, StructOpt)]
struct Opts {
#[structopt(short, long)]
port: Option<u16>,
#[structopt(short, long, default_value = "dev")]
user: String,
#[structopt(short = "P", long, default_value = "dev")]
password: String,
#[structopt(short, long, default_value = "dev")]
db: String,
#[structopt(short = "S", long)]
superuser_pw: Option<String>,
}
fn main() -> anyhow::Result<()> {
let opts = Opts::from_args();
if let Ok(external_url_str) = env::var("PGDB_TESTS_URL") {
let external_url = Url::parse(&external_url_str)?;
if external_url.scheme() != "postgres" {
anyhow::bail!("PGDB_TESTS_URL must use postgres:// scheme");
}
let _tmp_dir = tempfile::TempDir::new()?;
use pgdb::create_user_and_database;
create_user_and_database(&external_url, &opts.db, &opts.user, &opts.password)?;
let mut user_url = external_url.clone();
user_url
.set_username(&opts.user)
.expect("Failed to set username");
user_url
.set_password(Some(&opts.password))
.expect("Failed to set password");
user_url.set_path(&opts.db);
println!();
println!("Connected to external PostgreSQL instance.");
println!();
println!(
"PGHOST={}",
external_url.host_str().expect("URL must have a host")
);
println!("PGPORT={}", external_url.port().unwrap_or(5432));
println!("Superuser access:\n\n {}", external_url.as_str());
println!(
"\nA database named `{}`, owned by a user `{}` has been created.\n",
opts.db, opts.user
);
println!("Regular user access:\n\n {}", user_url.as_str());
println!("\nYou can run `psql` with either URL to connect.");
println!("\n(Using external PostgreSQL instance from PGDB_TESTS_URL)");
loop {
thread::sleep(Duration::from_secs(60));
}
} else {
let mut builder = pgdb::Postgres::build();
if let Some(superuser_pw) = opts.superuser_pw {
builder.superuser_pw(superuser_pw);
}
builder.port(opts.port.unwrap_or(15432));
let pg = builder.start()?;
pg.as_superuser().create_user(&opts.user, &opts.password)?;
pg.as_superuser().create_database(&opts.db, &opts.user)?;
println!();
println!("Postgres is now running and ready to accept connections.");
println!();
let superuser_url = pg.superuser_url();
println!(
"PGHOST={}",
superuser_url.host_str().expect("URL must have a host")
);
println!(
"PGPORT={}",
superuser_url.port().expect("URL must have a port")
);
println!(
"Superuser access:\n\n {}",
pg.as_superuser().url("postgres")
);
println!(
"\nA database named `{}`, owned by a user `{}` has been created.\n",
opts.db, opts.user
);
println!(
"Regular user access:\n\n {}",
pg.as_user(&opts.user, &opts.password).url(&opts.db)
);
println!("\nYou can run `psql` with either URL to connect.");
loop {
thread::sleep(Duration::from_secs(60));
}
}
}