From 768baf5dc1aa8f06fa0fb3e622e1ed3e580a3e8c Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Sat, 12 Jul 2025 20:40:49 +0200 Subject: [PATCH] =?UTF-8?q?Test=20der=20Datenbank=20l=C3=A4uft=20im=20Hint?= =?UTF-8?q?ergrund?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/PostgreSqlConfigDialog.py | 86 ++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 14 deletions(-) diff --git a/src/ui/PostgreSqlConfigDialog.py b/src/ui/PostgreSqlConfigDialog.py index fdfc149..8c90bd1 100644 --- a/src/ui/PostgreSqlConfigDialog.py +++ b/src/ui/PostgreSqlConfigDialog.py @@ -1,10 +1,40 @@ -from PySide6.QtWidgets import QDialog, QMessageBox +from PySide6.QtWidgets import QDialog, QMessageBox, QApplication +from PySide6.QtCore import QThread, Signal, Qt from ui.PostgreSqlConfigDialog_ui import Ui_PostgreSqlConfigDialog import polars as pl +class DatabaseTestThread(QThread): + """Thread für den Datenbankverbindungstest.""" + + # Signale für die Kommunikation mit dem UI-Thread + test_completed = Signal(bool, str) # success, message + + def __init__(self, connection_data): + super().__init__() + self.connection_data = connection_data + + def run(self): + """Führt den Datenbanktest in einem separaten Thread aus.""" + try: + uri = f"postgresql://{self.connection_data['username']}:{self.connection_data['password']}@{self.connection_data['host']}:{self.connection_data['port']}/{self.connection_data['database']}" + + # Datenbankverbindung testen + r = pl.read_database_uri( + query="SELECT 1", + uri=uri + ) + + # Erfolg signalisieren + self.test_completed.emit(True, f"Verbindung erfolgreich:\n{str(r)}") + + except Exception as e: + # Fehler signalisieren + self.test_completed.emit(False, f"Verbindung fehlgeschlagen:\n{str(e)}") + + class PostgreSqlConfigDialog(QDialog): """Dialog zur Konfiguration einer PostgreSQL-Datenbank ohne ID.""" @@ -18,25 +48,53 @@ class PostgreSqlConfigDialog(QDialog): # SSL-Modus auf "prefer" setzen (Standard) self.ui.sslModeComboBox.setCurrentText("prefer") + # Thread für Datenbanktest + self.test_thread = None + # Signale verbinden self.ui.testConnectionButton.clicked.connect(self.test_connection) def test_connection(self): - """Testet die Datenbankverbindung.""" - # Hier könnte eine echte Verbindung getestet werden - # Für jetzt zeigen wir nur eine Info-Nachricht - data = self.get_data() or {} + """Testet die Datenbankverbindung in einem separaten Thread.""" + data = self.get_data() + if not data: + QMessageBox.warning(self, "Verbindungstest", "Bitte füllen Sie alle erforderlichen Felder aus.") + return - try: - r = pl.read_database_uri( - query="SELECT 1", - uri=f"postgresql://{data['username']}:{data['password']}@{data['host']}:{data['port']}/{data['database']}" - ) + # Button deaktivieren und Text mit Sanduhrsymbol ändern + self.ui.testConnectionButton.setEnabled(False) + original_text = self.ui.testConnectionButton.text() + self.ui.testConnectionButton.setText("⏳ Teste Verbindung...") + + # Wartecursor setzen + QApplication.setOverrideCursor(Qt.WaitCursor) - QMessageBox.information(self, "Verbindungstest", f"Vebindung erfolgreich:\n{str(r)}") - except Exception as e: - QMessageBox.warning(self, "Verbindungstest", f"Verbindung fehlgeschlagen:\n{e}") - raise e + # Thread erstellen und starten + self.test_thread = DatabaseTestThread(data) + self.test_thread.test_completed.connect(self.on_test_completed) + self.test_thread.finished.connect(lambda: self.cleanup_test(original_text)) + self.test_thread.start() + + def on_test_completed(self, success, message): + """Wird aufgerufen, wenn der Datenbanktest abgeschlossen ist.""" + if success: + QMessageBox.information(self, "Verbindungstest", message) + else: + QMessageBox.warning(self, "Verbindungstest", message) + + def cleanup_test(self, original_text): + """Räumt nach dem Test auf.""" + # Wartecursor entfernen + QApplication.restoreOverrideCursor() + + # Button wieder aktivieren und ursprünglichen Text wiederherstellen + self.ui.testConnectionButton.setEnabled(True) + self.ui.testConnectionButton.setText(original_text) + + # Thread-Referenz löschen + if self.test_thread: + self.test_thread.deleteLater() + self.test_thread = None def set_data(self, data): """Setzt die Daten in den Dialog."""