summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wong <mark@2ndQuadrant.com>2020-11-17 05:28:18 +0000
committerMark Wong <markwkm@gmail.com>2021-01-07 16:37:11 -0800
commit06c4cbf232abc9f5279834af42f5decd0e0a0746 (patch)
tree5f52d67cd62162d87a08329c51c2487f5da85afd
parent44942225e93b54c02c89a30e5db0173929e28fb8 (diff)
Create separate functions for displaying each component
-rw-r--r--src/display.rs65
-rw-r--r--src/pg_top.rs78
2 files changed, 76 insertions, 67 deletions
diff --git a/src/display.rs b/src/display.rs
new file mode 100644
index 0000000..0498c81
--- /dev/null
+++ b/src/display.rs
@@ -0,0 +1,65 @@
+use crate::os;
+use crate::postgresql::Backend;
+use crate::PGTOP;
+
+use std::io::{stdout, Write};
+use termion::raw::IntoRawMode;
+
+pub fn loadavg(terminal_width: usize) {
+ let mut line = format!("load avg: {}", os::get_loadavg());
+ line.truncate(terminal_width);
+ let mut stdout = stdout().into_raw_mode().unwrap();
+ write!(stdout, "{}{}", termion::cursor::Goto(1, 1), line).unwrap();
+ stdout.flush().unwrap();
+}
+
+pub fn process_summary(processes: Vec<Backend>, terminal_width: usize) -> Vec<Backend> {
+ let mut line = format!("{} processes", processes.len());
+ line.truncate(terminal_width);
+ let mut stdout = stdout().into_raw_mode().unwrap();
+ write!(stdout, "{}{}", termion::cursor::Goto(1, 2), line).unwrap();
+ stdout.flush().unwrap();
+ return processes;
+}
+
+pub fn processes(processes: Vec<Backend>, terminal_width: usize) {
+ let mut current_line = 5;
+ let mut stdout = stdout().into_raw_mode().unwrap();
+ for process in processes {
+ let mut line = format!(
+ "{} {} {} {} {} {} {}",
+ process.pid,
+ process.state,
+ process.usename,
+ process.xtime,
+ process.qtime,
+ process.locks,
+ process.query.replace("\n", ""),
+ );
+ line.truncate(terminal_width);
+ write!(stdout, "{}{}", termion::cursor::Goto(1, current_line), line,).unwrap();
+ stdout.flush().unwrap();
+ current_line = current_line + 1;
+ }
+}
+
+pub fn stat_cpu(mut pg_top: PGTOP, terminal_width: usize) -> PGTOP {
+ let temp = pg_top.new;
+ pg_top.new = pg_top.old;
+ pg_top.old = temp;
+
+ pg_top.cpu.stat[pg_top.new] = os::get_stat_cpu();
+
+ let per = os::get_stat_cpu_percentage(pg_top.cpu.stat[pg_top.new], pg_top.cpu.stat[pg_top.old]);
+
+ let mut line = format!(
+ "CPU States: {:.1}% user, {:.1}% nice, {:.1}% system, {:.1}% idle, {:.1}% iowait",
+ per[0], per[1], per[2], per[3], per[4]
+ );
+ line.truncate(terminal_width);
+ let mut stdout = stdout().into_raw_mode().unwrap();
+ write!(stdout, "{}{}", termion::cursor::Goto(1, 3), line).unwrap();
+ stdout.flush().unwrap();
+
+ return pg_top;
+}
diff --git a/src/pg_top.rs b/src/pg_top.rs
index a7bc201..8c949e4 100644
--- a/src/pg_top.rs
+++ b/src/pg_top.rs
@@ -12,10 +12,10 @@ use std::thread;
use std::time::Duration;
use termion::raw::IntoRawMode;
-struct PGTOP {
- new: usize,
- old: usize,
- cpu: os::CPUSTAT,
+pub struct PGTOP {
+ pub new: usize,
+ pub old: usize,
+ pub cpu: os::CPUSTAT,
}
fn main() {
@@ -86,77 +86,21 @@ fn main() {
write!(stdout, "{}{}", termion::clear::All, termion::cursor::Hide).unwrap();
loop {
- let terminal_size = termion::terminal_size().unwrap();
let mut client = postgresql::connect(&conninfo);
+ let mut processes = postgresql::get_processes(&mut client);
+ let terminal_size = termion::terminal_size().unwrap();
- let mut current_line = 1;
-
- write!(
- stdout,
- "{}load avg: {}",
- termion::cursor::Goto(1, current_line),
- os::get_loadavg(),
- )
- .unwrap();
- stdout.flush().unwrap();
- current_line = current_line + 1;
-
- let processes = postgresql::get_processes(&mut client);
-
- write!(
- stdout,
- "{}{} processes",
- termion::cursor::Goto(1, current_line),
- processes.len(),
- )
- .unwrap();
- stdout.flush().unwrap();
- current_line = current_line + 1;
-
- let temp = pg_top.new;
- pg_top.new = pg_top.old;
- pg_top.old = temp;
- pg_top.cpu.stat[pg_top.new] = os::get_stat_cpu();
- let per =
- os::get_stat_cpu_percentage(pg_top.cpu.stat[pg_top.new], pg_top.cpu.stat[pg_top.old]);
- write!(
- stdout,
- "{}CPU States: {:.1}% user, {:.1}% nice, {:.1}% system, {:.1}% idle, {:.1}% iowait",
- termion::cursor::Goto(1, current_line),
- per[0],
- per[1],
- per[2],
- per[3],
- per[4],
- )
- .unwrap();
- stdout.flush().unwrap();
- current_line = current_line + 1;
-
- current_line = current_line + 1;
- for process in processes {
- let mut line = format!(
- "{} {} {} {} {} {} {}",
- process.pid,
- process.state,
- process.usename,
- process.xtime,
- process.qtime,
- process.locks,
- process.query.replace("\n", ""),
- );
- line.truncate(terminal_size.0 as usize);
- write!(stdout, "{}{}", termion::cursor::Goto(1, current_line), line,).unwrap();
- stdout.flush().unwrap();
- current_line = current_line + 1;
- }
+ display::loadavg(terminal_size.0 as usize);
+ processes = display::process_summary(processes, terminal_size.0 as usize);
+ display::processes(processes, terminal_size.0 as usize);
+ pg_top = display::stat_cpu(pg_top, terminal_size.0 as usize);
count = count - 1;
if count == 0 {
write!(
stdout,
"{}{}",
- termion::cursor::Goto(1, current_line),
+ termion::cursor::Goto(1, terminal_size.1),
termion::cursor::Show,
)
.unwrap();