diff --git a/gui/main.py b/gui/main.py index eb2b7db..52b7fcc 100644 --- a/gui/main.py +++ b/gui/main.py @@ -2,6 +2,7 @@ import json import os import sys +from PyQt5.QtCore import QObject, QThread, pyqtSignal from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog import modules.aisql as aisql @@ -19,6 +20,57 @@ dbtypes = { 2: "SQLite" } +# Load DB Config from file but check if file exists and create if not +def load_config(): + if not os.path.exists(os.path.join(configfolder, configfile)): + os.makedirs(configfolder) + with open(os.path.join(configfolder, configfile), "w") as f: + json.dump({ + "database": { + "dbtype": 0, + "ip": "", + "port": "", + "user": "", + "password": "", + "database": "" + }, + "apikey": "" + }, f, indent=4) + else: + with open(os.path.join(configfolder, configfile), "r") as f: + config = json.load(f) + type = config["database"]["dbtype"] + ip = config["database"]["ip"] + port = config["database"]["port"] + user = config["database"]["user"] + password = config["database"]["password"] + name = config["database"]["database"] + apikey = config["apikey"] + + return type, ip, port, user, password, name, apikey + + +class Worker(QObject): + finished = pyqtSignal() + test = False + + def __init__(self): + super().__init__() + + def test_db_connection(self, dbtype, dbip, dbport, dbuser, dbpass, dbname): + + try: + if dbtype == 0: + import database.postgresql as pg + self.db = pg.Postgres(dbip, dbport, dbuser, dbpass, dbname) + + if self.db.test_connection(): + self.test = True + except Exception as e: + print(e) + + + self.finished.emit() class MainWindow(QMainWindow): def __init__(self): @@ -45,44 +97,15 @@ class MainWindow(QMainWindow): # Pressed Execute Button self.ui.executeButton.clicked.connect(self.on_execute_button_clicked) - self.load_config() - - def load_config(self): - # Load DB Config from file but check if file exists and create if not - if not os.path.exists(os.path.join(configfolder, configfile)): - os.makedirs(configfolder) - with open(os.path.join(configfolder, configfile), "w") as f: - json.dump({ - "database": { - "dbtype": 0, - "ip": "", - "port": "", - "user": "", - "password": "", - "database": "" - }, - "apikey": "" - }, f, indent=4) - else: - with open(os.path.join(configfolder, configfile), "r") as f: - self.config = json.load(f) - self.dbtype = self.config["database"]["dbtype"] - self.dbip = self.config["database"]["ip"] - self.dbport = self.config["database"]["port"] - self.dbuser = self.config["database"]["user"] - self.dbpass = self.config["database"]["password"] - self.dbname = self.config["database"]["database"] - self.apikey = self.config["apikey"] - - self.try_to_connect() - def try_to_connect(self): + dbtype, dbip, dbport, dbuser, dbpass, dbname, apikey = load_config() try: - if self.dbtype == 0: + if dbtype == 0: import database.postgresql as pg - self.db = pg.Postgres(self.dbip, self.dbport, self.dbuser, self.dbpass, self.dbname) + self.db = pg.Postgres(dbip, dbport, dbuser, dbpass, dbname) self.tableschema = self.db.get_schema() + print('Database Connected') except Exception as e: print('No Database Connection') @@ -110,6 +133,7 @@ class MainWindow(QMainWindow): def on_execute_button_clicked(self): print("Execute Button Clicked") + self.try_to_connect() ai = aisql.AI(self.apikey) self.ui.outputLabel.setText("Executing...") self.load_config() @@ -124,7 +148,7 @@ class MainWindow(QMainWindow): print(fetch) elif "fetchmany".casefold() in decision.casefold(): size = decision.split("=")[1].strip("]") - fetch = elf.db.fetchmany(sql, int(size)) + fetch = self.db.fetchmany(sql, int(size)) print(fetch) elif "execute".casefold() in decision.casefold(): self.db.execute(sql) @@ -172,7 +196,7 @@ class ConnectionWindow(QDialog): self.ui.saveButton.clicked.connect(self.on_save_button_clicked) # Pressed Test Button - self.ui.testButton.clicked.connect(self.on_test_button_clicked) + self.ui.testButton.clicked.connect(self.start_db_test_thread) def on_text_changed(self): if self.ui.ipInput.text() == "" or self.ui.portInput.text() == "" or self.ui.databaseInput.text() == "": @@ -202,40 +226,39 @@ class ConnectionWindow(QDialog): self.close() - # FIXME: Crash when testing connection - def on_test_button_clicked(self): - self.dbtype = self.ui.dbtypeCombo.currentIndex() - self.dbip = self.ui.ipInput.text() - self.dbport = self.ui.portInput.text() - self.dbuser = self.ui.usernameInput.text() - self.dbpass = self.ui.passwordInput.text() - self.dbname = self.ui.databaseInput.text() - db = None - # Check type of Database - try: - if self.dbtype == 0: # PostgreSQL - import database.postgresql as postgresql - db = postgresql.Postgres(self.dbip, self.dbport, self.dbuser, self.dbpass, self.dbname) + def start_db_test_thread(self): + self.ui.returnLabel.setText("Testing...") + self.ui.returnLabel.setStyleSheet("color: black;") + self.ui.testButton.setEnabled(False) - except Exception as e: - self.ui.returnLabel.setText("Connection failed") - self.ui.returnLabel.setStyleSheet("color: red") - print(e) + dbtype = self.ui.dbtypeCombo.currentIndex() + ip = self.ui.ipInput.text() + port = self.ui.portInput.text() + user = self.ui.usernameInput.text() + password = self.ui.passwordInput.text() + database = self.ui.databaseInput.text() - if db is not None: - try: - if db.test_connection(): - self.ui.returnLabel.setText("Connection successful") - self.ui.returnLabel.setStyleSheet("color: green") - except Exception as e: - self.ui.returnLabel.setText("Connection failed") - self.ui.returnLabel.setStyleSheet("color: red") - print(e) + self.thread = QThread() + self.worker = Worker() + self.worker.moveToThread(self.thread) + self.thread.started.connect(lambda: self.worker.test_db_connection(dbtype, ip, port, user, password, database)) + self.worker.finished.connect(self.thread.quit) + self.thread.finished.connect(self.thread_complete) + + self.thread.start() + + def thread_complete(self): + if self.worker.test: + self.ui.returnLabel.setText("Connection Success!") + self.ui.returnLabel.setStyleSheet("color: green;") else: - self.ui.returnLabel.setText("Connection failed") - self.ui.returnLabel.setStyleSheet("color: red") + self.ui.returnLabel.setText("Connection Failed!") + self.ui.returnLabel.setStyleSheet("color: red;") + self.ui.testButton.setEnabled(True) + self.worker.deleteLater() + self.thread.deleteLater() ### Api Key Window ### class ApiKeyWindow(QDialog): @@ -295,7 +318,6 @@ class ApiKeyWindow(QDialog): self.ui.outputLabel.setText("API Key is invalid") self.ui.outputLabel.setStyleSheet("color: red") - if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow()