@@ -1857,6 +1857,23 @@ bool QgsPostgresProvider::getTopoLayerInfo( )
1857
1857
return true ;
1858
1858
}
1859
1859
1860
+ /* private */
1861
+ void QgsPostgresProvider::dropOrphanedTopoGeoms ( )
1862
+ {
1863
+ QString sql = QString ( " DELETE FROM %1.relation WHERE layer_id = %2 AND "
1864
+ " topogeo_id NOT IN ( SELECT id(%3) FROM %4.%5 )" )
1865
+ .arg ( quotedIdentifier (mTopoLayerInfo .topologyName ) )
1866
+ .arg ( mTopoLayerInfo .layerId )
1867
+ .arg ( quotedIdentifier (mGeometryColumn ) )
1868
+ .arg ( quotedIdentifier (mSchemaName ) )
1869
+ .arg ( quotedIdentifier (mTableName ) )
1870
+ ;
1871
+
1872
+ QgsDebugMsg ( " TopoGeom orphans cleanup query: " + sql );
1873
+
1874
+ mConnectionRW ->PQexecNR ( sql );
1875
+ }
1876
+
1860
1877
QString QgsPostgresProvider::geomParam ( int offset ) const
1861
1878
{
1862
1879
QString geometry;
@@ -2192,6 +2209,18 @@ bool QgsPostgresProvider::deleteFeatures( const QgsFeatureIds & id )
2192
2209
2193
2210
mConnectionRW ->PQexecNR ( " COMMIT" );
2194
2211
2212
+ if ( mSpatialColType == sctTopoGeometry )
2213
+ {
2214
+ // NOTE: in presence of multiple TopoGeometry objects
2215
+ // for the same table or when deleting a Geometry
2216
+ // layer _also_ having a TopoGeometry component,
2217
+ // orphans would still be left.
2218
+ // TODO: decouple layer from table and signal table when
2219
+ // records are added or removed
2220
+ dropOrphanedTopoGeoms ();
2221
+ }
2222
+
2223
+
2195
2224
mFeaturesCounted -= id.size ();
2196
2225
}
2197
2226
catch ( PGException &e )
@@ -2574,8 +2603,6 @@ bool QgsPostgresProvider::changeGeometryValues( QgsGeometryMap & geometry_map )
2574
2603
// Replace old TopoGeom with new TopoGeom, so that
2575
2604
// any hierarchically defined TopoGeom will still have its
2576
2605
// definition and we'll leave no orphans
2577
- // TODO: move this logic into a method using mTopoLayerInfo and
2578
- // taking a topogeo_id (to be reused for deleteFeatures)
2579
2606
QString replace = QString ( " DELETE FROM %1.relation WHERE "
2580
2607
" layer_id = %2 AND topogeo_id = %3" )
2581
2608
.arg ( quotedIdentifier ( mTopoLayerInfo .topologyName ) )
0 commit comments