dev: 支持清空数据库
This commit is contained in:
@@ -255,6 +255,7 @@ def order(column: Column | str | int,
|
|||||||
class Sqlite3Worker(object):
|
class Sqlite3Worker(object):
|
||||||
|
|
||||||
def __init__(self, db_name: str | PathLike[str] = ":memory:"):
|
def __init__(self, db_name: str | PathLike[str] = ":memory:"):
|
||||||
|
self._db_name = db_name
|
||||||
self._conn = sqlite3.connect(db_name)
|
self._conn = sqlite3.connect(db_name)
|
||||||
self._cursor = self._conn.cursor()
|
self._cursor = self._conn.cursor()
|
||||||
self._is_closed = False
|
self._is_closed = False
|
||||||
@@ -262,6 +263,10 @@ class Sqlite3Worker(object):
|
|||||||
def __del__(self):
|
def __del__(self):
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def db_name(self) -> str:
|
||||||
|
return self._db_name
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self._is_closed is False:
|
if self._is_closed is False:
|
||||||
self._cursor.close()
|
self._cursor.close()
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
# coding: utf8
|
# coding: utf8
|
||||||
|
import sqlite3
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from PySide6 import QtWidgets
|
from PySide6 import QtWidgets
|
||||||
from pykeepass.exceptions import CredentialsError
|
from pykeepass.exceptions import CredentialsError
|
||||||
|
|
||||||
from .gbx_kps_login import GbxKpsLogin
|
from .gbx_kps_login import GbxKpsLogin
|
||||||
|
from .utils import accept_warning
|
||||||
from lib.Sqlite3Helper import Sqlite3Worker
|
from lib.Sqlite3Helper import Sqlite3Worker
|
||||||
from lib.kps_operations import read_kps_to_db
|
from lib.kps_operations import read_kps_to_db
|
||||||
|
|
||||||
@@ -18,6 +22,14 @@ class WgLoadKps(QtWidgets.QWidget):
|
|||||||
self.setLayout(self.vly_m)
|
self.setLayout(self.vly_m)
|
||||||
self.vly_m.addStretch(1)
|
self.vly_m.addStretch(1)
|
||||||
|
|
||||||
|
def update_load_status(self, wg: GbxKpsLogin):
|
||||||
|
db_name = Path(self.sqh.db_name).name
|
||||||
|
loaded_mem = self.config["loaded_memory"]
|
||||||
|
if db_name in loaded_mem and wg.lne_path.text() in loaded_mem[db_name]:
|
||||||
|
wg.set_loaded(True)
|
||||||
|
else:
|
||||||
|
wg.set_loaded(False)
|
||||||
|
|
||||||
def add_kps(self, path: str):
|
def add_kps(self, path: str):
|
||||||
wg = GbxKpsLogin(path, self)
|
wg = GbxKpsLogin(path, self)
|
||||||
wg.pbn_remove.clicked_with_item.connect(self.on_item_pbn_remove_clicked)
|
wg.pbn_remove.clicked_with_item.connect(self.on_item_pbn_remove_clicked)
|
||||||
@@ -26,6 +38,9 @@ class WgLoadKps(QtWidgets.QWidget):
|
|||||||
self.vly_m.insertWidget(self.vly_m.count() - 1, wg)
|
self.vly_m.insertWidget(self.vly_m.count() - 1, wg)
|
||||||
self.kps_wgs.append(wg)
|
self.kps_wgs.append(wg)
|
||||||
|
|
||||||
|
# 检查是否已经加载过
|
||||||
|
self.update_load_status(wg)
|
||||||
|
|
||||||
def on_item_pbn_remove_clicked(self, item: GbxKpsLogin):
|
def on_item_pbn_remove_clicked(self, item: GbxKpsLogin):
|
||||||
self.vly_m.removeWidget(item)
|
self.vly_m.removeWidget(item)
|
||||||
self.kps_wgs.remove(item)
|
self.kps_wgs.remove(item)
|
||||||
@@ -43,6 +58,11 @@ class WgLoadKps(QtWidgets.QWidget):
|
|||||||
return
|
return
|
||||||
|
|
||||||
item.set_loaded(True)
|
item.set_loaded(True)
|
||||||
|
loaded_mem = self.config["loaded_memory"]
|
||||||
|
db_name = Path(self.sqh.db_name).name
|
||||||
|
if db_name not in loaded_mem:
|
||||||
|
loaded_mem[db_name] = []
|
||||||
|
loaded_mem[db_name].append(item.lne_path.text())
|
||||||
|
|
||||||
def update_sqh(self, sqh: Sqlite3Worker):
|
def update_sqh(self, sqh: Sqlite3Worker):
|
||||||
self.sqh = sqh
|
self.sqh = sqh
|
||||||
@@ -53,18 +73,26 @@ class WgLoadKps(QtWidgets.QWidget):
|
|||||||
class PageLoad(QtWidgets.QWidget):
|
class PageLoad(QtWidgets.QWidget):
|
||||||
def __init__(self, sqh: Sqlite3Worker, config: dict, parent=None):
|
def __init__(self, sqh: Sqlite3Worker, config: dict, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
self.sqh = sqh
|
||||||
|
self.config = config
|
||||||
|
|
||||||
self.hly_m = QtWidgets.QHBoxLayout()
|
self.hly_m = QtWidgets.QHBoxLayout()
|
||||||
self.setLayout(self.hly_m)
|
self.setLayout(self.hly_m)
|
||||||
self.vly_left = QtWidgets.QVBoxLayout()
|
self.vly_left = QtWidgets.QVBoxLayout()
|
||||||
self.hly_m.addLayout(self.vly_left)
|
self.hly_m.addLayout(self.vly_left)
|
||||||
|
|
||||||
self.pbn_add = QtWidgets.QPushButton("添加", self)
|
self.pbn_add_kps = QtWidgets.QPushButton("添加 KPS", self)
|
||||||
self.pbn_add.setMinimumWidth(config["button_min_width"])
|
self.pbn_add_kps.setMinimumWidth(config["button_min_width"])
|
||||||
self.vly_left.addWidget(self.pbn_add)
|
self.vly_left.addWidget(self.pbn_add_kps)
|
||||||
self.pbn_load_all = QtWidgets.QPushButton("加载全部", self)
|
|
||||||
self.pbn_load_all.setMinimumWidth(config["button_min_width"])
|
self.pbn_clear_db = QtWidgets.QPushButton("清空数据库", self)
|
||||||
self.pbn_load_all.setDisabled(True)
|
self.pbn_clear_db.setMinimumWidth(config["button_min_width"])
|
||||||
self.vly_left.addWidget(self.pbn_load_all)
|
self.vly_left.addWidget(self.pbn_clear_db)
|
||||||
|
|
||||||
|
self.pbn_clear_loaded_mem = QtWidgets.QPushButton("清空加载记忆", self)
|
||||||
|
self.pbn_clear_loaded_mem.setMinimumWidth(config["button_min_width"])
|
||||||
|
self.vly_left.addWidget(self.pbn_clear_loaded_mem)
|
||||||
|
|
||||||
self.vly_left.addStretch(1)
|
self.vly_left.addStretch(1)
|
||||||
|
|
||||||
self.sa_m = QtWidgets.QScrollArea(self)
|
self.sa_m = QtWidgets.QScrollArea(self)
|
||||||
@@ -73,9 +101,14 @@ class PageLoad(QtWidgets.QWidget):
|
|||||||
self.wg_sa = WgLoadKps(sqh, config, self.sa_m)
|
self.wg_sa = WgLoadKps(sqh, config, self.sa_m)
|
||||||
self.sa_m.setWidget(self.wg_sa)
|
self.sa_m.setWidget(self.wg_sa)
|
||||||
|
|
||||||
self.pbn_add.clicked.connect(self.on_pbn_add_clicked)
|
self.pbn_add_kps.clicked.connect(self.on_pbn_add_kps_clicked)
|
||||||
|
self.pbn_clear_db.clicked.connect(self.on_pbn_clear_db_clicked)
|
||||||
|
self.pbn_clear_loaded_mem.clicked.connect(self.on_pbn_clear_loaded_mem_clicked)
|
||||||
|
|
||||||
def on_pbn_add_clicked(self):
|
def update_sqh(self, sqh: Sqlite3Worker):
|
||||||
|
self.wg_sa.update_sqh(sqh)
|
||||||
|
|
||||||
|
def on_pbn_add_kps_clicked(self):
|
||||||
filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "选择", "../",
|
filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "选择", "../",
|
||||||
filter="KeePass 2 数据库 (*.kdbx);;所有文件 (*)")
|
filter="KeePass 2 数据库 (*.kdbx);;所有文件 (*)")
|
||||||
if len(filenames) == 0:
|
if len(filenames) == 0:
|
||||||
@@ -83,5 +116,35 @@ class PageLoad(QtWidgets.QWidget):
|
|||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
self.wg_sa.add_kps(filename)
|
self.wg_sa.add_kps(filename)
|
||||||
|
|
||||||
def update_sqh(self, sqh: Sqlite3Worker):
|
def on_pbn_clear_db_clicked(self):
|
||||||
self.wg_sa.update_sqh(sqh)
|
if accept_warning(self, True, "警告", "你确定要清空当前数据库吗?"):
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.sqh.delete_from(self.config["table_name"])
|
||||||
|
except sqlite3.OperationalError as e:
|
||||||
|
QtWidgets.QMessageBox.critical(self, "错误", f"清空数据库失败:\n{e}")
|
||||||
|
else:
|
||||||
|
QtWidgets.QMessageBox.information(self, "提示", "已清空数据库")
|
||||||
|
|
||||||
|
# 清空配置文件加载记忆
|
||||||
|
loaded_mem = self.config["loaded_memory"]
|
||||||
|
db_name = Path(self.sqh.db_name).name
|
||||||
|
if db_name in loaded_mem:
|
||||||
|
loaded_mem[db_name].clear()
|
||||||
|
|
||||||
|
# 更新kps加载状态
|
||||||
|
for wg in self.wg_sa.kps_wgs:
|
||||||
|
self.wg_sa.update_load_status(wg)
|
||||||
|
|
||||||
|
def on_pbn_clear_loaded_mem_clicked(self):
|
||||||
|
if accept_warning(self, True, "警告", "你确定要清空所有加载记忆吗?"):
|
||||||
|
return
|
||||||
|
|
||||||
|
loaded_mem: dict = self.config["loaded_memory"]
|
||||||
|
loaded_mem.clear()
|
||||||
|
QtWidgets.QMessageBox.information(self, "提示", "已清空加载记忆")
|
||||||
|
|
||||||
|
# 更新kps加载状态
|
||||||
|
for wg in self.wg_sa.kps_wgs:
|
||||||
|
self.wg_sa.update_load_status(wg)
|
||||||
|
|||||||
11
src/utils.py
Normal file
11
src/utils.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# coding: utf8
|
||||||
|
from PySide6 import QtWidgets
|
||||||
|
|
||||||
|
|
||||||
|
def accept_warning(widget: QtWidgets.QWidget, condition: bool,
|
||||||
|
caption: str = "Warning", text: str = "Are you sure to continue?") -> bool:
|
||||||
|
if condition:
|
||||||
|
b = QtWidgets.QMessageBox.question(widget, caption, text)
|
||||||
|
if b == QtWidgets.QMessageBox.StandardButton.No:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
Reference in New Issue
Block a user