Merge pull request #32580 from jgrocha/geopackage-primary-key

Geopackage primary key available from PyQGIS
This commit is contained in:
Even Rouault 2019-11-07 21:10:48 +01:00 committed by GitHub
commit 4960a5b8b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 0 deletions

View File

@ -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;
@ -1088,6 +1089,7 @@ void QgsOgrProvider::loadFields()
);
mDefaultValues.insert( 0, tr( "Autogenerate" ) );
createdFields++;
mPrimaryKeyAttrs << 0;
}
for ( int i = 0; i < fdef.GetFieldCount(); ++i )

View File

@ -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;
@ -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*/

View File

@ -737,6 +737,21 @@ class TestPyQgsOGRProviderGpkg(unittest.TestCase):
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')