Skip to content

Commit

Permalink
Implement sidecarFilesForUri for OGR provider
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Aug 8, 2021
1 parent 28b18bd commit d69b6ba
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 0 deletions.
69 changes: 69 additions & 0 deletions src/core/providers/ogr/qgsogrprovidermetadata.cpp
Expand Up @@ -1297,6 +1297,75 @@ QList<QgsProviderSublayerDetails> QgsOgrProviderMetadata::querySublayers( const
return res;
}

QStringList QgsOgrProviderMetadata::sidecarFilesForUri( const QString &uri ) const
{
const QVariantMap uriParts = decodeUri( uri );
const QString path = uriParts.value( QStringLiteral( "path" ) ).toString();

if ( path.isEmpty() )
return {};

const QFileInfo fileInfo( path );
const QString suffix = fileInfo.suffix();

static QMap< QString, QStringList > sExtensions
{
{
QStringLiteral( "shp" ), {
QStringLiteral( "shx" ),
QStringLiteral( "dbf" ),
QStringLiteral( "sbn" ),
QStringLiteral( "sbx" ),
QStringLiteral( "prj" ),
QStringLiteral( "idm" ),
QStringLiteral( "ind" ),
QStringLiteral( "qix" ),
QStringLiteral( "cpg" ),
QStringLiteral( "qpj" ),
QStringLiteral( "shp.xml" ),
}
},
{
QStringLiteral( "tab" ), {
QStringLiteral( "dat" ),
QStringLiteral( "id" ),
QStringLiteral( "map" ),
QStringLiteral( "ind" ),
QStringLiteral( "tda" ),
QStringLiteral( "tin" ),
QStringLiteral( "tma" ),
QStringLiteral( "lda" ),
QStringLiteral( "lin" ),
QStringLiteral( "lma" ),
}
},
{
QStringLiteral( "gml" ), {
QStringLiteral( "gfs" ),
QStringLiteral( "xsd" ),
}
},
{
QStringLiteral( "csv" ), {
QStringLiteral( "csvt" ),
}
},
};

QStringList res;
for ( auto it = sExtensions.constBegin(); it != sExtensions.constEnd(); ++it )
{
if ( suffix.compare( it.key(), Qt::CaseInsensitive ) == 0 )
{
for ( const QString &ext : it.value() )
{
res.append( fileInfo.dir().filePath( fileInfo.completeBaseName() + '.' + ext ) );
}
}
}
return res;
}

QMap<QString, QgsAbstractProviderConnection *> QgsOgrProviderMetadata::connections( bool cached )
{
return connectionsProtected<QgsGeoPackageProviderConnection, QgsOgrDbConnection>( cached );
Expand Down
1 change: 1 addition & 0 deletions src/core/providers/ogr/qgsogrprovidermetadata.h
Expand Up @@ -43,6 +43,7 @@ class QgsOgrProviderMetadata final: public QgsProviderMetadata
ProviderCapabilities providerCapabilities() const override;
bool uriIsBlocklisted( const QString &uri ) const override;
QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const override;
QStringList sidecarFilesForUri( const QString &uri ) const override;
Qgis::VectorExportResult createEmptyLayer(
const QString &uri,
const QgsFields &fields,
Expand Down
21 changes: 21 additions & 0 deletions tests/src/python/test_provider_ogr.py
Expand Up @@ -2127,6 +2127,27 @@ def test_provider_sublayer_details_fast_scan(self):
res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "/raster/hub13263.vrt"), Qgis.SublayerQueryFlag.FastScan)
self.assertEqual(len(res), 0)

def test_provider_sidecar_files_for_uri(self):
"""
Test retrieving sidecar files for uris
"""
metadata = QgsProviderRegistry.instance().providerMetadata('ogr')

self.assertEqual(metadata.sidecarFilesForUri(''), [])
self.assertEqual(metadata.sidecarFilesForUri('/home/me/not special.doc'), [])
self.assertEqual(metadata.sidecarFilesForUri('/home/me/special.shp'),
['/home/me/special.shx', '/home/me/special.dbf', '/home/me/special.sbn',
'/home/me/special.sbx', '/home/me/special.prj', '/home/me/special.idm',
'/home/me/special.ind', '/home/me/special.qix', '/home/me/special.cpg',
'/home/me/special.qpj', '/home/me/special.shp.xml'])
self.assertEqual(metadata.sidecarFilesForUri('/home/me/special.tab'),
['/home/me/special.dat', '/home/me/special.id', '/home/me/special.map', '/home/me/special.ind',
'/home/me/special.tda', '/home/me/special.tin', '/home/me/special.tma',
'/home/me/special.lda', '/home/me/special.lin', '/home/me/special.lma'])
self.assertEqual(metadata.sidecarFilesForUri('/home/me/special.gml'),
['/home/me/special.gfs', '/home/me/special.xsd'])
self.assertEqual(metadata.sidecarFilesForUri('/home/me/special.csv'), ['/home/me/special.csvt'])


if __name__ == '__main__':
unittest.main()

0 comments on commit d69b6ba

Please sign in to comment.