2626from builtins import str
2727
2828from 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
3030from qgis .PyQt .QtGui import QKeySequence , QCursor , QClipboard , QIcon , QStandardItemModel , QStandardItem
3131from qgis .PyQt .Qsci import QsciAPIs
3232
33- from qgis .core import QgsProject , QgsApplication , QgsTask
33+ from qgis .core import QgsProject , QgsApplication , QgsTask , QgsSettings
3434from qgis .utils import OverrideCursor
3535
3636from .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