Fixed Test Connection button,

Implemented Threading
This commit is contained in:
crennis 2023-05-05 11:18:17 +02:00
parent 3336f12a18
commit 07410e66ff

View File

@ -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()