@@ -3970,14 +3970,31 @@ bool QgsVectorLayer::commitChanges()
3970
3970
}
3971
3971
}
3972
3972
3973
+ // collect new feature ids that weren't deleted again and forget still
3974
+ // pending updates for deleted features
3975
+ QHash<QgsFeatureId, int > addedFeaturesIdx;
3976
+ for ( int i = 0 ; i < mAddedFeatures .size (); i++ )
3977
+ {
3978
+ const QgsFeature &f = mAddedFeatures .at ( i );
3979
+ if ( !mDeletedFeatureIds .remove ( f.id () ) )
3980
+ {
3981
+ addedFeaturesIdx.insert ( f.id (), i );
3982
+ }
3983
+ else
3984
+ {
3985
+ mChangedAttributeValues .remove ( f.id () );
3986
+ mChangedGeometries .remove ( f.id () );
3987
+ }
3988
+ }
3989
+
3973
3990
//
3974
3991
// remap changed and attributes of added features
3975
3992
//
3976
3993
bool attributeChangesOk = true ;
3977
3994
if ( attributesChanged )
3978
3995
{
3979
3996
// map updates field indexes to names
3980
- QMap <int , QString> src;
3997
+ QHash <int , QString> src;
3981
3998
for ( QgsFieldMap::const_iterator it = mUpdatedFields .begin (); it != mUpdatedFields .end (); it++ )
3982
3999
{
3983
4000
src[ it.key ()] = it.value ().name ();
@@ -3987,7 +4004,7 @@ bool QgsVectorLayer::commitChanges()
3987
4004
const QgsFieldMap &pFields = mDataProvider ->fields ();
3988
4005
3989
4006
// map provider table names to field indexes
3990
- QMap <QString, int > dst;
4007
+ QHash <QString, int > dst;
3991
4008
for ( QgsFieldMap::const_iterator it = pFields.begin (); it != pFields.end (); it++ )
3992
4009
{
3993
4010
dst[ it.value ().name ()] = it.key ();
@@ -4019,8 +4036,8 @@ bool QgsVectorLayer::commitChanges()
4019
4036
}
4020
4037
4021
4038
// map updated fields to provider fields
4022
- QMap <int , int > remap;
4023
- for ( QMap <int , QString>::const_iterator it = src.begin (); it != src.end (); it++ )
4039
+ QHash <int , int > remap;
4040
+ for ( QHash <int , QString>::const_iterator it = src.begin (); it != src.end (); it++ )
4024
4041
{
4025
4042
if ( dst.contains ( it.value () ) )
4026
4043
{
@@ -4060,7 +4077,7 @@ bool QgsVectorLayer::commitChanges()
4060
4077
QgsFieldMap attributes;
4061
4078
4062
4079
// update private field map
4063
- for ( QMap <int , int >::iterator it = remap.begin (); it != remap.end (); it++ )
4080
+ for ( QHash <int , int >::iterator it = remap.begin (); it != remap.end (); it++ )
4064
4081
attributes[ it.value ()] = mUpdatedFields [ it.key ()];
4065
4082
4066
4083
mUpdatedFields = attributes;
@@ -4088,21 +4105,42 @@ bool QgsVectorLayer::commitChanges()
4088
4105
}
4089
4106
}
4090
4107
4108
+ //
4109
+ // delete features
4110
+ //
4111
+ if ( mDeletedFeatureIds .size () > 0 )
4112
+ {
4113
+ if (( cap & QgsVectorDataProvider::DeleteFeatures ) && mDataProvider ->deleteFeatures ( mDeletedFeatureIds ) )
4114
+ {
4115
+ mCommitErrors << tr ( " SUCCESS: %n feature(s) deleted." , " deleted features count" , mDeletedFeatureIds .size () );
4116
+ foreach ( const QgsFeatureId &id, mDeletedFeatureIds )
4117
+ {
4118
+ mChangedAttributeValues .remove ( id );
4119
+ mChangedGeometries .remove ( id );
4120
+ }
4121
+
4122
+ emit committedFeaturesRemoved ( id (), mDeletedFeatureIds );
4123
+
4124
+ mDeletedFeatureIds .clear ();
4125
+ }
4126
+ else
4127
+ {
4128
+ mCommitErrors << tr ( " ERROR: %n feature(s) not deleted." , " not deleted features count" , mDeletedFeatureIds .size () );
4129
+ success = false ;
4130
+ }
4131
+ }
4132
+
4091
4133
//
4092
4134
// add features
4093
4135
//
4094
4136
if ( mAddedFeatures .size () > 0 )
4095
4137
{
4096
- for ( int i = 0 ; i < mAddedFeatures . size (); i++ )
4138
+ foreach ( int i, addedFeaturesIdx. values () )
4097
4139
{
4098
4140
QgsFeature &f = mAddedFeatures [i];
4099
4141
4100
- if ( mDeletedFeatureIds .contains ( f.id () ) )
4142
+ if ( mDeletedFeatureIds .remove ( f.id () ) )
4101
4143
{
4102
- mDeletedFeatureIds .remove ( f.id () );
4103
-
4104
- if ( mChangedGeometries .contains ( f.id () ) )
4105
- mChangedGeometries .remove ( f.id () );
4106
4144
4107
4145
mAddedFeatures .removeAt ( i-- );
4108
4146
continue ;
@@ -4174,31 +4212,6 @@ bool QgsVectorLayer::commitChanges()
4174
4212
}
4175
4213
}
4176
4214
4177
- //
4178
- // delete features
4179
- //
4180
- if ( mDeletedFeatureIds .size () > 0 )
4181
- {
4182
- if (( cap & QgsVectorDataProvider::DeleteFeatures ) && mDataProvider ->deleteFeatures ( mDeletedFeatureIds ) )
4183
- {
4184
- mCommitErrors << tr ( " SUCCESS: %n feature(s) deleted." , " deleted features count" , mDeletedFeatureIds .size () );
4185
- for ( QgsFeatureIds::const_iterator it = mDeletedFeatureIds .begin (); it != mDeletedFeatureIds .end (); it++ )
4186
- {
4187
- mChangedAttributeValues .remove ( *it );
4188
- mChangedGeometries .remove ( *it );
4189
- }
4190
-
4191
- emit committedFeaturesRemoved ( id (), mDeletedFeatureIds );
4192
-
4193
- mDeletedFeatureIds .clear ();
4194
- }
4195
- else
4196
- {
4197
- mCommitErrors << tr ( " ERROR: %n feature(s) not deleted." , " not deleted features count" , mDeletedFeatureIds .size () );
4198
- success = false ;
4199
- }
4200
- }
4201
-
4202
4215
if ( !success )
4203
4216
{
4204
4217
if ( mDataProvider ->hasErrors () )
0 commit comments