Skip to content

Commit a1b1ba1

Browse files
committed
[DB Manager] Fix refresh issue when renaming GPKG table, and disable add geometry column button if already one existing
1 parent 162f4bf commit a1b1ba1

File tree

3 files changed

+51
-14
lines changed

3 files changed

+51
-14
lines changed

python/plugins/db_manager/db_plugins/connector.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ def publicUri(self):
4747
def hasSpatialSupport(self):
4848
return False
4949

50+
def canAddGeometryColumn(self, table):
51+
return self.hasSpatialSupport()
52+
53+
def canAddSpatialIndex(self, table):
54+
return self.hasSpatialSupport()
55+
5056
def hasRasterSupport(self):
5157
return False
5258

python/plugins/db_manager/db_plugins/gpkg/connector.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ def __init__(self, uri):
4646
self.dbname = uri.database()
4747
self.has_raster = False
4848
self.mapSridToName = {}
49+
self._opendb()
4950

51+
def _opendb(self):
52+
53+
self.gdal_ds = None
5054
if hasattr(gdal, 'OpenEx'):
5155
# GDAL >= 2
5256
self.gdal_ds = gdal.OpenEx(self.dbname.encode('UTF-8'), gdal.OF_UPDATE)
@@ -215,6 +219,23 @@ def getSpatialInfo(self):
215219
def hasSpatialSupport(self):
216220
return True
217221

222+
# Used by DlgTableProperties
223+
def canAddGeometryColumn(self, table):
224+
_, tablename = self.getSchemaTableName(table)
225+
lyr = self.gdal_ds.GetLayerByName(tablename.encode('UTF-8'))
226+
if lyr is None:
227+
return False
228+
return lyr.GetGeomType() == ogr.wkbNone
229+
230+
# Used by DlgTableProperties
231+
def canAddSpatialIndex(self, table):
232+
_, tablename = self.getSchemaTableName(table)
233+
lyr = self.gdal_ds.GetLayerByName(tablename.encode('UTF-8'))
234+
if lyr is None or lyr.GetGeometryColumn() == '':
235+
return False
236+
return not self.hasSpatialIndex(table,
237+
lyr.GetGeometryColumn())
238+
218239
def hasRasterSupport(self):
219240
return self.has_raster
220241

@@ -590,7 +611,12 @@ def renameTable(self, table, new_table):
590611

591612
gdal.ErrorReset()
592613
self.gdal_ds.ExecuteSQL(('ALTER TABLE %s RENAME TO %s' % (tablename, new_table)).encode('UTF-8'))
593-
return gdal.GetLastErrorMsg() == ''
614+
if gdal.GetLastErrorMsg() != '':
615+
return False
616+
# we need to reopen after renaming since OGR doesn't update its
617+
# internal state
618+
self._opendb()
619+
return True
594620

595621
def moveTable(self, table, new_table, new_schema=None):
596622
return self.renameTable(table, new_table)
@@ -719,7 +745,10 @@ def addGeometryColumn(self, table, geom_column='geometry', geom_type='POINT', sr
719745
if sr.ImportFromEPSG(srid) == 0:
720746
geom_field_defn.SetSpatialRef(sr)
721747

722-
return lyr.CreateGeomField(geom_field_defn) == 0
748+
if lyr.CreateGeomField(geom_field_defn) != 0:
749+
return False
750+
self._opendb()
751+
return True
723752

724753
def deleteGeometryColumn(self, table, geom_column):
725754
return False # not supported

python/plugins/db_manager/dlg_table_properties.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ def __init__(self, table, parent=None):
6868
self.btnAddSpatialIndex.clicked.connect(self.createSpatialIndex)
6969
self.btnDeleteIndex.clicked.connect(self.deleteIndex)
7070

71+
self.refresh()
72+
73+
def refresh(self):
7174
self.populateViews()
7275
self.checkSupports()
7376

@@ -76,9 +79,8 @@ def checkSupports(self):
7679
self.btnEditColumn.setEnabled(allowEditColumns)
7780
self.btnDeleteColumn.setEnabled(allowEditColumns)
7881

79-
allowSpatial = self.db.connector.hasSpatialSupport()
80-
self.btnAddGeometryColumn.setEnabled(allowSpatial)
81-
self.btnAddSpatialIndex.setEnabled(allowSpatial)
82+
self.btnAddGeometryColumn.setEnabled(self.db.connector.canAddGeometryColumn((self.table.schemaName(), self.table.name)))
83+
self.btnAddSpatialIndex.setEnabled(self.db.connector.canAddSpatialIndex((self.table.schemaName(), self.table.name)))
8284

8385
def populateViews(self):
8486
self.populateFields()
@@ -118,7 +120,7 @@ def addColumn(self):
118120
try:
119121
# add column to table
120122
self.table.addField(fld)
121-
self.populateViews()
123+
self.refresh()
122124
except BaseError as e:
123125
DlgDbError.showError(e, self)
124126
return
@@ -130,7 +132,7 @@ def addGeometryColumn(self):
130132
dlg = DlgAddGeometryColumn(self, self.table)
131133
if not dlg.exec_():
132134
return
133-
self.populateViews()
135+
self.refresh()
134136

135137
def editColumn(self):
136138
""" open dialog to change column info and alter table appropriately """
@@ -152,7 +154,7 @@ def editColumn(self):
152154
self.aboutToChangeTable.emit()
153155
try:
154156
fld.update(new_fld.name, new_fld.type2String(), new_fld.notNull, new_fld.default2String())
155-
self.populateViews()
157+
self.refresh()
156158
except BaseError as e:
157159
DlgDbError.showError(e, self)
158160
return
@@ -177,7 +179,7 @@ def deleteColumn(self):
177179
self.aboutToChangeTable.emit()
178180
try:
179181
fld.delete()
180-
self.populateViews()
182+
self.refresh()
181183
except BaseError as e:
182184
DlgDbError.showError(e, self)
183185
return
@@ -210,7 +212,7 @@ def addConstraint(self):
210212
dlg = DlgCreateConstraint(self, self.table)
211213
if not dlg.exec_():
212214
return
213-
self.populateViews()
215+
self.refresh()
214216

215217
def deleteConstraint(self):
216218
""" delete a constraint """
@@ -232,7 +234,7 @@ def deleteConstraint(self):
232234
self.aboutToChangeTable.emit()
233235
try:
234236
constr.delete()
235-
self.populateViews()
237+
self.refresh()
236238
except BaseError as e:
237239
DlgDbError.showError(e, self)
238240
return
@@ -273,7 +275,7 @@ def createIndex(self):
273275
dlg = DlgCreateIndex(self, self.table)
274276
if not dlg.exec_():
275277
return
276-
self.populateViews()
278+
self.refresh()
277279

278280
def createSpatialIndex(self):
279281
""" create spatial index for the geometry column """
@@ -293,7 +295,7 @@ def createSpatialIndex(self):
293295

294296
try:
295297
self.table.createSpatialIndex()
296-
self.populateViews()
298+
self.refresh()
297299
except BaseError as e:
298300
DlgDbError.showError(e, self)
299301
return
@@ -327,7 +329,7 @@ def deleteIndex(self):
327329
self.aboutToChangeTable.emit()
328330
try:
329331
idx.delete()
330-
self.populateViews()
332+
self.refresh()
331333
except BaseError as e:
332334
DlgDbError.showError(e, self)
333335
return

0 commit comments

Comments
 (0)