1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
use eframe::egui;
use postgres::{Client, NoTls};
struct MyApp {
client: Option<Client>,
tables: Vec<String>,
selected_table: Option<String>,
error: Option<String>,
}
impl Default for MyApp {
fn default() -> Self {
let mut app = Self {
client: None,
tables: Vec::new(),
selected_table: None,
error: None,
};
app.connect_and_load_tables();
app
}
}
impl MyApp {
fn connect_and_load_tables(&mut self) {
let result = Client::connect(
"host=localhost user=postgres password=test dbname=testdb",
NoTls,
);
match result {
Ok(mut client) => {
let rows = client.query(
"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'",
&[],
);
match rows {
Ok(rows) => {
self.tables = rows.iter().map(|r| r.get(0)).collect();
}
Err(e) => self.error = Some(format!("Query-Fehler: {e}")),
}
self.client = Some(client);
}
Err(e) => self.error = Some(format!("Verbindungsfehler: {e}")),
}
}
}
impl eframe::App for MyApp {
fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ui, |ui| {
ui.heading("Postgres Tabellen-Browser");
if let Some(err) = &self.error {
ui.colored_label(egui::Color32::RED, err);
return;
}
egui::ComboBox::from_label("Tabelle")
.selected_text(self.selected_table.clone().unwrap_or_default())
.show_ui(ui, |ui| {
for table in &self.tables {
ui.selectable_value(&mut self.selected_table, Some(table.clone()), table);
}
});
});
}
}
fn main() -> eframe::Result<()> {
eframe::run_native(
"Postgres Browser",
eframe::NativeOptions::default(),
Box::new(|_cc| Ok(Box::new(MyApp::default()))),
)
}
|