commit 69b42ff74f6b806d13556cca1b8cb7d1bbd3c9c4 Author: Jonas Braus Date: Sat Jan 17 01:25:57 2026 +0100 initial diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..13c456b --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[target.'cfg(target_os="macos")'] +# Postgres symbols won't be available until runtime +rustflags = ["-Clink-arg=-Wl,-undefined,dynamic_lookup"] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..abf56f2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +.idea/ +/target +*.iml +**/*.rs.bk +Cargo.lock +tests/pg_regress/results +tests/pg_regress/regression.diffs +tests/pg_regress/regression.out diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..055209f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "pgerr" +version = "0.0.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] + +[[bin]] +name = "pgrx_embed_pgerr" +path = "./src/bin/pgrx_embed.rs" + +[features] +default = ["pg13"] +pg13 = ["pgrx/pg13", "pgrx-tests/pg13" ] +pg14 = ["pgrx/pg14", "pgrx-tests/pg14" ] +pg15 = ["pgrx/pg15", "pgrx-tests/pg15" ] +pg16 = ["pgrx/pg16", "pgrx-tests/pg16" ] +pg17 = ["pgrx/pg17", "pgrx-tests/pg17" ] +pg18 = ["pgrx/pg18", "pgrx-tests/pg18" ] +pg_test = [] + +[dependencies] +pgrx = "=0.16.1" +serde_json = "1.0.149" +sysinfo = "0.37.2" + +[dev-dependencies] +pgrx-tests = "=0.16.1" + +[profile.dev] +panic = "unwind" + +[profile.release] +panic = "unwind" +opt-level = 3 +lto = "fat" +codegen-units = 1 diff --git a/pgerr.control b/pgerr.control new file mode 100644 index 0000000..48ae20b --- /dev/null +++ b/pgerr.control @@ -0,0 +1,6 @@ +comment = 'pgerr: Created by pgrx' +default_version = '@CARGO_VERSION@' +module_pathname = 'pgerr' +relocatable = false +superuser = true +trusted = false diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..2fa879e --- /dev/null +++ b/readme.md @@ -0,0 +1,2 @@ +- Install `cargo`, `pgrx` and initialize +- run with `cargo pgrx run p17` \ No newline at end of file diff --git a/src/bin/pgrx_embed.rs b/src/bin/pgrx_embed.rs new file mode 100644 index 0000000..57483f1 --- /dev/null +++ b/src/bin/pgrx_embed.rs @@ -0,0 +1 @@ +::pgrx::pgrx_embed!(); \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..dfa7cc5 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,67 @@ +use std::{thread, time::Duration}; + +use pgrx::prelude::*; +use sysinfo::System; + +::pgrx::pg_module_magic!(name, version); + +#[pg_extern] +fn pgerr() -> String { + String::from("pgerr extension running!") +} + +pub struct SystemMetrics { + pub cpu_usage: f32, + pub used_memory: f32, + pub total_memory: f32, +} + +fn get_metrics() -> SystemMetrics { + let mut sys = System::new_all(); + + sys.refresh_all(); + thread::sleep(Duration::from_millis(500)); + sys.refresh_all(); + + SystemMetrics { + cpu_usage: sys.global_cpu_usage(), + used_memory: sys.used_memory() as f32, + total_memory: sys.total_memory() as f32, + } +} + +fn convert_bytes(byte_value: &mut f32, iters: Option) { + let iters = iters.unwrap_or(3); + + for _ in 0..iters { + *byte_value /= 1024.0; + } +} + + +#[pg_extern] +fn sys_stats(json: bool) -> String { + let mut stats = get_metrics(); + convert_bytes(&mut stats.used_memory, None); + convert_bytes(&mut stats.total_memory, None); + + let result = if json { + format!( + " +{{ + \"cpu\": {}, + \"ram_used\": {}, + \"ram_total\": {} +}} + ", + stats.cpu_usage, stats.used_memory, stats.total_memory + ) + } else { + format!( + "cpu={},ram used={}GB, ram total={}GB", + stats.cpu_usage, stats.used_memory, stats.total_memory + ) + }; + + result +} diff --git a/tests/pg_regress/expected/setup.out b/tests/pg_regress/expected/setup.out new file mode 100644 index 0000000..5de6f0f --- /dev/null +++ b/tests/pg_regress/expected/setup.out @@ -0,0 +1,3 @@ +-- this setup file is run immediately after the regression database is (re)created +-- the file is optional but you likely want to create the extension +CREATE EXTENSION pgerr; diff --git a/tests/pg_regress/sql/setup.sql b/tests/pg_regress/sql/setup.sql new file mode 100644 index 0000000..5de6f0f --- /dev/null +++ b/tests/pg_regress/sql/setup.sql @@ -0,0 +1,3 @@ +-- this setup file is run immediately after the regression database is (re)created +-- the file is optional but you likely want to create the extension +CREATE EXTENSION pgerr;