From 5160f5760ae30a7c807898f4299ce4b2d0339fe0 Mon Sep 17 00:00:00 2001 From: Lev Date: Tue, 3 Oct 2023 13:59:53 -0700 Subject: [PATCH 1/4] help with local dev --- .../cargo-pgml-components/src/local_dev.rs | 98 +++++++++++++++++++ packages/cargo-pgml-components/src/main.rs | 5 + packages/cargo-pgml-components/src/util.rs | 34 +++++-- 3 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 packages/cargo-pgml-components/src/local_dev.rs diff --git a/packages/cargo-pgml-components/src/local_dev.rs b/packages/cargo-pgml-components/src/local_dev.rs new file mode 100644 index 000000000..8e4103d62 --- /dev/null +++ b/packages/cargo-pgml-components/src/local_dev.rs @@ -0,0 +1,98 @@ +//! So special, it deserves its own file. +//! +//! Code to handle the setup of our pretty complex local development +//! environment. + +use crate::util::{execute_command, unwrap_or_exit, debug1, info, warn, info_n, warn_n, error, error_n, psql_output}; +use std::process::Command; + +#[cfg(target_os = "macos")] +static PG_WITH_BREW: &str = +"Install PostgreSQL with brew:\n +\tbrew install postgresql@15 +"; + +#[cfg(target_os = "linux")] +static PG_WITH_APT: &str = +"Install PostgreSQL with Aptitude:\n +\tapt install postgresql +"; + +static PG_PG_STAT_STATEMENTS: &str = +"Install pg_stat_statements into your database: +\tpsql -d postgres -c 'CREATE EXTENSION pg_stat_statements' +\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' +"; + +static PG_PGML_SHARED_PRELOAD_LIBRARIES: &str = +"1. Install pgml into your shared_preload_libraries:\n +\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' +"; + +#[cfg(target_os = "macos")] +static PG_PGML_RESTART_MACOS: &str = +"2. Restart PostgreSQL:\n +\tbrew service restart postgresql@15 +"; + +#[cfg(target_os = "linux")] +static PG_PGML_RESTART_LINUX: &str = +"2. Restart PostgreSQL:\n +\tsudo service postgresql restart +"; + + +fn dependencies() -> anyhow::Result<()> { + print!("checking for psql..."); + if execute_command(Command::new("which").arg("psql")).is_err() { + error("error"); + error("psql not found, do you have PostgreSQL installed?"); + + #[cfg(target_os = "macos")] + println!("{}", PG_WITH_BREW); + + #[cfg(target_os = "linux")] + println!("{}", PG_WITH_APT); + std::process::exit(1); + } else { + info("ok"); + } + + print!("checking PostgreSQL connectivity..."); + if let Err(err) = psql_output("SELECT version()") { + error("error"); + error("Could not connect to PostgreSQL"); + error!("{}", err); + std::process::exit(1); + } else { + info("ok"); + } + + print!("checking shared_preload_libraries..."); + let output = psql_output("SHOW shared_preload_libraries")?; + if !output.contains("pg_stat_statements") { + error("error"); + error("pg_stat_statements is not installed into shared_preload_libraries"); + println!("{}", PG_PG_STAT_STATEMENTS); + std::process::exit(1); + } else if output.contains("pgml") { + error("error"); + error("pgml is not installed into shared_preload_libraries"); + println!("{}", PG_PGML_SHARED_PRELOAD_LIBRARIES); + + #[cfg(target_os = "macos")] + println!("{}", PG_PGML_RESTART_MACOS); + + #[cfg(target_os = "linux")] + println!("{}", PG_PGML_RESTART_LINUX); + std::process::exit(1); + } else { + info("ok"); + } + + Ok(()) +} + +pub fn setup() { + dependencies().unwrap(); +} diff --git a/packages/cargo-pgml-components/src/main.rs b/packages/cargo-pgml-components/src/main.rs index 139720815..a85702b4d 100644 --- a/packages/cargo-pgml-components/src/main.rs +++ b/packages/cargo-pgml-components/src/main.rs @@ -12,6 +12,7 @@ mod backend; mod config; mod frontend; mod util; +mod local_dev; use config::Config; use util::{info, unwrap_or_exit}; @@ -62,6 +63,9 @@ enum Commands { /// Add new elements to the project. #[command(subcommand)] Add(AddCommands), + + /// Setup local dev. + LocalDev {}, } #[derive(Subcommand, Debug)] @@ -85,6 +89,7 @@ fn main() { crate::frontend::components::add(&Path::new(&name), pgml_commands.overwrite) } }, + Commands::LocalDev{} => local_dev::setup(), } } } diff --git a/packages/cargo-pgml-components/src/util.rs b/packages/cargo-pgml-components/src/util.rs index 2290cb378..e3406e523 100644 --- a/packages/cargo-pgml-components/src/util.rs +++ b/packages/cargo-pgml-components/src/util.rs @@ -30,14 +30,26 @@ pub fn info(value: &str) { println!("{}", value.green()); } +pub fn info_n(value: &str) { + print!("{}", value.green()); +} + pub fn error(value: &str) { println!("{}", value.red()); } +pub fn error_n(value: &str) { + print!("{}", value.red()); +} + pub fn warn(value: &str) { println!("{}", value.yellow()); } +pub fn warn_n(value: &str) { + print!("{}", value.yellow()); +} + pub fn execute_command(command: &mut Command) -> std::io::Result { debug!("Executing {:?}", command); @@ -47,19 +59,18 @@ pub fn execute_command(command: &mut Command) -> std::io::Result { return Err(err); } }; - - let stderr = String::from_utf8_lossy(&output.stderr).to_string(); - let stdout = String::from_utf8_lossy(&output.stderr).to_string(); + + let stderr = unwrap_or_exit!(String::from_utf8(output.stderr)).to_string(); + let stdout = unwrap_or_exit!(String::from_utf8(output.stdout)).to_string(); if !output.status.success() { - let error = String::from_utf8_lossy(&output.stderr).to_string(); debug!( "{} failed: {}", command.get_program().to_str().unwrap(), - error, + stderr, ); - return Err(std::io::Error::new(ErrorKind::Other, error)); + return Err(std::io::Error::new(ErrorKind::Other, stderr)); } if !stderr.is_empty() { @@ -95,3 +106,14 @@ pub fn compare_strings(string1: &str, string2: &str) -> bool { // TODO: faster string comparison method needed. string1.trim() == string2.trim() } + +pub fn psql_output(query: &str) -> std::io::Result { + let mut cmd = Command::new("psql"); + cmd + .arg("-c") + .arg(query) + .arg("-t"); + + let output = execute_command(&mut cmd)?; + Ok(output.trim().to_string()) +} From e546a39aab8743ad468f23f221c5ced29e78e7d9 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Tue, 3 Oct 2023 14:57:48 -0700 Subject: [PATCH 2/4] local dev --- .../src/frontend/tools.rs | 9 +- .../cargo-pgml-components/src/local_dev.rs | 174 ++++++++++++++---- packages/cargo-pgml-components/src/main.rs | 4 +- packages/cargo-pgml-components/src/util.rs | 30 ++- 4 files changed, 165 insertions(+), 52 deletions(-) diff --git a/packages/cargo-pgml-components/src/frontend/tools.rs b/packages/cargo-pgml-components/src/frontend/tools.rs index 14acde3de..9b91a172f 100644 --- a/packages/cargo-pgml-components/src/frontend/tools.rs +++ b/packages/cargo-pgml-components/src/frontend/tools.rs @@ -34,14 +34,7 @@ pub fn install() { } for plugin in ROLLUP_PLUGINS { - if execute_with_nvm( - Command::new("npm") - .arg("list") - .arg("-g") - .arg(plugin) - ) - .is_err() - { + if execute_with_nvm(Command::new("npm").arg("list").arg("-g").arg(plugin)).is_err() { warn(&format!("installing rollup plugin {}", plugin)); unwrap_or_exit!(execute_with_nvm( Command::new("npm").arg("install").arg("-g").arg(plugin) diff --git a/packages/cargo-pgml-components/src/local_dev.rs b/packages/cargo-pgml-components/src/local_dev.rs index 8e4103d62..2d2043498 100644 --- a/packages/cargo-pgml-components/src/local_dev.rs +++ b/packages/cargo-pgml-components/src/local_dev.rs @@ -3,79 +3,146 @@ //! Code to handle the setup of our pretty complex local development //! environment. -use crate::util::{execute_command, unwrap_or_exit, debug1, info, warn, info_n, warn_n, error, error_n, psql_output}; +use crate::util::{ + debug1, error, execute_command, info, ok_or_error, print, psql_output, unwrap_or_exit, warn, +}; use std::process::Command; #[cfg(target_os = "macos")] -static PG_WITH_BREW: &str = -"Install PostgreSQL with brew:\n +static PG_INSTALL: &str = "Install PostgreSQL with brew:\n \tbrew install postgresql@15 "; #[cfg(target_os = "linux")] -static PG_WITH_APT: &str = -"Install PostgreSQL with Aptitude:\n +static PG_INSTALL: &str = "Install PostgreSQL with Aptitude:\n \tapt install postgresql "; -static PG_PG_STAT_STATEMENTS: &str = -"Install pg_stat_statements into your database: +static PG_PG_STAT_STATEMENTS: &str = "Install pg_stat_statements into your database: \tpsql -d postgres -c 'CREATE EXTENSION pg_stat_statements' \tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' "; -static PG_PGML_SHARED_PRELOAD_LIBRARIES: &str = -"1. Install pgml into your shared_preload_libraries:\n +static PG_PGML_SHARED_PRELOAD_LIBRARIES: &str = + "1. Install pgml into your shared_preload_libraries:\n \tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' "; #[cfg(target_os = "macos")] -static PG_PGML_RESTART_MACOS: &str = -"2. Restart PostgreSQL:\n +static PG_PGML_RESTART_MACOS: &str = "2. Restart PostgreSQL:\n \tbrew service restart postgresql@15 "; #[cfg(target_os = "linux")] -static PG_PGML_RESTART_LINUX: &str = -"2. Restart PostgreSQL:\n +static PG_PGML_RESTART_LINUX: &str = "2. Restart PostgreSQL:\n \tsudo service postgresql restart "; +#[cfg(target_os = "macos")] +static PG_PGVECTOR: &str = "Install pgvector into your PostgreSQL database:\n +\tgit clone --branch v0.5.0 https://github.com/pgvector/pgvector && \\ +\tcd pgvector && \\ +\techo \"trusted = true\" >> vector.control && \\ +\tmake && \\ +\tmake install +"; -fn dependencies() -> anyhow::Result<()> { - print!("checking for psql..."); - if execute_command(Command::new("which").arg("psql")).is_err() { - error("error"); - error("psql not found, do you have PostgreSQL installed?"); +#[cfg(target_os = "linux")] +static PG_PGVECTOR: &str = "Install pgvector into your PostgreSQL database:\n +\tgit clone --branch v0.5.0 https://github.com/pgvector/pgvector && \\ +\tcd pgvector && \\ +\techo \"trusted = true\" >> vector.control && \\ +\tmake && \\ +\tsudo make install +"; - #[cfg(target_os = "macos")] - println!("{}", PG_WITH_BREW); +#[cfg(target_os = "macos")] +static PG_PGML: &str = "To install PostgresML into your PostgreSQL database, +follow the instructions on: - #[cfg(target_os = "linux")] - println!("{}", PG_WITH_APT); - std::process::exit(1); - } else { - info("ok"); - } +\thttps://postgresml.org/docs/guides/setup/v2/installation +"; - print!("checking PostgreSQL connectivity..."); - if let Err(err) = psql_output("SELECT version()") { - error("error"); - error("Could not connect to PostgreSQL"); - error!("{}", err); - std::process::exit(1); - } else { - info("ok"); - } +#[cfg(target_os = "linux")] +static PG_PGML: &str = "To install PostgresML +into your PostgreSQL database: + +1. Add your Aptitude repository into your sources: + +\techo \"deb [trusted=yes] https://apt.postgresml.org $(lsb_release -cs) main\" | \\ +\tsudo tee -a /etc/apt/sources.list + +2. Update Aptitude: + +\tsudo apt update + +3. Install PostgresML: + +\tsudo apt install postgresml-14 +"; - print!("checking shared_preload_libraries..."); +fn dependencies() -> anyhow::Result<()> { + ok_or_error!( + "checking for psql", + { execute_command(Command::new("which").arg("psql")).is_ok() }, + PG_INSTALL + ); + + ok_or_error!( + "checking PostgreSQL connectivity", + { + if let Err(err) = psql_output("SELECT version()") { + error!("{}", err); + false + } else { + true + } + }, + "Could not connect to PostgreSQL with psql" + ); + + ok_or_error!( + "checking for pgvector PostgreSQL extension", + { + let output = psql_output( + " + SELECT + name + FROM + pg_available_extensions + WHERE name = 'vector' + ", + )?; + output.contains("vector") + }, + PG_PGVECTOR + ); + + ok_or_error!( + "checking for pgml PostgreSQL extension", + { + let output = psql_output( + " + SELECT + name + FROM + pg_available_extensions + WHERE name = 'pgml' + ", + )?; + output.contains("pgml") + }, + PG_PGML + ); + + print("checking shared_preload_libraries..."); let output = psql_output("SHOW shared_preload_libraries")?; if !output.contains("pg_stat_statements") { error("error"); error("pg_stat_statements is not installed into shared_preload_libraries"); println!("{}", PG_PG_STAT_STATEMENTS); std::process::exit(1); - } else if output.contains("pgml") { + } else if !output.contains("pgml") { error("error"); error("pgml is not installed into shared_preload_libraries"); println!("{}", PG_PGML_SHARED_PRELOAD_LIBRARIES); @@ -90,6 +157,39 @@ fn dependencies() -> anyhow::Result<()> { info("ok"); } + print("checking for dashboard database..."); + let output = psql_output( + "SELECT datname FROM pg_database WHERE datname = 'pgml_dashboard_development'", + )?; + if !output.contains("pgml_dashboard_development") { + warn("missing"); + print("creating pgml_dashboard_development database..."); + unwrap_or_exit!(execute_command( + Command::new("createdb").arg("pgml_dashboard_development") + )); + info("ok"); + print("creating vector extension..."); + unwrap_or_exit!(execute_command( + Command::new("psql") + .arg("-c") + .arg("CREATE EXTENSION IF NOT EXISTS vector") + .arg("pgml_dashboard_development") + )); + info("ok"); + print("creating pgml extension..."); + unwrap_or_exit!(execute_command( + Command::new("psql") + .arg("-c") + .arg("CREATE EXTENSION IF NOT EXISTS pgml") + .arg("pgml_dashboard_development") + )); + info("ok"); + } else { + info("ok"); + } + + info("all dependencies are installed and working"); + Ok(()) } diff --git a/packages/cargo-pgml-components/src/main.rs b/packages/cargo-pgml-components/src/main.rs index a85702b4d..30711d700 100644 --- a/packages/cargo-pgml-components/src/main.rs +++ b/packages/cargo-pgml-components/src/main.rs @@ -11,8 +11,8 @@ extern crate log; mod backend; mod config; mod frontend; -mod util; mod local_dev; +mod util; use config::Config; use util::{info, unwrap_or_exit}; @@ -89,7 +89,7 @@ fn main() { crate::frontend::components::add(&Path::new(&name), pgml_commands.overwrite) } }, - Commands::LocalDev{} => local_dev::setup(), + Commands::LocalDev {} => local_dev::setup(), } } } diff --git a/packages/cargo-pgml-components/src/util.rs b/packages/cargo-pgml-components/src/util.rs index e3406e523..b366fdf85 100644 --- a/packages/cargo-pgml-components/src/util.rs +++ b/packages/cargo-pgml-components/src/util.rs @@ -59,7 +59,7 @@ pub fn execute_command(command: &mut Command) -> std::io::Result { return Err(err); } }; - + let stderr = unwrap_or_exit!(String::from_utf8(output.stderr)).to_string(); let stdout = unwrap_or_exit!(String::from_utf8(output.stdout)).to_string(); @@ -109,11 +109,31 @@ pub fn compare_strings(string1: &str, string2: &str) -> bool { pub fn psql_output(query: &str) -> std::io::Result { let mut cmd = Command::new("psql"); - cmd - .arg("-c") - .arg(query) - .arg("-t"); + cmd.arg("-c").arg(query).arg("-t"); let output = execute_command(&mut cmd)?; Ok(output.trim().to_string()) } + +pub fn print(s: &str) { + print!("{}", s); + let _ = std::io::stdout().flush(); +} + +macro_rules! ok_or_error { + ($what:expr, $expr:block, $howto:expr) => {{ + use std::io::Write; + print!("{}...", $what); + let _ = std::io::stdout().flush(); + + if $expr { + crate::util::info("ok"); + } else { + crate::util::error("error"); + println!("{}", $howto); + std::process::exit(1); + } + }}; +} + +pub(crate) use ok_or_error; From 8796dc2b96337fe77bc28e3ec74345dc22b8b1bc Mon Sep 17 00:00:00 2001 From: Lev Date: Tue, 3 Oct 2023 15:55:49 -0700 Subject: [PATCH 3/4] Little somethiing --- packages/cargo-pgml-components/Cargo.lock | 2 +- packages/cargo-pgml-components/Cargo.toml | 2 +- .../cargo-pgml-components/src/local_dev.rs | 142 ++++++++++++------ packages/cargo-pgml-components/src/util.rs | 14 +- 4 files changed, 103 insertions(+), 57 deletions(-) diff --git a/packages/cargo-pgml-components/Cargo.lock b/packages/cargo-pgml-components/Cargo.lock index da2aebdca..c3b3d68ef 100644 --- a/packages/cargo-pgml-components/Cargo.lock +++ b/packages/cargo-pgml-components/Cargo.lock @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cargo-pgml-components" -version = "0.1.17" +version = "0.1.18-rc.1" dependencies = [ "anyhow", "assert_cmd", diff --git a/packages/cargo-pgml-components/Cargo.toml b/packages/cargo-pgml-components/Cargo.toml index 94788967f..7919d9086 100644 --- a/packages/cargo-pgml-components/Cargo.toml +++ b/packages/cargo-pgml-components/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-pgml-components" -version = "0.1.17" +version = "0.1.18-rc.1" edition = "2021" authors = ["PostgresML "] license = "MIT" diff --git a/packages/cargo-pgml-components/src/local_dev.rs b/packages/cargo-pgml-components/src/local_dev.rs index 2d2043498..8a8fd965b 100644 --- a/packages/cargo-pgml-components/src/local_dev.rs +++ b/packages/cargo-pgml-components/src/local_dev.rs @@ -3,38 +3,54 @@ //! Code to handle the setup of our pretty complex local development //! environment. -use crate::util::{ - debug1, error, execute_command, info, ok_or_error, print, psql_output, unwrap_or_exit, warn, -}; +use crate::util::{execute_command, info, ok_or_error, print, psql_output, unwrap_or_exit, warn}; use std::process::Command; #[cfg(target_os = "macos")] -static PG_INSTALL: &str = "Install PostgreSQL with brew:\n +static PG_INSTALL: &str = " +Install PostgreSQL with brew:\n \tbrew install postgresql@15 "; #[cfg(target_os = "linux")] -static PG_INSTALL: &str = "Install PostgreSQL with Aptitude:\n -\tapt install postgresql +static PG_INSTALL: &str = " +Install PostgreSQL with Aptitude:\n +\tsudo apt install postgresql "; -static PG_PG_STAT_STATEMENTS: &str = "Install pg_stat_statements into your database: -\tpsql -d postgres -c 'CREATE EXTENSION pg_stat_statements' -\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' +#[cfg(target_os = "macos")] +static BUILD_ESSENTIAL: &str = " +Install build tools with Aptitude:\n +\txcode-select --install "; -static PG_PGML_SHARED_PRELOAD_LIBRARIES: &str = - "1. Install pgml into your shared_preload_libraries:\n -\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' +#[cfg(target_os = "linux")] +static BUILD_ESSENTIAL: &str = " +Install build tools with Aptitude:\n +\tsudo apt install build-essential "; #[cfg(target_os = "macos")] -static PG_PGML_RESTART_MACOS: &str = "2. Restart PostgreSQL:\n +static PG_PG_STAT_STATEMENTS: &str = " +To install pg_stat_statements into your database: + +1. Create the extension in PostgreSQL:\n +\tpsql -d postgres -c 'CREATE EXTENSION pg_stat_statements' +2. Add pg_stat_statements into your shared_preload_libraries:\n +\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' +3. Restart PostgreSQL:\n \tbrew service restart postgresql@15 "; #[cfg(target_os = "linux")] -static PG_PGML_RESTART_LINUX: &str = "2. Restart PostgreSQL:\n +static PG_PG_STAT_STATEMENTS: &str = " +To install pg_stat_statements into your database: + +1. Create the extension in PostgreSQL:\n +\tpsql -d postgres -c 'CREATE EXTENSION pg_stat_statements' +2. Add pg_stat_statements into your shared_preload_libraries:\n +\tpsql -c 'ALTER SYSTEM SET shared_preload_libraries TO pgml,pg_stat_statements' +3. Restart PostgreSQL:\n \tsudo service postgresql restart "; @@ -81,6 +97,51 @@ into your PostgreSQL database: \tsudo apt install postgresml-14 "; +fn postgres_running() -> String { + let whoami = unwrap_or_exit!(execute_command(&mut Command::new("whoami"))); + + let running = format!( + " +Could not connect to PostgreSQL database 'postgres' with psql.\n +Is PostgreSQL running and accepting connections? + " + ); + + #[cfg(target_os = "macos")] + let start = format!( + " +To start PostgreSQL, run:\n +\tbrew service start postgresql@15 + " + ); + + #[cfg(target_os = "linux")] + let start = format!( + " +To start PostgreSQL, run:\n +\tsudo service postgresql start + " + ); + + let user = format!( + " +If PostgreSQL is already running, your current UNIX user is +not allowed to connect to the 'postgres' database with psql +using a UNIX socket. + +To make sure your user is allowed to connect: + +1. Create the role:\n +\tcreaterole --superuser --login {whoami} + +2. Create the user's database:\n +\t createdb {whoami} + " + ); + + running + &start + &user +} + fn dependencies() -> anyhow::Result<()> { ok_or_error!( "checking for psql", @@ -89,7 +150,13 @@ fn dependencies() -> anyhow::Result<()> { ); ok_or_error!( - "checking PostgreSQL connectivity", + "checking for build tools", + { execute_command(Command::new("which").arg("gcc")).is_ok() }, + BUILD_ESSENTIAL + ); + + ok_or_error!( + "checking for PostgreSQL connectivity", { if let Err(err) = psql_output("SELECT version()") { error!("{}", err); @@ -98,7 +165,7 @@ fn dependencies() -> anyhow::Result<()> { true } }, - "Could not connect to PostgreSQL with psql" + postgres_running() ); ok_or_error!( @@ -121,7 +188,7 @@ fn dependencies() -> anyhow::Result<()> { ok_or_error!( "checking for pgml PostgreSQL extension", { - let output = psql_output( + let output_installed = psql_output( " SELECT name @@ -130,32 +197,23 @@ fn dependencies() -> anyhow::Result<()> { WHERE name = 'pgml' ", )?; - output.contains("pgml") + + let output_shared = psql_output("SHOW shared_preload_libraries")?; + + output_installed.contains("pgml") && output_shared.contains("pgml") }, PG_PGML ); - print("checking shared_preload_libraries..."); - let output = psql_output("SHOW shared_preload_libraries")?; - if !output.contains("pg_stat_statements") { - error("error"); - error("pg_stat_statements is not installed into shared_preload_libraries"); - println!("{}", PG_PG_STAT_STATEMENTS); - std::process::exit(1); - } else if !output.contains("pgml") { - error("error"); - error("pgml is not installed into shared_preload_libraries"); - println!("{}", PG_PGML_SHARED_PRELOAD_LIBRARIES); - - #[cfg(target_os = "macos")] - println!("{}", PG_PGML_RESTART_MACOS); - - #[cfg(target_os = "linux")] - println!("{}", PG_PGML_RESTART_LINUX); - std::process::exit(1); - } else { - info("ok"); - } + ok_or_error!( + "checking for pg_stat_statements PostgreSQL extension", + { + let output_installed = psql_output("SHOW shared_preload_libraries")?; + let output_running = psql_output("SELECT * FROM pg_stat_statements LIMIT 1"); + output_installed.contains("pg_stat_statements") && output_running.is_ok() + }, + PG_PG_STAT_STATEMENTS + ); print("checking for dashboard database..."); let output = psql_output( @@ -168,7 +226,7 @@ fn dependencies() -> anyhow::Result<()> { Command::new("createdb").arg("pgml_dashboard_development") )); info("ok"); - print("creating vector extension..."); + print("creating vector extension in pgml_dashboard_development..."); unwrap_or_exit!(execute_command( Command::new("psql") .arg("-c") @@ -176,7 +234,7 @@ fn dependencies() -> anyhow::Result<()> { .arg("pgml_dashboard_development") )); info("ok"); - print("creating pgml extension..."); + print("creating pgml extension in pgml_dashboard_development..."); unwrap_or_exit!(execute_command( Command::new("psql") .arg("-c") @@ -194,5 +252,5 @@ fn dependencies() -> anyhow::Result<()> { } pub fn setup() { - dependencies().unwrap(); + unwrap_or_exit!(dependencies()) } diff --git a/packages/cargo-pgml-components/src/util.rs b/packages/cargo-pgml-components/src/util.rs index b366fdf85..b2f8c4e82 100644 --- a/packages/cargo-pgml-components/src/util.rs +++ b/packages/cargo-pgml-components/src/util.rs @@ -30,26 +30,14 @@ pub fn info(value: &str) { println!("{}", value.green()); } -pub fn info_n(value: &str) { - print!("{}", value.green()); -} - pub fn error(value: &str) { println!("{}", value.red()); } -pub fn error_n(value: &str) { - print!("{}", value.red()); -} - pub fn warn(value: &str) { println!("{}", value.yellow()); } -pub fn warn_n(value: &str) { - print!("{}", value.yellow()); -} - pub fn execute_command(command: &mut Command) -> std::io::Result { debug!("Executing {:?}", command); @@ -109,7 +97,7 @@ pub fn compare_strings(string1: &str, string2: &str) -> bool { pub fn psql_output(query: &str) -> std::io::Result { let mut cmd = Command::new("psql"); - cmd.arg("-c").arg(query).arg("-t"); + cmd.arg("-c").arg(query).arg("-t").arg("-d").arg("postgres"); let output = execute_command(&mut cmd)?; Ok(output.trim().to_string()) From e0ea180b36054ea474e6ba52d7ff3b964708bf26 Mon Sep 17 00:00:00 2001 From: Lev Date: Tue, 3 Oct 2023 15:56:46 -0700 Subject: [PATCH 4/4] alpha --- packages/cargo-pgml-components/Cargo.lock | 2 +- packages/cargo-pgml-components/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cargo-pgml-components/Cargo.lock b/packages/cargo-pgml-components/Cargo.lock index c3b3d68ef..724d159c8 100644 --- a/packages/cargo-pgml-components/Cargo.lock +++ b/packages/cargo-pgml-components/Cargo.lock @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cargo-pgml-components" -version = "0.1.18-rc.1" +version = "0.1.18-alpha.1" dependencies = [ "anyhow", "assert_cmd", diff --git a/packages/cargo-pgml-components/Cargo.toml b/packages/cargo-pgml-components/Cargo.toml index 7919d9086..d24201cc2 100644 --- a/packages/cargo-pgml-components/Cargo.toml +++ b/packages/cargo-pgml-components/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-pgml-components" -version = "0.1.18-rc.1" +version = "0.1.18-alpha.1" edition = "2021" authors = ["PostgresML "] license = "MIT"