Skip to content

Commit

Permalink
Merge pull request #32580 from jgrocha/geopackage-primary-key
Browse files Browse the repository at this point in the history
Geopackage primary key available from PyQGIS
  • Loading branch information
rouault committed Nov 7, 2019
2 parents 706c336 + ded2eee commit 4960a5b
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -1048,6 +1048,7 @@ void QgsOgrProvider::loadFields()
//the attribute fields need to be read again when the encoding changes
mAttributeFields.clear();
mDefaultValues.clear();
mPrimaryKeyAttrs.clear();
if ( !mOgrLayer )
return;

Expand Down Expand Up @@ -1088,6 +1089,7 @@ void QgsOgrProvider::loadFields()
);
mDefaultValues.insert( 0, tr( "Autogenerate" ) );
createdFields++;
mPrimaryKeyAttrs << 0;
}

for ( int i = 0; i < fdef.GetFieldCount(); ++i )
Expand Down
3 changes: 3 additions & 0 deletions src/core/providers/ogr/qgsogrprovider.h
Expand Up @@ -131,6 +131,7 @@ class QgsOgrProvider : public QgsVectorDataProvider
bool createSpatialIndex() override;
bool createAttributeIndex( int field ) override;
QgsVectorDataProvider::Capabilities capabilities() const override;
QgsAttributeList pkAttributeIndexes() const override { return mPrimaryKeyAttrs; }
void setEncoding( const QString &e ) override;
bool enterUpdateMode() override { return _enterUpdateMode(); }
bool leaveUpdateMode() override;
Expand Down Expand Up @@ -231,6 +232,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
mutable std::unique_ptr< OGREnvelope > mExtent;
bool mForceRecomputeExtent = false;

QList<int> mPrimaryKeyAttrs;

/**
* This member variable receives the same value as extent_
in the method QgsOgrProvider::extent(). The purpose is to prevent a memory leak*/
Expand Down
15 changes: 15 additions & 0 deletions tests/src/python/test_provider_ogr_gpkg.py
Expand Up @@ -737,6 +737,21 @@ def testReplaceLayerWhileOpen(self):
features = [f for f in vl1.getFeatures(request)]
self.assertEqual(len(features), 1)

def testPkAttributeIndexes(self):
''' Test the primary key index '''
tmpfile = os.path.join(self.basetestpath, 'testPkAttributeIndexes.gpkg')
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
ds.CreateLayer('test', geom_type=ogr.wkbPoint, options=['COLUMN_TYPES=foo=int8,bar=string', 'GEOMETRY_NAME=the_geom', 'FID=customfid'])
ds = None
vl = QgsVectorLayer('{}|layerid=0'.format(tmpfile), 'test', 'ogr')
pks = vl.primaryKeyAttributes()
fields = vl.fields()
pkfield = fields.at(pks[0])
self.assertEqual(len(pks), 1)
self.assertEqual(pks[0], 0)
self.assertEqual(pkfield.name(), 'customfid')
self.assertTrue(pkfield.constraints().constraints() & QgsFieldConstraints.ConstraintUnique)

def testSublayerWithComplexLayerName(self):
''' Test reading a gpkg with a sublayer name containing : '''
tmpfile = os.path.join(self.basetestpath, 'testGeopackageComplexLayerName.gpkg')
Expand Down

0 comments on commit 4960a5b

Please sign in to comment.