fn main() -> libpq::errors::Result {
let conninfo = std::env::args()
.nth(1)
.unwrap_or_else(|| "dbname = postgres".to_string());
let conn = libpq::Connection::new(&conninfo)?;
let res = conn.exec("SELECT pg_catalog.set_config('search_path', '', false)");
if res.status() != libpq::Status::TuplesOk {
panic!("SET failed: {:?}", conn.error_message());
}
let res = conn.exec("BEGIN");
if res.status() != libpq::Status::CommandOk {
panic!("BEGIN command failed: {:?}", conn.error_message());
}
let res = conn.exec("DECLARE myportal CURSOR FOR select * from pg_database");
if res.status() != libpq::Status::CommandOk {
panic!("DECLARE CURSOR failed: {:?}", conn.error_message());
}
let res = conn.exec("FETCH ALL in myportal");
if res.status() != libpq::Status::TuplesOk {
panic!("FETCH ALL failed: {:?}", conn.error_message());
}
let nfields = res.nfields();
for i in 0..nfields {
print!("{:15}", res.field_name(i)?.unwrap_or_default());
}
println!("\n");
for i in 0..res.ntuples() {
for j in 0..nfields {
let s = res
.value(i, j)
.map(|x| String::from_utf8(x.to_vec()).unwrap())
.unwrap_or_default();
print!("{s:15}");
}
println!();
}
conn.exec("CLOSE myportal");
conn.exec("END");
Ok(())
}