Skip to content

Commit 1cb48dd

Browse files
authoredAug 15, 2016
Merge pull request #3384 from wonder-sk/fix-postgres-qt5
Fix postgres pkey map in Qt5 (fixes #15223)
2 parents ea4e5cb + be3c780 commit 1cb48dd

File tree

3 files changed

+37
-32
lines changed

3 files changed

+37
-32
lines changed
 

‎src/providers/postgres/qgspostgresfeatureiterator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ bool QgsPostgresFeatureIterator::getFeature( QgsPostgresResult &queryResult, int
733733

734734
case pktFidMap:
735735
{
736-
QList<QVariant> primaryKeyVals;
736+
QVariantList primaryKeyVals;
737737

738738
Q_FOREACH ( int idx, mSource->mPrimaryKeyAttrs )
739739
{
@@ -748,7 +748,7 @@ bool QgsPostgresFeatureIterator::getFeature( QgsPostgresResult &queryResult, int
748748
col++;
749749
}
750750

751-
fid = mSource->mShared->lookupFid( QVariant( primaryKeyVals ) );
751+
fid = mSource->mShared->lookupFid( primaryKeyVals );
752752

753753
}
754754
break;

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,8 @@ QString QgsPostgresProvider::storageType() const
319319
}
320320

321321
// Qt5 has that built in
322+
// ... BUT it does not behave exactly the same way as our implementation
323+
// (e.g. comparison of QVariantList does not work)
322324
#if QT_VERSION < 0x050000
323325
static bool operator<( const QVariant &a, const QVariant &b )
324326
{
@@ -401,6 +403,17 @@ static bool operator<( const QVariant &a, const QVariant &b )
401403
}
402404
#endif
403405

406+
#if QT_VERSION >= 0x050000 && QT_VERSION < 0x050600
407+
#include <algorithm>
408+
template <typename T>
409+
bool operator<( const QList<T> &lhs, const QList<T> &rhs )
410+
{
411+
return std::lexicographical_compare( lhs.begin(), lhs.end(),
412+
rhs.begin(), rhs.end() );
413+
}
414+
#endif
415+
416+
404417
QgsFeatureIterator QgsPostgresProvider::getFeatures( const QgsFeatureRequest& request ) const
405418
{
406419
if ( !mValid )
@@ -488,11 +501,9 @@ void QgsPostgresProvider::appendPkParams( QgsFeatureId featureId, QStringList &p
488501

489502
case pktFidMap:
490503
{
491-
QVariant pkValsVariant = mShared->lookupKey( featureId );
492-
QList<QVariant> pkVals;
493-
if ( !pkValsVariant.isNull() )
504+
QVariantList pkVals = mShared->lookupKey( featureId );
505+
if ( !pkVals.isEmpty() )
494506
{
495-
pkVals = pkValsVariant.toList();
496507
Q_ASSERT( pkVals.size() == mPrimaryKeyAttrs.size() );
497508
}
498509

@@ -554,11 +565,9 @@ QString QgsPostgresUtils::whereClause( QgsFeatureId featureId, const QgsFields&
554565

555566
case pktFidMap:
556567
{
557-
QVariant pkValsVariant = sharedData->lookupKey( featureId );
558-
if ( !pkValsVariant.isNull() )
568+
QVariantList pkVals = sharedData->lookupKey( featureId );
569+
if ( !pkVals.isEmpty() )
559570
{
560-
QList<QVariant> pkVals = pkValsVariant.toList();
561-
562571
Q_ASSERT( pkVals.size() == pkAttrs.size() );
563572

564573
QString delim = "";
@@ -2058,14 +2067,14 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist )
20582067
}
20592068
else
20602069
{
2061-
QList<QVariant> primaryKeyVals;
2070+
QVariantList primaryKeyVals;
20622071

20632072
Q_FOREACH ( int idx, mPrimaryKeyAttrs )
20642073
{
20652074
primaryKeyVals << attrs.at( idx );
20662075
}
20672076

2068-
features->setFeatureId( mShared->lookupFid( QVariant( primaryKeyVals ) ) );
2077+
features->setFeatureId( mShared->lookupFid( primaryKeyVals ) );
20692078
}
20702079
QgsDebugMsgLevel( QString( "new fid=%1" ).arg( features->id() ), 4 );
20712080
}
@@ -2416,9 +2425,7 @@ bool QgsPostgresProvider::changeAttributeValues( const QgsChangedAttributesMap &
24162425
// update feature id map if key was changed
24172426
if ( pkChanged && mPrimaryKeyType == pktFidMap )
24182427
{
2419-
QVariant v = mShared->removeFid( fid );
2420-
2421-
QList<QVariant> k = v.toList();
2428+
QVariantList k = mShared->removeFid( fid );
24222429

24232430
for ( int i = 0; i < mPrimaryKeyAttrs.size(); i++ )
24242431
{
@@ -2766,9 +2773,7 @@ bool QgsPostgresProvider::changeFeatures( const QgsChangedAttributesMap &attr_ma
27662773
// update feature id map if key was changed
27672774
if ( pkChanged && mPrimaryKeyType == pktFidMap )
27682775
{
2769-
QVariant v = mShared->removeFid( fid );
2770-
2771-
QList<QVariant> k = v.toList();
2776+
QVariantList k = mShared->removeFid( fid );
27722777

27732778
for ( int i = 0; i < mPrimaryKeyAttrs.size(); i++ )
27742779
{
@@ -4291,11 +4296,11 @@ void QgsPostgresSharedData::setFeaturesCounted( long count )
42914296
}
42924297

42934298

4294-
QgsFeatureId QgsPostgresSharedData::lookupFid( const QVariant &v )
4299+
QgsFeatureId QgsPostgresSharedData::lookupFid( const QVariantList& v )
42954300
{
42964301
QMutexLocker locker( &mMutex );
42974302

4298-
QMap<QVariant, QgsFeatureId>::const_iterator it = mKeyToFid.constFind( v );
4303+
QMap<QVariantList, QgsFeatureId>::const_iterator it = mKeyToFid.constFind( v );
42994304

43004305
if ( it != mKeyToFid.constEnd() )
43014306
{
@@ -4309,30 +4314,30 @@ QgsFeatureId QgsPostgresSharedData::lookupFid( const QVariant &v )
43094314
}
43104315

43114316

4312-
QVariant QgsPostgresSharedData::removeFid( QgsFeatureId fid )
4317+
QVariantList QgsPostgresSharedData::removeFid( QgsFeatureId fid )
43134318
{
43144319
QMutexLocker locker( &mMutex );
43154320

4316-
QVariant v = mFidToKey[ fid ];
4321+
QVariantList v = mFidToKey[ fid ];
43174322
mFidToKey.remove( fid );
43184323
mKeyToFid.remove( v );
43194324
return v;
43204325
}
43214326

4322-
void QgsPostgresSharedData::insertFid( QgsFeatureId fid, const QVariant& k )
4327+
void QgsPostgresSharedData::insertFid( QgsFeatureId fid, const QVariantList& k )
43234328
{
43244329
QMutexLocker locker( &mMutex );
43254330

43264331
mFidToKey.insert( fid, k );
43274332
mKeyToFid.insert( k, fid );
43284333
}
43294334

4330-
QVariant QgsPostgresSharedData::lookupKey( QgsFeatureId featureId )
4335+
QVariantList QgsPostgresSharedData::lookupKey( QgsFeatureId featureId )
43314336
{
43324337
QMutexLocker locker( &mMutex );
43334338

4334-
QMap<QgsFeatureId, QVariant>::const_iterator it = mFidToKey.constFind( featureId );
4339+
QMap<QgsFeatureId, QVariantList>::const_iterator it = mFidToKey.constFind( featureId );
43354340
if ( it != mFidToKey.constEnd() )
43364341
return it.value();
4337-
return QVariant();
4342+
return QVariantList();
43384343
}

‎src/providers/postgres/qgspostgresprovider.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,19 +508,19 @@ class QgsPostgresSharedData
508508
void ensureFeaturesCountedAtLeast( long fetched );
509509

510510
// FID lookups
511-
QgsFeatureId lookupFid( const QVariant &v ); // lookup existing mapping or add a new one
512-
QVariant removeFid( QgsFeatureId fid );
513-
void insertFid( QgsFeatureId fid, const QVariant& k );
514-
QVariant lookupKey( QgsFeatureId featureId );
511+
QgsFeatureId lookupFid( const QVariantList& v ); // lookup existing mapping or add a new one
512+
QVariantList removeFid( QgsFeatureId fid );
513+
void insertFid( QgsFeatureId fid, const QVariantList& k );
514+
QVariantList lookupKey( QgsFeatureId featureId );
515515

516516
protected:
517517
QMutex mMutex; //!< Access to all data members is guarded by the mutex
518518

519519
long mFeaturesCounted; //! Number of features in the layer
520520

521521
QgsFeatureId mFidCounter; // next feature id if map is used
522-
QMap<QVariant, QgsFeatureId> mKeyToFid; // map key values to feature id
523-
QMap<QgsFeatureId, QVariant> mFidToKey; // map feature back to fea
522+
QMap<QVariantList, QgsFeatureId> mKeyToFid; // map key values to feature id
523+
QMap<QgsFeatureId, QVariantList> mFidToKey; // map feature id back to key values
524524
};
525525

526526
#endif

1 commit comments

Comments
 (1)

m-kuhn commented on Aug 16, 2016

@m-kuhn
Member

Good job!

Please sign in to comment.