Skip to content

Commit 46f7c64

Browse files
committed
Fix postgres pkey map in Qt5 (fixes #15223)
Switching from QVariant to QVariantList solves the underlying Qt issue: - comparison of QVariantList objects works fine - comparison of QVariantList objects wrapped in QVariant does not work The extra wrapping of QVariantList into another QVariant seems unnecessary anyway, so we may as well save a tiny bit of memory and cpu
1 parent a72485c commit 46f7c64

File tree

3 files changed

+26
-32
lines changed

3 files changed

+26
-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: 18 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
{
@@ -488,11 +490,9 @@ void QgsPostgresProvider::appendPkParams( QgsFeatureId featureId, QStringList &p
488490

489491
case pktFidMap:
490492
{
491-
QVariant pkValsVariant = mShared->lookupKey( featureId );
492-
QList<QVariant> pkVals;
493-
if ( !pkValsVariant.isNull() )
493+
QVariantList pkVals = mShared->lookupKey( featureId );
494+
if ( !pkVals.isEmpty() )
494495
{
495-
pkVals = pkValsVariant.toList();
496496
Q_ASSERT( pkVals.size() == mPrimaryKeyAttrs.size() );
497497
}
498498

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

555555
case pktFidMap:
556556
{
557-
QVariant pkValsVariant = sharedData->lookupKey( featureId );
558-
if ( !pkValsVariant.isNull() )
557+
QVariantList pkVals = sharedData->lookupKey( featureId );
558+
if ( !pkVals.isEmpty() )
559559
{
560-
QList<QVariant> pkVals = pkValsVariant.toList();
561-
562560
Q_ASSERT( pkVals.size() == pkAttrs.size() );
563561

564562
QString delim = "";
@@ -2058,14 +2056,14 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist )
20582056
}
20592057
else
20602058
{
2061-
QList<QVariant> primaryKeyVals;
2059+
QVariantList primaryKeyVals;
20622060

20632061
Q_FOREACH ( int idx, mPrimaryKeyAttrs )
20642062
{
20652063
primaryKeyVals << attrs.at( idx );
20662064
}
20672065

2068-
features->setFeatureId( mShared->lookupFid( QVariant( primaryKeyVals ) ) );
2066+
features->setFeatureId( mShared->lookupFid( primaryKeyVals ) );
20692067
}
20702068
QgsDebugMsgLevel( QString( "new fid=%1" ).arg( features->id() ), 4 );
20712069
}
@@ -2416,9 +2414,7 @@ bool QgsPostgresProvider::changeAttributeValues( const QgsChangedAttributesMap &
24162414
// update feature id map if key was changed
24172415
if ( pkChanged && mPrimaryKeyType == pktFidMap )
24182416
{
2419-
QVariant v = mShared->removeFid( fid );
2420-
2421-
QList<QVariant> k = v.toList();
2417+
QVariantList k = mShared->removeFid( fid );
24222418

24232419
for ( int i = 0; i < mPrimaryKeyAttrs.size(); i++ )
24242420
{
@@ -2766,9 +2762,7 @@ bool QgsPostgresProvider::changeFeatures( const QgsChangedAttributesMap &attr_ma
27662762
// update feature id map if key was changed
27672763
if ( pkChanged && mPrimaryKeyType == pktFidMap )
27682764
{
2769-
QVariant v = mShared->removeFid( fid );
2770-
2771-
QList<QVariant> k = v.toList();
2765+
QVariantList k = mShared->removeFid( fid );
27722766

27732767
for ( int i = 0; i < mPrimaryKeyAttrs.size(); i++ )
27742768
{
@@ -4291,11 +4285,11 @@ void QgsPostgresSharedData::setFeaturesCounted( long count )
42914285
}
42924286

42934287

4294-
QgsFeatureId QgsPostgresSharedData::lookupFid( const QVariant &v )
4288+
QgsFeatureId QgsPostgresSharedData::lookupFid( const QVariantList& v )
42954289
{
42964290
QMutexLocker locker( &mMutex );
42974291

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

43004294
if ( it != mKeyToFid.constEnd() )
43014295
{
@@ -4309,30 +4303,30 @@ QgsFeatureId QgsPostgresSharedData::lookupFid( const QVariant &v )
43094303
}
43104304

43114305

4312-
QVariant QgsPostgresSharedData::removeFid( QgsFeatureId fid )
4306+
QVariantList QgsPostgresSharedData::removeFid( QgsFeatureId fid )
43134307
{
43144308
QMutexLocker locker( &mMutex );
43154309

4316-
QVariant v = mFidToKey[ fid ];
4310+
QVariantList v = mFidToKey[ fid ];
43174311
mFidToKey.remove( fid );
43184312
mKeyToFid.remove( v );
43194313
return v;
43204314
}
43214315

4322-
void QgsPostgresSharedData::insertFid( QgsFeatureId fid, const QVariant& k )
4316+
void QgsPostgresSharedData::insertFid( QgsFeatureId fid, const QVariantList& k )
43234317
{
43244318
QMutexLocker locker( &mMutex );
43254319

43264320
mFidToKey.insert( fid, k );
43274321
mKeyToFid.insert( k, fid );
43284322
}
43294323

4330-
QVariant QgsPostgresSharedData::lookupKey( QgsFeatureId featureId )
4324+
QVariantList QgsPostgresSharedData::lookupKey( QgsFeatureId featureId )
43314325
{
43324326
QMutexLocker locker( &mMutex );
43334327

4334-
QMap<QgsFeatureId, QVariant>::const_iterator it = mFidToKey.constFind( featureId );
4328+
QMap<QgsFeatureId, QVariantList>::const_iterator it = mFidToKey.constFind( featureId );
43354329
if ( it != mFidToKey.constEnd() )
43364330
return it.value();
4337-
return QVariant();
4331+
return QVariantList();
43384332
}

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

0 commit comments

Comments
 (0)