Skip to content

Commit 37b2c04

Browse files
committed
use a buffer when importing features
1 parent 6eb406b commit 37b2c04

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/core/qgsvectorlayerimport.cpp

+26-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
#include <cstdlib> // size_t
3838
#include <limits> // std::numeric_limits
3939

40+
41+
#define FEATURE_BUFFER_SIZE 200
42+
4043
typedef QgsVectorLayerImport::ImportError createEmptyLayer_t(
4144
const QString &uri,
4245
const QgsFieldMap &fields,
@@ -108,6 +111,8 @@ QgsVectorLayerImport::QgsVectorLayerImport(
108111

109112
QgsVectorLayerImport::~QgsVectorLayerImport()
110113
{
114+
flushBuffer();
115+
111116
if ( mProvider )
112117
delete mProvider;
113118
}
@@ -142,15 +147,34 @@ bool QgsVectorLayerImport::addFeature( QgsFeature& feat )
142147
}
143148
feat.setAttributeMap( newAttrs );
144149

145-
if ( !mProvider->addFeatures( QgsFeatureList() << feat ) )
150+
mFeatureBuffer.append( feat );
151+
152+
if ( mFeatureBuffer.count() >= FEATURE_BUFFER_SIZE )
153+
{
154+
return flushBuffer();
155+
}
156+
157+
return true;
158+
}
159+
160+
bool QgsVectorLayerImport::flushBuffer()
161+
{
162+
if ( mFeatureBuffer.count() <= 0 )
163+
return true;
164+
165+
if ( !mProvider->addFeatures( mFeatureBuffer ) )
146166
{
147-
mErrorMessage = QObject::tr( "Feature #%1 creation error" ).arg( feat.id() );
167+
mErrorMessage = QObject::tr( "Creation error for features from #%1 to #%2" )
168+
.arg( mFeatureBuffer.first().id() )
169+
.arg( mFeatureBuffer.last().id() );
148170
mError = ErrFeatureWriteFailed;
149171

172+
mFeatureBuffer.clear();
150173
QgsDebugMsg( mErrorMessage );
151174
return false;
152175
}
153176

177+
mFeatureBuffer.clear();
154178
return true;
155179
}
156180

src/core/qgsvectorlayerimport.h

+5
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ class CORE_EXPORT QgsVectorLayerImport
8686
~QgsVectorLayerImport();
8787

8888
protected:
89+
/** flush the buffer writing the features to the new layer */
90+
bool flushBuffer();
91+
8992
/** contains error value */
9093
ImportError mError;
9194
QString mErrorMessage;
@@ -94,6 +97,8 @@ class CORE_EXPORT QgsVectorLayerImport
9497

9598
/** map attribute indexes to new field indexes */
9699
QMap<int, int> mOldToNewAttrIdx;
100+
101+
QgsFeatureList mFeatureBuffer;
97102
};
98103

99104
#endif

0 commit comments

Comments
 (0)