2525#include " qgsvectorlayerimport.h"
2626#include " qgsproviderregistry.h"
2727
28- #include < QFile>
29- #include < QSettings>
30- #include < QFileInfo>
31- #include < QDir>
32- #include < QTextCodec>
33- #include < QTextStream>
34- #include < QSet>
35- #include < QMetaType>
36-
37- #include < cassert>
38- #include < cstdlib> // size_t
39- #include < limits> // std::numeric_limits
40-
41-
4228#define FEATURE_BUFFER_SIZE 200
4329
4430typedef QgsVectorLayerImport::ImportError createEmptyLayer_t (
@@ -53,16 +39,17 @@ typedef QgsVectorLayerImport::ImportError createEmptyLayer_t(
5339);
5440
5541
56- QgsVectorLayerImport::QgsVectorLayerImport (
57- const QString &uri ,
58- const QString &providerKey ,
59- const QgsFieldMap& fields ,
60- QGis::WkbType geometryType ,
61- const QgsCoordinateReferenceSystem* crs ,
62- bool overwrite,
63- const QMap<QString, QVariant> *options )
42+ QgsVectorLayerImport::QgsVectorLayerImport ( const QString &uri,
43+ const QString &providerKey ,
44+ const QgsFieldMap& fields ,
45+ QGis::WkbType geometryType ,
46+ const QgsCoordinateReferenceSystem* crs ,
47+ bool overwrite ,
48+ const QMap<QString, QVariant> *options )
49+ : mErrorCount( 0 )
6450{
6551 mProvider = NULL ;
52+
6653 QgsProviderRegistry * pReg = QgsProviderRegistry::instance ();
6754
6855 QLibrary *myLib = pReg->providerLibrary ( providerKey );
@@ -170,6 +157,7 @@ bool QgsVectorLayerImport::flushBuffer()
170157 .arg ( mFeatureBuffer .first ().id () )
171158 .arg ( mFeatureBuffer .last ().id () );
172159 mError = ErrFeatureWriteFailed;
160+ mErrorCount += mFeatureBuffer .count ();
173161
174162 mFeatureBuffer .clear ();
175163 QgsDebugMsg ( mErrorMessage );
@@ -212,8 +200,18 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer,
212200 outputCRS = &layer->crs ();
213201 }
214202
203+ QgsFieldMap fields = skipAttributeCreation ? QgsFieldMap () : layer->pendingFields ();
204+ if ( layer->providerType () == " ogr" && layer->storageType () == " ESRI Shapefile" )
205+ {
206+ // convert field names to lowercase
207+ for ( QgsFieldMap::iterator fldIt = fields.begin (); fldIt != fields.end (); ++fldIt )
208+ {
209+ fldIt.value ().setName ( fldIt.value ().name ().toLower () );
210+ }
211+ }
212+
215213 QgsVectorLayerImport * writer =
216- new QgsVectorLayerImport ( uri, providerKey, skipAttributeCreation ? QgsFieldMap () : layer-> pendingFields () , layer->wkbType (), outputCRS, false , options );
214+ new QgsVectorLayerImport ( uri, providerKey, fields , layer->wkbType (), outputCRS, false , options );
217215
218216 // check whether file creation was successful
219217 ImportError err = writer->hasError ();
@@ -249,7 +247,12 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer,
249247 shallTransform = false ;
250248 }
251249
252- int n = 0 , errors = 0 ;
250+ int n = 0 ;
251+
252+ if ( errorMessage )
253+ {
254+ *errorMessage = QObject::tr ( " Feature write errors:" );
255+ }
253256
254257 // write all features
255258 while ( layer->nextFeature ( fet ) )
@@ -275,7 +278,7 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer,
275278 .arg ( fet.typeName () ).arg ( e.what () );
276279 QgsMessageLog::logMessage ( msg, QObject::tr ( " Vector import" ) );
277280 if ( errorMessage )
278- *errorMessage = msg;
281+ *errorMessage += " \n " + msg;
279282
280283 return ErrProjection;
281284 }
@@ -288,19 +291,14 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer,
288291 {
289292 if ( writer->hasError () && errorMessage )
290293 {
291- if ( errorMessage->isEmpty () )
292- {
293- *errorMessage = QObject::tr ( " Feature write errors:" );
294- }
295294 *errorMessage += " \n " + writer->errorMessage ();
296295 }
297- errors++;
298296
299- if ( errors > 1000 )
297+ if ( writer-> errorCount () > 1000 )
300298 {
301299 if ( errorMessage )
302300 {
303- *errorMessage += QObject::tr ( " Stopping after %1 errors" ).arg ( errors );
301+ *errorMessage += " \n " + QObject::tr ( " Stopping after %1 errors" ).arg ( writer-> errorCount () );
304302 }
305303
306304 n = -1 ;
@@ -310,16 +308,33 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer,
310308 n++;
311309 }
312310
311+ // flush the buffer to be sure that all features are written
312+ if ( !writer->flushBuffer () )
313+ {
314+ if ( writer->hasError () && errorMessage )
315+ {
316+ *errorMessage += " \n " + writer->errorMessage ();
317+ }
318+ }
319+ int errors = writer->errorCount ();
320+
313321 delete writer;
314322
315323 if ( shallTransform )
316324 {
317325 delete ct;
318326 }
319327
320- if ( errors > 0 && errorMessage && n > 0 )
328+ if ( errorMessage )
321329 {
322- *errorMessage += QObject::tr ( " \n Only %1 of %2 features written." ).arg ( n - errors ).arg ( n );
330+ if ( n > 0 && errors > 0 )
331+ {
332+ *errorMessage += " \n " + QObject::tr ( " Only %1 of %2 features written." ).arg ( n - errors ).arg ( n );
333+ }
334+ else
335+ {
336+ errorMessage->clear ();
337+ }
323338 }
324339
325340 return errors == 0 ? NoError : ErrFeatureWriteFailed;
0 commit comments