Merge pull request #5316 from rldhont/db_manager_update_dblayer

[FEATURE][needs-docs][DB Manager] Be able to update every Db layer from Postgres, Spatialite and Oracle
This commit is contained in:
rldhont 2017-10-14 15:58:11 +02:00 committed by GitHub
commit 949d216744
2 changed files with 14 additions and 11 deletions

View File

@ -79,11 +79,9 @@ class DBManagerPlugin(object):
self.dlg.close()
def onLayerWasAdded(self, aMapLayer):
# Be able to update every Db layer from Postgres, Spatialite and Oracle
if hasattr(aMapLayer, 'dataProvider') and aMapLayer.dataProvider().name() in ['postgres', 'spatialite', 'oracle']:
uri = QgsDataSourceUri(aMapLayer.source())
table = uri.table()
if table.startswith('(') and table.endswith(')'):
self.iface.addCustomActionForLayer(self.layerAction, aMapLayer)
self.iface.addCustomActionForLayer(self.layerAction, aMapLayer)
# virtual has QUrl source
# url = QUrl(QUrl.fromPercentEncoding(l.source()))
# url.queryItemValue('query')
@ -91,12 +89,11 @@ class DBManagerPlugin(object):
# url.queryItemValue('geometry')
def onUpdateSqlLayer(self):
# Be able to update every Db layer from Postgres, Spatialite and Oracle
l = self.iface.activeLayer()
if l.dataProvider().name() in ['postgres', 'spatialite', 'oracle']:
table = QgsDataSourceUri(l.source()).table()
if table.startswith('(') and table.endswith(')'):
self.run()
self.dlg.runSqlLayerWindow(l)
self.run()
self.dlg.runSqlLayerWindow(l)
# virtual has QUrl source
# url = QUrl(QUrl.fromPercentEncoding(l.source()))
# url.queryItemValue('query')

View File

@ -31,7 +31,7 @@ from qgis.PyQt.QtGui import QKeySequence, QCursor, QClipboard, QIcon, QStandardI
from qgis.PyQt.Qsci import QsciAPIs
from qgis.PyQt.QtXml import QDomDocument
from qgis.core import QgsProject, QgsDataSourceUri
from qgis.core import QgsProject, QgsDataSourceUri, QgsReadWriteContext
from qgis.utils import OverrideCursor
from .db_plugins import createDbPlugin
@ -151,6 +151,12 @@ class DlgSqlLayerWindow(QWidget, Ui_Dialog):
match = re.search('^\((SELECT .+ FROM .+)\)$', sql, re.S)
if match:
sql = match.group(1)
if not sql.startswith('(') and not sql.endswith(')'):
schema = uri.schema()
if schema and schema.upper() != 'PUBLIC':
sql = 'SELECT * FROM ' + schema + '.' + sql
else
sql = 'SELECT * FROM ' + sql
self.editSql.setText(sql)
self.executeSql()
@ -328,11 +334,11 @@ class DlgSqlLayerWindow(QWidget, Ui_Dialog):
XMLDocument = QDomDocument("style")
XMLMapLayers = XMLDocument.createElement("maplayers")
XMLMapLayer = XMLDocument.createElement("maplayer")
self.layer.writeLayerXML(XMLMapLayer, XMLDocument)
self.layer.writeLayerXml(XMLMapLayer, XMLDocument, QgsReadWriteContext())
XMLMapLayer.firstChildElement("datasource").firstChild().setNodeValue(layer.source())
XMLMapLayers.appendChild(XMLMapLayer)
XMLDocument.appendChild(XMLMapLayers)
self.layer.readLayerXML(XMLMapLayer)
self.layer.readLayerXml(XMLMapLayer, QgsReadWriteContext())
self.layer.reload()
self.iface.actionDraw().trigger()
self.iface.mapCanvas().refresh()