Skip to content

Commit eedd891

Browse files
author
Sandro Santilli
committedDec 7, 2012
Drop orphaned TopoGeometry objects on deleteFeatures
1 parent 542f814 commit eedd891

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed
 

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,6 +1857,23 @@ bool QgsPostgresProvider::getTopoLayerInfo( )
18571857
return true;
18581858
}
18591859

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+
18601877
QString QgsPostgresProvider::geomParam( int offset ) const
18611878
{
18621879
QString geometry;
@@ -2192,6 +2209,18 @@ bool QgsPostgresProvider::deleteFeatures( const QgsFeatureIds & id )
21922209

21932210
mConnectionRW->PQexecNR( "COMMIT" );
21942211

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+
21952224
mFeaturesCounted -= id.size();
21962225
}
21972226
catch ( PGException &e )
@@ -2574,8 +2603,6 @@ bool QgsPostgresProvider::changeGeometryValues( QgsGeometryMap & geometry_map )
25742603
// Replace old TopoGeom with new TopoGeom, so that
25752604
// any hierarchically defined TopoGeom will still have its
25762605
// 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)
25792606
QString replace = QString( "DELETE FROM %1.relation WHERE "
25802607
"layer_id = %2 AND topogeo_id = %3" )
25812608
.arg( quotedIdentifier( mTopoLayerInfo.topologyName ) )

‎src/providers/postgres/qgspostgresprovider.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,16 +437,22 @@ class QgsPostgresProvider : public QgsVectorDataProvider
437437

438438
bool getGeometryDetails();
439439

440+
//! @{ Only used with TopoGeometry layers
441+
440442
struct TopoLayerInfo
441443
{
442444
QString topologyName;
443445
long layerId;
444446
};
445447

446-
TopoLayerInfo mTopoLayerInfo; //! only used with TopoGeometry layers
448+
TopoLayerInfo mTopoLayerInfo;
447449

448450
bool getTopoLayerInfo();
449451

452+
void dropOrphanedTopoGeoms();
453+
454+
//! @}
455+
450456
/* Use estimated metadata. Uses fast table counts, geometry type and extent determination */
451457
bool mUseEstimatedMetadata;
452458

0 commit comments

Comments
 (0)
Please sign in to comment.