Skip to content

Commit a2a82d2

Browse files
committedJan 20, 2015
Merge pull request #1830 from manisandro/transaction
[FEATURE] Transactional editing for postgres layers
2 parents cae4eb3 + 7b31a17 commit a2a82d2

26 files changed

+1074
-201
lines changed
 

‎python/core/core.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
%Include qgis.sip
1414

15+
%Include qgstransaction.sip
1516
%Include qgsapplication.sip
1617
%Include qgsattributeaction.sip
1718
%Include qgsbrowsermodel.sip

‎python/core/qgstransaction.sip

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* This class allows to include a set of layers in a database-side transaction,
3+
* provided the layer data providers support transactions and are compatible
4+
* with each other.
5+
*
6+
* Only layers which are not in edit mode can be included in a transaction,
7+
* and all layers need to be in read-only mode for a transaction to be committed
8+
* or rolled back.
9+
*
10+
* Layers cannot only be included in one transaction at a time.
11+
*
12+
* When editing layers which are part of a transaction group, all changes are
13+
* sent directly to the data provider (bypassing the undo/redo stack), and the
14+
* changes can either be committed or rolled back on the database side via the
15+
* QgsTransaction::commit and QgsTransaction::rollback methods.
16+
*
17+
* As long as the transaction is active, the state of all layer features reflects
18+
* the current state in the transaction.
19+
*
20+
* Edits on features can get rejected if another conflicting transaction is active.
21+
*/
22+
class QgsTransaction /Abstract/
23+
{
24+
%TypeHeaderCode
25+
#include <qgstransaction.h>
26+
%End
27+
public:
28+
/** Creates a transaction for the specified connection string and provider */
29+
static QgsTransaction* create( const QString& connString, const QString& providerKey ) /Factory/;
30+
31+
/** Creates a transaction which includes the specified layers. Connection string
32+
* and data provider are taken from the first layer */
33+
static QgsTransaction* create( const QStringList& layerIds ) /Factory/;
34+
35+
virtual ~QgsTransaction();
36+
37+
/** Add layer to the transaction. The layer must not be in edit mode. The transaction must not be active. */
38+
bool addLayer( const QString& layerId );
39+
40+
/** Begin transaction */
41+
bool begin( QString& errorMsg );
42+
43+
/** Commit transaction. All layers need to be in read-only mode. */
44+
bool commit( QString& errorMsg );
45+
46+
/** Roll back transaction. All layers need to be in read-only mode. */
47+
bool rollback( QString& errorMsg );
48+
49+
/** Executes sql */
50+
virtual bool executeSql( const QString& sql, QString& error ) = 0;
51+
};

‎python/core/qgsvectordataprovider.sip

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ class QgsVectorDataProvider : QgsDataProvider
313313

314314
static QVariant convertValue( QVariant::Type type, QString value );
315315

316+
virtual QgsTransaction* transaction() const;
317+
316318
protected:
317319
void clearMinMaxCache();
318320
void fillMinMaxCache();

‎python/core/qgsvectorlayer.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ class QgsVectorLayer : QgsMapLayer
578578
/** Deletes the selected features
579579
* @return true in case of success and false otherwise
580580
*/
581-
bool deleteSelectedFeatures();
581+
bool deleteSelectedFeatures(int* deletedCount = 0);
582582

583583
/**Adds a ring to polygon/multipolygon features
584584
@return

‎src/app/qgisapp.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5253,30 +5253,31 @@ void QgisApp::deleteSelected( QgsMapLayer *layer, QWidget* parent, bool promptCo
52535253
}
52545254

52555255
//validate selection
5256-
int numberOfDeletedFeatures = vlayer->selectedFeaturesIds().size();
5257-
if ( numberOfDeletedFeatures == 0 )
5256+
int numberOfSelectedFeatures = vlayer->selectedFeaturesIds().size();
5257+
if ( numberOfSelectedFeatures == 0 )
52585258
{
52595259
messageBar()->pushMessage( tr( "No Features Selected" ),
52605260
tr( "The current layer has no selected features" ),
52615261
QgsMessageBar::INFO, messageTimeout() );
52625262
return;
52635263
}
52645264
//display a warning
5265-
if ( promptConfirmation && QMessageBox::warning( parent, tr( "Delete features" ), tr( "Delete %n feature(s)?", "number of features to delete", numberOfDeletedFeatures ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel )
5265+
if ( promptConfirmation && QMessageBox::warning( parent, tr( "Delete features" ), tr( "Delete %n feature(s)?", "number of features to delete", numberOfSelectedFeatures ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel )
52665266
{
52675267
return;
52685268
}
52695269

52705270
vlayer->beginEditCommand( tr( "Features deleted" ) );
5271-
if ( !vlayer->deleteSelectedFeatures() )
5271+
int deletedCount = 0;
5272+
if ( !vlayer->deleteSelectedFeatures( &deletedCount ) )
52725273
{
52735274
messageBar()->pushMessage( tr( "Problem deleting features" ),
5274-
tr( "A problem occured during deletion of features" ),
5275+
tr( "A problem occured during deletion of %1 feature(s)" ).arg( numberOfSelectedFeatures - deletedCount ),
52755276
QgsMessageBar::WARNING );
52765277
}
52775278
else
52785279
{
5279-
showStatusMessage( tr( "%n feature(s) deleted.", "number of features deleted", numberOfDeletedFeatures ) );
5280+
showStatusMessage( tr( "%n feature(s) deleted.", "number of features deleted", numberOfSelectedFeatures ) );
52805281
}
52815282

52825283
vlayer->endEditCommand();

‎src/core/CMakeLists.txt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,14 @@ SET(QGIS_CORE_SRCS
155155
qgssnapper.cpp
156156
qgssnappingutils.cpp
157157
qgsspatialindex.cpp
158+
qgstransaction.cpp
158159
qgstolerance.cpp
159160
qgsvectordataprovider.cpp
160161
qgsvectorfilewriter.cpp
161162
qgsvectorlayer.cpp
162163
qgsvectorlayercache.cpp
163164
qgsvectorlayereditbuffer.cpp
165+
qgsvectorlayereditpassthrough.cpp
164166
qgsvectorlayereditutils.cpp
165167
qgsvectorlayerfeatureiterator.cpp
166168
qgsvectorlayerimport.cpp
@@ -190,7 +192,7 @@ SET(QGIS_CORE_SRCS
190192
composer/qgscomposermapoverview.cpp
191193
composer/qgscomposertable.cpp
192194
composer/qgscomposertablev2.cpp
193-
composer/qgscomposertablecolumn.cpp
195+
composer/qgscomposertablecolumn.cpp
194196
composer/qgscomposerattributetable.cpp
195197
composer/qgscomposerattributetablev2.cpp
196198
composer/qgscomposerattributetablemodel.cpp
@@ -213,7 +215,7 @@ SET(QGIS_CORE_SRCS
213215
composer/qgscomposermultiframe.cpp
214216
composer/qgscomposermodel.cpp
215217
composer/qgscomposition.cpp
216-
218+
217219
dxf/qgsdxfexport.cpp
218220
dxf/qgsdxfpaintdevice.cpp
219221
dxf/qgsdxfpaintengine.cpp
@@ -271,7 +273,7 @@ SET(QGIS_CORE_SRCS
271273
raster/qgssinglebandgrayrenderer.cpp
272274
raster/qgssinglebandpseudocolorrenderer.cpp
273275
raster/qgsbrightnesscontrastfilter.cpp
274-
raster/qgshuesaturationfilter.cpp
276+
raster/qgshuesaturationfilter.cpp
275277
)
276278

277279
IF(ENABLE_MODELTEST)
@@ -364,6 +366,7 @@ SET(QGIS_CORE_MOC_HDRS
364366
qgsrelationmanager.h
365367
qgssnappingutils.h
366368
qgsvectorlayer.h
369+
qgsvectorlayereditpassthrough.h
367370
qgsvectorlayereditbuffer.h
368371
qgsnetworkaccessmanager.h
369372
qgsvectordataprovider.h
@@ -382,14 +385,14 @@ SET(QGIS_CORE_MOC_HDRS
382385
composer/qgscomposerobject.h
383386
composer/qgscomposeritem.h
384387
composer/qgscomposeritemgroup.h
385-
composer/qgscomposermousehandles.h
388+
composer/qgscomposermousehandles.h
386389
composer/qgscomposerlabel.h
387390
composer/qgscomposershape.h
388391
composer/qgscomposerattributetable.h
389392
composer/qgscomposerattributetablev2.h
390393
composer/qgscomposerattributetablemodel.h
391-
composer/qgscomposerattributetablemodelv2.h
392-
composer/qgscomposertable.h
394+
composer/qgscomposerattributetablemodelv2.h
395+
composer/qgscomposertable.h
393396
composer/qgscomposertablev2.h
394397
composer/qgscomposertablecolumn.h
395398
composer/qgscomposerhtml.h
@@ -463,6 +466,8 @@ SET(QGIS_CORE_HDRS
463466
qgsclipper.h
464467
qgscolorscheme.h
465468
qgscolorschemeregistry.h
469+
qgsconnectionpool.h
470+
qgscontexthelp.h
466471
qgscoordinatereferencesystem.h
467472
qgscrscache.h
468473
qgscsexception.h
@@ -533,6 +538,9 @@ SET(QGIS_CORE_HDRS
533538
qgssnappingutils.h
534539
qgsspatialindex.h
535540
qgstolerance.h
541+
qgstransaction.h
542+
qgsvectordataprovider.h
543+
qgsvectorlayercache.h
536544
qgsvectorfilewriter.h
537545
qgsvectorlayereditutils.h
538546
qgsvectorlayerfeatureiterator.h

0 commit comments

Comments
 (0)