Skip to content

Commit e763b41

Browse files
Sandro Santillistrk
Sandro Santilli
authored andcommitted
Use FidMap for int64 primary keys
Also rename pktInt64 to pktUint64, in case we'll be able to know in advance the database contains only positive integers (not implemented in this commit).
1 parent a7a0eef commit e763b41

File tree

3 files changed

+19
-15
lines changed

3 files changed

+19
-15
lines changed

src/providers/postgres/qgspostgresconn.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ enum QgsPostgresPrimaryKeyType
4949
{
5050
pktUnknown,
5151
pktInt,
52-
pktInt64,
52+
pktUint64,
5353
pktTid,
5454
pktOid,
5555
pktFidMap

src/providers/postgres/qgspostgresfeatureiterator.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ bool QgsPostgresFeatureIterator::declareCursor( const QString& whereClause, long
581581
break;
582582

583583
case pktInt:
584-
case pktInt64:
584+
case pktUint64:
585585
query += delim + QgsPostgresConn::quotedIdentifier( mSource->mFields.at( mSource->mPrimaryKeyAttrs.at( 0 ) ).name() );
586586
delim = ',';
587587
break;
@@ -716,7 +716,7 @@ bool QgsPostgresFeatureIterator::getFeature( QgsPostgresResult &queryResult, int
716716
break;
717717

718718
case pktInt:
719-
case pktInt64:
719+
case pktUint64:
720720
fid = mConn->getBinaryInt( queryResult, row, col++ );
721721
if ( !subsetOfAttributes || fetchAttributes.contains( mSource->mPrimaryKeyAttrs.at( 0 ) ) )
722722
{

src/providers/postgres/qgspostgresprovider.cpp

+16-12
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
198198
key = "tid";
199199
break;
200200
case pktInt:
201-
case pktInt64:
201+
case pktUint64:
202202
Q_ASSERT( mPrimaryKeyAttrs.size() == 1 );
203203
Q_ASSERT( mPrimaryKeyAttrs[0] >= 0 && mPrimaryKeyAttrs[0] < mAttributeFields.count() );
204204
key = mAttributeFields.at( mPrimaryKeyAttrs.at( 0 ) ).name();
@@ -407,7 +407,7 @@ QString QgsPostgresProvider::pkParamWhereClause( int offset, const char *alias )
407407
break;
408408

409409
case pktInt:
410-
case pktInt64:
410+
case pktUint64:
411411
Q_ASSERT( mPrimaryKeyAttrs.size() == 1 );
412412
whereClause = QString( "%3%1=$%2" ).arg( quotedIdentifier( field( mPrimaryKeyAttrs[0] ).name() ) ).arg( offset ).arg( aliased );
413413
break;
@@ -448,7 +448,7 @@ void QgsPostgresProvider::appendPkParams( QgsFeatureId featureId, QStringList &p
448448
switch ( mPrimaryKeyType )
449449
{
450450
case pktOid:
451-
case pktInt64:
451+
case pktUint64:
452452
params << QString::number( featureId );
453453
break;
454454

@@ -521,7 +521,7 @@ QString QgsPostgresUtils::whereClause( QgsFeatureId featureId, const QgsFields&
521521
whereClause = QString( "%1=%2" ).arg( QgsPostgresConn::quotedIdentifier( fields[ pkAttrs[0] ].name() ) ).arg( featureId - PKINT_OFFSET );
522522
break;
523523

524-
case pktInt64:
524+
case pktUint64:
525525
Q_ASSERT( pkAttrs.size() == 1 );
526526
whereClause = QString( "%1=%2" ).arg( QgsPostgresConn::quotedIdentifier( fields[ pkAttrs[0] ].name() ) ).arg( featureId );
527527
break;
@@ -573,7 +573,7 @@ QString QgsPostgresUtils::whereClause( const QgsFeatureIds& featureIds, const Qg
573573
{
574574
case pktOid:
575575
case pktInt:
576-
case pktInt64:
576+
case pktUint64:
577577
{
578578
QString expr;
579579

@@ -585,7 +585,7 @@ QString QgsPostgresUtils::whereClause( const QgsFeatureIds& featureIds, const Qg
585585

586586
Q_FOREACH ( const QgsFeatureId featureId, featureIds )
587587
{
588-
expr += delim + FID_TO_STRING( pkType == pktOid ? featureId : pkType == pktInt64 ? featureId : featureId - PKINT_OFFSET );
588+
expr += delim + FID_TO_STRING( pkType == pktOid ? featureId : pkType == pktUint64 ? featureId : featureId - PKINT_OFFSET );
589589
delim = ',';
590590
}
591591
expr += ')';
@@ -1332,7 +1332,11 @@ bool QgsPostgresProvider::determinePrimaryKey()
13321332
}
13331333
else if ( fld.type() == QVariant::LongLong )
13341334
{
1335-
mPrimaryKeyType = pktInt64; // 64bit integer
1335+
// unless we can guarantee all values are unsigned
1336+
// (in which case we could use pktUint64)
1337+
// we'll have to use a Map type.
1338+
// See http://hub.qgis.org/issues/14262
1339+
mPrimaryKeyType = pktFidMap; // pktUint64
13361340
}
13371341
else if ( fld.type() == QVariant::Int )
13381342
{
@@ -1435,7 +1439,7 @@ void QgsPostgresProvider::determinePrimaryKeyFromUriKeyColumn()
14351439
const QgsField& fld = mAttributeFields.at( 0 );
14361440
if ( fld.type() == QVariant::LongLong )
14371441
{
1438-
mPrimaryKeyType = pktInt64; // 64bit integer
1442+
mPrimaryKeyType = pktUint64; // 64bit integer
14391443
}
14401444
else if ( fld.type() == QVariant::Int )
14411445
{
@@ -1869,7 +1873,7 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist )
18691873
delim = ',';
18701874
}
18711875

1872-
if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap || mPrimaryKeyType == pktInt64 )
1876+
if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap || mPrimaryKeyType == pktUint64 )
18731877
{
18741878
Q_FOREACH ( int idx, mPrimaryKeyAttrs )
18751879
{
@@ -1978,7 +1982,7 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist )
19781982

19791983
insert += values + ')';
19801984

1981-
if ( mPrimaryKeyType == pktFidMap || mPrimaryKeyType == pktInt || mPrimaryKeyType == pktInt64 )
1985+
if ( mPrimaryKeyType == pktFidMap || mPrimaryKeyType == pktInt || mPrimaryKeyType == pktUint64 )
19821986
{
19831987
insert += " RETURNING ";
19841988

@@ -2054,13 +2058,13 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist )
20542058
}
20552059

20562060
// update feature ids
2057-
if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap || mPrimaryKeyType == pktInt64 )
2061+
if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap || mPrimaryKeyType == pktUint64 )
20582062
{
20592063
for ( QgsFeatureList::iterator features = flist.begin(); features != flist.end(); ++features )
20602064
{
20612065
QgsAttributes attrs = features->attributes();
20622066

2063-
if ( mPrimaryKeyType == pktInt64 )
2067+
if ( mPrimaryKeyType == pktUint64 )
20642068
{
20652069
features->setFeatureId( STRING_TO_FID( attrs.at( mPrimaryKeyAttrs.at( 0 ) ) ) );
20662070
}

0 commit comments

Comments
 (0)