refactor: DatabaseChecker

This commit is contained in:
283375 2023-08-27 23:38:17 +08:00
parent e341b788fa
commit a9941e9c87
3 changed files with 232 additions and 185 deletions

View File

@ -1,13 +1,18 @@
import logging
import traceback
from typing import Literal, Optional, Union
from arcaea_offline.database import Database
from PySide6.QtCore import QDir, QFile, Qt, QTimer, Slot
from PySide6.QtCore import QCoreApplication, QDir, QFileInfo, Qt, QTimer, QUrl, Slot
from PySide6.QtWidgets import QDialog, QMessageBox
from ui.extends.shared.database import create_engine
from ui.extends.shared.settings import Settings
from .databaseChecker_ui import Ui_DatabaseChecker
logger = logging.getLogger(__name__)
class DatabaseChecker(Ui_DatabaseChecker, QDialog):
def __init__(self, parent=None):
@ -16,67 +21,98 @@ class DatabaseChecker(Ui_DatabaseChecker, QDialog):
self.setWindowFlag(Qt.WindowType.WindowMinimizeButtonHint, False)
self.setWindowFlag(Qt.WindowType.WindowMaximizeButtonHint, False)
self.setWindowFlag(Qt.WindowType.WindowCloseButtonHint, True)
self.dbFileSelector.setMode(self.dbFileSelector.getExistingDirectory)
self.dbFileSelector.filesSelected.connect(self.fileSelected)
self.dbDirSelector.setMode(self.dbDirSelector.getExistingDirectory)
self.confirmDbByExistingSettings = False
self.settings = Settings(self)
dbDir = self.settings.value("Default/DbDir", None, str)
if dbDir and QFile(QDir(dbDir).filePath(Database.dbFilename)).exists():
self.dbFileSelector.selectFile(dbDir)
result = self.checkDbVersion()
if result:
QTimer.singleShot(50, self.accept)
dbUrlString = self.settings.databaseUrl()
if dbUrlString:
dbFileUrl = QUrl(dbUrlString.replace("sqlite://", "file://"))
dbFileInfo = QFileInfo(dbFileUrl.toLocalFile())
if dbFileInfo.exists():
self.dbDirSelector.selectFile(dbFileInfo.path())
self.dbFilenameLineEdit.setText(dbFileInfo.fileName())
self.confirmDbByExistingSettings = True
self.confirmDbPathButton.click()
else:
self.dbFileSelector.selectFile(QDir.currentPath())
self.dbDirSelector.selectFile(QDir.currentPath())
self.dbFilenameLineEdit.setText("arcaea_offline.db")
else:
self.dbDirSelector.selectFile(QDir.currentPath())
self.dbFilenameLineEdit.setText("arcaea_offline.db")
def fileSelected(self):
self.checkDbVersion()
def checkDbVersion(self) -> str | None:
dbQDir = QDir(self.dbFileSelector.selectedFiles()[0])
dbDir = dbQDir.absolutePath()
dbDir = self.dbFileSelector.selectedFiles()[0]
dbQFile = QFile(QDir(dbDir).filePath(Database.dbFilename))
if not dbQFile.exists():
result = QMessageBox.question(self, "Database", "Create database file now?")
if result != QMessageBox.StandardButton.Yes:
return
dbQFile.open(QFile.OpenModeFlag.WriteOnly)
dbQFile.close()
Database.dbDir = dbDir
try:
with Database().conn as conn:
version = conn.execute(
"SELECT value FROM properties WHERE key = 'db_version'"
).fetchone()[0]
self.dbVersionLabel.setText(version)
self.continueButton.setEnabled(True)
def updateLabels(
self,
version: Union[Optional[int], Literal["reset"]],
init_status: Union[Optional[bool], Literal["reset"]],
):
if version is not None:
self.dbVersionLabel.setText(str(version))
elif version == "reset":
self.dbVersionLabel.setText("-")
if init_status is not None:
if init_status:
self.dbCheckConnLabel.setText('<font color="green">OK</font>')
self.settings.setValue("Default/DbDir", dbDir)
return version
except Exception as e:
QMessageBox.critical(
self, "Database Error", "\n".join(traceback.format_exception(e))
)
self.dbInitButton.setEnabled(True)
self.continueButton.setEnabled(False)
self.continueButton.setEnabled(True)
else:
self.dbCheckConnLabel.setText('<font color="red">Error</font>')
return False
self.continueButton.setEnabled(False)
elif init_status == "reset":
self.dbCheckConnLabel.setText("-")
self.continueButton.setEnabled(False)
@Slot()
def on_dbInitButton_clicked(self):
try:
Database().init()
except Exception as e:
QMessageBox.critical(
self, "Database Error", "\n".join(traceback.format_exception(e))
def on_confirmDbPathButton_clicked(self):
dbPath = QDir(self.dbDirSelector.selectedFiles()[0])
dbFileInfo = QFileInfo(
QDir.cleanPath(dbPath.absoluteFilePath(self.dbFilenameLineEdit.text()))
)
dbFileUrl = QUrl.fromLocalFile(dbFileInfo.filePath())
# dbSqliteUrl.setScheme("sqlite")
dbSqliteUrl = QUrl(dbFileUrl.toString().replace("file://", "sqlite://"))
if not dbFileInfo.exists():
confirm_new_database = QMessageBox.question(
self,
None,
# fmt: off
QCoreApplication.translate("DatabaseChecker", "dialog.confirmNewDatabase"),
# fmt: on
)
if confirm_new_database == QMessageBox.StandardButton.Yes:
db = Database(create_engine(dbSqliteUrl))
db.init()
self.on_confirmDbPathButton_clicked()
else:
db = Database(create_engine(dbSqliteUrl))
if db.check_init():
self.updateLabels(db.version(), True)
if self.confirmDbByExistingSettings:
QTimer.singleShot(25, self.accept)
else:
self.settings.setDatabaseUrl(dbSqliteUrl.toString())
else:
confirm_try_init = QMessageBox.question(
self,
None,
# fmt: off
QCoreApplication.translate("DatabaseChecker", "dialog.tryInit"),
# fmt: on
)
if confirm_try_init == QMessageBox.StandardButton.Yes:
try:
db.init(checkfirst=True)
except Exception as e:
logger.exception(
"Error while initializing an existing database"
)
QMessageBox.critical(
self, None, "\n".join(traceback.format_exception(e))
)
self.updateLabels("reset", False)
finally:
self.checkDbVersion()
self.on_confirmDbPathButton_clicked()
@Slot()
def on_continueButton_clicked(self):

View File

@ -25,51 +25,56 @@
</widget>
</item>
<item row="0" column="1">
<widget class="FileSelector" name="dbFileSelector" native="true"/>
<widget class="FileSelector" name="dbDirSelector" native="true"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>dbVersionLabel</string>
<string>dbFilenameLabel</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="dbFilenameLineEdit"/>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="confirmDbPathButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>confirmDbPathButton</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="1">
<widget class="QLabel" name="dbVersionLabel">
<property name="text">
<string notr="true">-</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>dbInitLabel</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>dbCheckConnLabel</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="dbInitButton">
<property name="text">
<string>dbInitButton</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="dbCheckConnLabel">
<property name="text">
<string notr="true">...</string>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="6" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -82,7 +87,21 @@
</property>
</spacer>
</item>
<item row="5" column="0" colspan="2">
<item row="7" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>dbCheckConnLabel</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QLabel" name="dbCheckConnLabel">
<property name="text">
<string notr="true">...</string>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<widget class="QPushButton" name="continueButton">
<property name="enabled">
<bool>false</bool>
@ -92,6 +111,20 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>dbVersionLabel</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>

View File

@ -3,146 +3,124 @@
################################################################################
## Form generated from reading UI file 'databaseChecker.ui'
##
## Created by: Qt User Interface Compiler version 6.5.0
## Created by: Qt User Interface Compiler version 6.5.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (
QCoreApplication,
QDate,
QDateTime,
QLocale,
QMetaObject,
QObject,
QPoint,
QRect,
QSize,
Qt,
QTime,
QUrl,
)
from PySide6.QtGui import (
QBrush,
QColor,
QConicalGradient,
QCursor,
QFont,
QFontDatabase,
QGradient,
QIcon,
QImage,
QKeySequence,
QLinearGradient,
QPainter,
QPalette,
QPixmap,
QRadialGradient,
QTransform,
)
from PySide6.QtWidgets import (
QApplication,
QFormLayout,
QLabel,
QPushButton,
QSizePolicy,
QSpacerItem,
QWidget,
)
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QFormLayout, QFrame, QHBoxLayout,
QLabel, QLineEdit, QPushButton, QSizePolicy,
QSpacerItem, QWidget)
from ui.implements.components.fileSelector import FileSelector
class Ui_DatabaseChecker(object):
def setupUi(self, DatabaseChecker):
if not DatabaseChecker.objectName():
DatabaseChecker.setObjectName("DatabaseChecker")
DatabaseChecker.setObjectName(u"DatabaseChecker")
DatabaseChecker.resize(350, 250)
DatabaseChecker.setWindowTitle("DatabaseChecker")
DatabaseChecker.setWindowTitle(u"DatabaseChecker")
self.formLayout = QFormLayout(DatabaseChecker)
self.formLayout.setObjectName("formLayout")
self.formLayout.setLabelAlignment(
Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter
)
self.formLayout.setObjectName(u"formLayout")
self.formLayout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.label = QLabel(DatabaseChecker)
self.label.setObjectName("label")
self.label.setObjectName(u"label")
self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label)
self.dbFileSelector = FileSelector(DatabaseChecker)
self.dbFileSelector.setObjectName("dbFileSelector")
self.dbDirSelector = FileSelector(DatabaseChecker)
self.dbDirSelector.setObjectName(u"dbDirSelector")
self.formLayout.setWidget(0, QFormLayout.FieldRole, self.dbFileSelector)
self.formLayout.setWidget(0, QFormLayout.FieldRole, self.dbDirSelector)
self.label_2 = QLabel(DatabaseChecker)
self.label_2.setObjectName("label_2")
self.label_3 = QLabel(DatabaseChecker)
self.label_3.setObjectName(u"label_3")
self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_2)
self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_3)
self.dbFilenameLineEdit = QLineEdit(DatabaseChecker)
self.dbFilenameLineEdit.setObjectName(u"dbFilenameLineEdit")
self.formLayout.setWidget(1, QFormLayout.FieldRole, self.dbFilenameLineEdit)
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout.addItem(self.horizontalSpacer)
self.confirmDbPathButton = QPushButton(DatabaseChecker)
self.confirmDbPathButton.setObjectName(u"confirmDbPathButton")
sizePolicy = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.confirmDbPathButton.sizePolicy().hasHeightForWidth())
self.confirmDbPathButton.setSizePolicy(sizePolicy)
self.horizontalLayout.addWidget(self.confirmDbPathButton)
self.formLayout.setLayout(2, QFormLayout.FieldRole, self.horizontalLayout)
self.dbVersionLabel = QLabel(DatabaseChecker)
self.dbVersionLabel.setObjectName("dbVersionLabel")
self.dbVersionLabel.setText("-")
self.dbVersionLabel.setObjectName(u"dbVersionLabel")
self.dbVersionLabel.setText(u"-")
self.formLayout.setWidget(1, QFormLayout.FieldRole, self.dbVersionLabel)
self.formLayout.setWidget(4, QFormLayout.FieldRole, self.dbVersionLabel)
self.label_4 = QLabel(DatabaseChecker)
self.label_4.setObjectName("label_4")
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_4)
self.formLayout.setItem(6, QFormLayout.FieldRole, self.verticalSpacer)
self.label_5 = QLabel(DatabaseChecker)
self.label_5.setObjectName("label_5")
self.label_5.setObjectName(u"label_5")
self.formLayout.setWidget(4, QFormLayout.LabelRole, self.label_5)
self.dbInitButton = QPushButton(DatabaseChecker)
self.dbInitButton.setObjectName("dbInitButton")
self.formLayout.setWidget(2, QFormLayout.FieldRole, self.dbInitButton)
self.formLayout.setWidget(7, QFormLayout.LabelRole, self.label_5)
self.dbCheckConnLabel = QLabel(DatabaseChecker)
self.dbCheckConnLabel.setObjectName("dbCheckConnLabel")
self.dbCheckConnLabel.setText("...")
self.dbCheckConnLabel.setObjectName(u"dbCheckConnLabel")
self.dbCheckConnLabel.setText(u"...")
self.formLayout.setWidget(4, QFormLayout.FieldRole, self.dbCheckConnLabel)
self.verticalSpacer = QSpacerItem(
20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding
)
self.formLayout.setItem(3, QFormLayout.FieldRole, self.verticalSpacer)
self.formLayout.setWidget(7, QFormLayout.FieldRole, self.dbCheckConnLabel)
self.continueButton = QPushButton(DatabaseChecker)
self.continueButton.setObjectName("continueButton")
self.continueButton.setObjectName(u"continueButton")
self.continueButton.setEnabled(False)
self.formLayout.setWidget(5, QFormLayout.SpanningRole, self.continueButton)
self.formLayout.setWidget(8, QFormLayout.SpanningRole, self.continueButton)
self.label_2 = QLabel(DatabaseChecker)
self.label_2.setObjectName(u"label_2")
self.formLayout.setWidget(4, QFormLayout.LabelRole, self.label_2)
self.line = QFrame(DatabaseChecker)
self.line.setObjectName(u"line")
self.line.setFrameShape(QFrame.HLine)
self.line.setFrameShadow(QFrame.Sunken)
self.formLayout.setWidget(3, QFormLayout.SpanningRole, self.line)
self.retranslateUi(DatabaseChecker)
QMetaObject.connectSlotsByName(DatabaseChecker)
# setupUi
def retranslateUi(self, DatabaseChecker):
self.label.setText(
QCoreApplication.translate("DatabaseChecker", "dbPathLabel", None)
)
self.label_2.setText(
QCoreApplication.translate("DatabaseChecker", "dbVersionLabel", None)
)
self.label_4.setText(
QCoreApplication.translate("DatabaseChecker", "dbInitLabel", None)
)
self.label_5.setText(
QCoreApplication.translate("DatabaseChecker", "dbCheckConnLabel", None)
)
self.dbInitButton.setText(
QCoreApplication.translate("DatabaseChecker", "dbInitButton", None)
)
self.continueButton.setText(
QCoreApplication.translate("DatabaseChecker", "continueButton", None)
)
self.label.setText(QCoreApplication.translate("DatabaseChecker", u"dbPathLabel", None))
self.label_3.setText(QCoreApplication.translate("DatabaseChecker", u"dbFilenameLabel", None))
self.confirmDbPathButton.setText(QCoreApplication.translate("DatabaseChecker", u"confirmDbPathButton", None))
self.label_5.setText(QCoreApplication.translate("DatabaseChecker", u"dbCheckConnLabel", None))
self.continueButton.setText(QCoreApplication.translate("DatabaseChecker", u"continueButton", None))
self.label_2.setText(QCoreApplication.translate("DatabaseChecker", u"dbVersionLabel", None))
pass
# retranslateUi