Error case in full table csv export, documentation

This commit is contained in:
Lea Laux 2021-02-25 11:58:29 +01:00 committed by KDV Admin
parent 883adeaaff
commit 8728ef3dbe
3 changed files with 58 additions and 9 deletions

View File

@ -1,14 +1,20 @@
import logging
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QFileDialog, QMessageBox
from pygadmin.database_query_executor import DatabaseQueryExecutor
from pygadmin.connectionfactory import global_connection_factory
class CSVExporter:
class CSVExporter(QObject):
# Create a signal for a successful export.
export_complete = pyqtSignal(bool)
"""
Create a class for exporting the current results to a CSV file. TODO: Docu
Create a class for exporting the current results to a CSV file. It is possible to use an existing data list or to
get the data (list) with the database query executor. Use a QObject for emitting signals.
"""
def __init__(self, parent, data_list, database_connection_parameters=None, table_name=None):
@ -16,6 +22,8 @@ class CSVExporter:
Get the parent for assigning the file dialog to a widget and the data list for the data, which will be saved.
"""
super().__init__()
# If the data list is None and the database connection parameters are None, there is no way to get the required
# data for the csv file.
if data_list is None and database_connection_parameters is None:
@ -42,35 +50,57 @@ class CSVExporter:
and the database query.
"""
# Get the database connection.
database_connection = self.get_database_connection(database_connection_parameters)
# If the database connection is None, the connection is broken or could not be established.
if database_connection is None:
# End the function, because there is not any data to get.
return
# Define the query for getting the data. The table name is based on a table name in a node, so an SQL injection
# at this point is highly unlikely.
query = "SELECT * FROM {};".format(table_name)
# Get a database query executor.
self.database_query_executor = DatabaseQueryExecutor()
# Connect the signal for the result data with the function for building and processing the result data list.
self.database_query_executor.result_data.connect(self.get_result_data_list)
# Set the database connection and the query.
self.database_query_executor.database_connection = database_connection
self.database_query_executor.database_query = query
def get_database_connection(self, database_connection_parameters):
"""
Get the database connection with help of the global connection factory and show an error, if the connection
fails.
"""
# Get the database connection.
database_connection = global_connection_factory.get_database_connection(database_connection_parameters["host"],
database_connection_parameters["user"],
database_connection_parameters[
"database"],
database_connection_parameters["port"])
# Check for a potential error.
if database_connection is None or database_connection is False:
# Show the error to the user.
QMessageBox.critical(self.parent, "Database Connection Fail", "The connection to the database failed, "
"please check the log for further "
"information.")
# Return None for the failure.
return None
# Return the database connection.
return database_connection
def get_result_data_list(self, data_list):
"""
Get the result data list, set the success to True and export and save the data.
"""
if data_list:
self.data_list = data_list
self.success = True
@ -113,7 +143,6 @@ class CSVExporter:
for data_value_counter in range(len(data_row)):
# Write every value.
file_to_save.write(str(data_row[data_value_counter]))
# If the value is not the last one, append a comma for comma separated value.
if data_value_counter != len(data_row) - 1:
file_to_save.write(",")
@ -121,6 +150,9 @@ class CSVExporter:
# Write a newline at the end of a data row.
file_to_save.write("\n")
# Emit the signal for a successful export.
self.export_complete.emit(True)
def export_and_save_csv_data(self):
"""
Activate the export and save of the csv data.

View File

@ -1075,10 +1075,12 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
Activate the export and save of the csv data.
"""
# TODO: Docu
# Get the csv exporter.
csv_exporter = CSVExporter(self, self.table_model.data_list)
# Get the success by the result of exporting/saving the csv data.
success = csv_exporter.export_and_save_csv_data()
# Show the success to the user.
if success:
QMessageBox.information(self, "Export Success", "The csv export was successful.")

View File

@ -986,7 +986,13 @@ class TreeWidget(QWidget):
self.materialized_view_information_dialog = MaterializedViewInformationDialog(current_node)
def get_full_data_of_current_table_for_csv_export(self, current_node):
# TODO: Docu
"""
Export the data of the selected table to a csv file.
"""
# Use the csv exporter: The data list is None (because there is currently no data list), the connection
# parameters are based on the parameters of the node (without the timeout) and the table name is the name of the
# node.
self.csv_exporter = CSVExporter(self, None, {"host": current_node.database_connection_parameters["host"],
"user": current_node.database_connection_parameters["user"],
"database":
@ -994,8 +1000,17 @@ class TreeWidget(QWidget):
"port": current_node.database_connection_parameters["port"]},
current_node.name)
# Export and save the csv data.
self.csv_exporter.export_and_save_csv_data()
self.csv_exporter.database_query_executor.result_data.connect(lambda:
QMessageBox.information(self, "Export Success",
# Connect the success of the export with a message box for showing the success.
self.csv_exporter.export_complete.connect(lambda: QMessageBox.information(self, "Export Success",
"The csv export was "
"successful."))
# Connect the failure of the data list with a message box for whoring the error.
self.csv_exporter.database_query_executor.error.connect(lambda error: QMessageBox.critical(self, "Export Error",
"The export "
"failed with "
"error: {"
"}".format(
error[1])))