Skip to content

Commit 1242402

Browse files
committed
[FEATURE][needs-docs] DB Manager: adds SQL query history
1 parent b18aaae commit 1242402

File tree

2 files changed

+274
-166
lines changed

2 files changed

+274
-166
lines changed

python/plugins/db_manager/dlg_sql_window.py

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
from builtins import str
2727

2828
from qgis.PyQt.QtCore import Qt, pyqtSignal
29-
from qgis.PyQt.QtWidgets import QDialog, QWidget, QAction, QApplication, QInputDialog, QStyledItemDelegate
29+
from qgis.PyQt.QtWidgets import QDialog, QWidget, QAction, QApplication, QInputDialog, QStyledItemDelegate, QTableWidgetItem
3030
from qgis.PyQt.QtGui import QKeySequence, QCursor, QClipboard, QIcon, QStandardItemModel, QStandardItem
3131
from qgis.PyQt.Qsci import QsciAPIs
3232

33-
from qgis.core import QgsProject, QgsApplication, QgsTask
33+
from qgis.core import QgsProject, QgsApplication, QgsTask, QgsSettings
3434
from qgis.utils import OverrideCursor
3535

3636
from .db_plugins.plugin import BaseError
@@ -59,13 +59,15 @@ def __init__(self, iface, db, parent=None):
5959
self.mainWindow = parent
6060
self.iface = iface
6161
self.db = db
62+
self.dbType = db.connection().typeNameString()
63+
self.connectionName = db.connection().connectionName()
6264
self.filter = ""
6365
self.modelAsync = None
6466
self.allowMultiColumnPk = isinstance(db, PGDatabase) # at the moment only PostgreSQL allows a primary key to span multiple columns, SpatiaLite doesn't
6567
self.aliasSubQuery = isinstance(db, PGDatabase) # only PostgreSQL requires subqueries to be aliases
6668
self.setupUi(self)
6769
self.setWindowTitle(
68-
self.tr(u"{0} - {1} [{2}]").format(self.windowTitle(), db.connection().connectionName(), db.connection().typeNameString()))
70+
self.tr(u"{0} - {1} [{2}]").format(self.windowTitle(), self.connectionName, self.dbType))
6971

7072
self.defaultLayerName = 'QueryLayer'
7173

@@ -79,6 +81,17 @@ def __init__(self, iface, db, parent=None):
7981
self.editSql.setMarginVisible(True)
8082
self.initCompleter()
8183

84+
settings = QgsSettings()
85+
self.history = settings.value('DB_Manager/queryHistory/' + self.dbType, {self.connectionName: []})
86+
if self.connectionName not in self.history:
87+
self.history[self.connectionName] = []
88+
89+
self.queryHistoryWidget.setVisible(False)
90+
self.queryHistoryTableWidget.verticalHeader().hide()
91+
self.queryHistoryTableWidget.doubleClicked.connect(self.insertQueryInEditor)
92+
self.populateQueryHistory()
93+
self.btnQueryHistory.toggled.connect(self.showHideQueryHistory)
94+
8295
self.btnCancel.setText(self.tr("Cancel (ESC)"))
8396
self.btnCancel.setEnabled(False)
8497
self.btnCancel.clicked.connect(self.executeSqlCanceled)
@@ -140,6 +153,42 @@ def __init__(self, iface, db, parent=None):
140153

141154
self.presetName.textChanged.connect(self.nameChanged)
142155

156+
def insertQueryInEditor(self, item):
157+
sql = item.data(Qt.DisplayRole)
158+
self.editSql.insertText(sql)
159+
160+
def showHideQueryHistory(self, visible):
161+
self.queryHistoryWidget.setVisible(visible)
162+
163+
def populateQueryHistory(self):
164+
self.queryHistoryTableWidget.clearContents()
165+
self.queryHistoryTableWidget.setRowCount(0)
166+
dictlist = self.history[self.connectionName]
167+
168+
if not dictlist:
169+
return
170+
171+
for i in range(len(dictlist)):
172+
self.queryHistoryTableWidget.insertRow(0)
173+
queryItem = QTableWidgetItem(dictlist[i]['query'])
174+
rowsItem = QTableWidgetItem(str(dictlist[i]['rows']))
175+
durationItem = QTableWidgetItem(str(dictlist[i]['secs']))
176+
self.queryHistoryTableWidget.setItem(0, 0, queryItem)
177+
self.queryHistoryTableWidget.setItem(0, 1, rowsItem)
178+
self.queryHistoryTableWidget.setItem(0, 2, durationItem)
179+
180+
self.queryHistoryTableWidget.resizeColumnsToContents()
181+
self.queryHistoryTableWidget.resizeRowsToContents()
182+
183+
def writeQueryHistory(self, sql, affectedRows, secs):
184+
settings = QgsSettings()
185+
self.history[self.connectionName].append({'query': sql,
186+
'rows': affectedRows,
187+
'secs': secs})
188+
settings.setValue('DB_Manager/queryHistory/' + self.dbType, self.history)
189+
190+
self.populateQueryHistory()
191+
143192
def updatePresetsCombobox(self):
144193
self.presetCombo.clear()
145194

@@ -236,12 +285,14 @@ def executeSqlCompleted(self):
236285
quotedCols = []
237286

238287
self.viewResult.setModel(model)
239-
self.lblResult.setText(self.tr("{0} rows, {1:.1f} seconds").format(model.affectedRows(), model.secs()))
288+
self.lblResult.setText(self.tr("{0} rows, {1:.3f} seconds").format(model.affectedRows(), model.secs()))
240289
cols = self.viewResult.model().columnNames()
241290
for col in cols:
242291
quotedCols.append(self.db.connector.quoteId(col))
243292

244293
self.setColumnCombos(cols, quotedCols)
294+
295+
self.writeQueryHistory(self.modelAsync.task.sql, model.affectedRows(), model.secs())
245296
self.update()
246297
elif not self.modelAsync.canceled:
247298
DlgDbError.showError(self.modelAsync.error, self)

0 commit comments

Comments
 (0)