Skip to content

Commit 5941806

Browse files
committed
convert field names to lowercase when importing from shapefile,
fix the number of written features, cleanup the code
1 parent 710aa4c commit 5941806

File tree

2 files changed

+53
-34
lines changed

2 files changed

+53
-34
lines changed

src/core/qgsvectorlayerimport.cpp

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,6 @@
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

4430
typedef 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( "\nOnly %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;

src/core/qgsvectorlayerimport.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ class CORE_EXPORT QgsVectorLayerImport
7979
/** retrieves error message */
8080
QString errorMessage();
8181

82+
int errorCount() const { return mErrorCount; }
83+
8284
/** add feature to the new created layer */
8385
bool addFeature( QgsFeature& feature );
8486

@@ -93,6 +95,8 @@ class CORE_EXPORT QgsVectorLayerImport
9395
ImportError mError;
9496
QString mErrorMessage;
9597

98+
int mErrorCount;
99+
96100
QgsVectorDataProvider *mProvider;
97101

98102
/** map attribute indexes to new field indexes */

0 commit comments

Comments
 (0)