Skip to content

Commit

Permalink
Add flag to QgsProviderMetadata to indicate if a provider
Browse files Browse the repository at this point in the history
can handle file based uris

E.g. gdal/ogr can, but postgres/wfs cannot

(cherry picked from commit 1bef866)
  • Loading branch information
nyalldawson committed Mar 11, 2021
1 parent 4ec6c81 commit 0ef7d3b
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/app/qgshandlebadlayers.cpp
Expand Up @@ -29,6 +29,7 @@
#include "qgslayertreeregistrybridge.h"
#include "qgsapplication.h"
#include "qgsfileutils.h"
#include "qgsprovidermetadata.h"

#include <QDomDocument>
#include <QDomElement>
Expand Down Expand Up @@ -126,9 +127,12 @@ QgsHandleBadLayers::QgsHandleBadLayers( const QList<QDomNode> &layers )
QString type = node.toElement().attribute( QStringLiteral( "type" ) );
QString id = node.namedItem( QStringLiteral( "id" ) ).toElement().text();
QString datasource = node.namedItem( QStringLiteral( "datasource" ) ).toElement().text();
QString provider = node.namedItem( QStringLiteral( "provider" ) ).toElement().text();
QString vectorProvider = type == QLatin1String( "vector" ) ? provider : tr( "none" );
bool providerFileBased = ( provider == QLatin1String( "gdal" ) || provider == QLatin1String( "ogr" ) || provider == QLatin1String( "mdal" ) );
const QString provider = node.namedItem( QStringLiteral( "provider" ) ).toElement().text();

bool providerFileBased = false;
if ( const QgsProviderMetadata *metadata = QgsProviderRegistry::instance()->providerMetadata( provider ) )
providerFileBased = metadata->providerCapabilities() & QgsProviderMetadata::FileBasedUris;

const QString basepath = QFileInfo( datasource ).absolutePath();
mOriginalFileBase[ node.namedItem( QStringLiteral( "id" ) ).toElement().text() ].append( basepath );

Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/gdal/qgsgdalprovider.cpp
Expand Up @@ -3569,6 +3569,11 @@ QList<QPair<QString, QString> > QgsGdalProviderMetadata::pyramidResamplingMethod
return methods;
}

QgsProviderMetadata::ProviderCapabilities QgsGdalProviderMetadata::providerCapabilities() const
{
return FileBasedUris;
}

QList<QgsDataItemProvider *> QgsGdalProviderMetadata::dataItemProviders() const
{
QList< QgsDataItemProvider * > providers;
Expand Down
1 change: 1 addition & 0 deletions src/core/providers/gdal/qgsgdalprovider.h
Expand Up @@ -382,6 +382,7 @@ class QgsGdalProviderMetadata final: public QgsProviderMetadata
QString filters( FilterType type ) override;
QList< QgsDataItemProvider * > dataItemProviders() const override;
QList<QPair<QString, QString> > pyramidResamplingMethods() override;
ProviderCapabilities providerCapabilities() const override;
};

///@endcond
Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -7277,4 +7277,9 @@ void QgsOgrProviderMetadata::saveConnection( const QgsAbstractProviderConnection
saveConnectionProtected( conn, name );
}

QgsProviderMetadata::ProviderCapabilities QgsOgrProviderMetadata::providerCapabilities() const
{
return FileBasedUris;
}
///@endcond

1 change: 1 addition & 0 deletions src/core/providers/ogr/qgsogrprovider.h
Expand Up @@ -765,6 +765,7 @@ class QgsOgrProviderMetadata final: public QgsProviderMetadata
QVariantMap decodeUri( const QString &uri ) const override;
QString encodeUri( const QVariantMap &parts ) const override;
QString filters( FilterType type ) override;
ProviderCapabilities providerCapabilities() const override;
bool uriIsBlocklisted( const QString &uri ) const override;
QgsVectorLayerExporter::ExportError createEmptyLayer(
const QString &uri,
Expand Down
5 changes: 5 additions & 0 deletions src/core/qgsprovidermetadata.cpp
Expand Up @@ -56,6 +56,11 @@ QgsProviderMetadata::ProviderMetadataCapabilities QgsProviderMetadata::capabilit
return QgsProviderMetadata::ProviderMetadataCapabilities();
}

QgsProviderMetadata::ProviderCapabilities QgsProviderMetadata::providerCapabilities() const
{
return QgsProviderMetadata::ProviderCapabilities();
}

QString QgsProviderMetadata::library() const
{
return mLibrary;
Expand Down
18 changes: 18 additions & 0 deletions src/core/qgsprovidermetadata.h
Expand Up @@ -153,6 +153,17 @@ class CORE_EXPORT QgsProviderMetadata : public QObject
};
Q_DECLARE_FLAGS( ProviderMetadataCapabilities, ProviderMetadataCapability )

/**
* Provider capabilities
*
* \since QGIS 3.20
*/
enum ProviderCapability
{
FileBasedUris = 1 << 0, //!< Indicates that the provider can utilise URIs which are based on paths to files (as opposed to database or internet paths)
};
Q_DECLARE_FLAGS( ProviderCapabilities, ProviderCapability )

/**
* Typedef for data provider creation function.
* \since QGIS 3.0
Expand Down Expand Up @@ -199,6 +210,13 @@ class CORE_EXPORT QgsProviderMetadata : public QObject
*/
virtual QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const;

/**
* Returns the provider's capabilities.
*
* \since QGIS 3.20
*/
virtual QgsProviderMetadata::ProviderCapabilities providerCapabilities() const;

/**
* This returns the library file name
*
Expand Down
5 changes: 5 additions & 0 deletions src/providers/mdal/qgsmdalprovider.cpp
Expand Up @@ -981,6 +981,11 @@ QString QgsMdalProviderMetadata::encodeUri( const QVariantMap &parts ) const
return path;
}

QgsProviderMetadata::ProviderCapabilities QgsMdalProviderMetadata::providerCapabilities() const
{
return FileBasedUris;
}

QString QgsMdalProviderMetadata::filters( FilterType type )
{
switch ( type )
Expand Down
1 change: 1 addition & 0 deletions src/providers/mdal/qgsmdalprovider.h
Expand Up @@ -145,6 +145,7 @@ class QgsMdalProviderMetadata: public QgsProviderMetadata
const QgsCoordinateReferenceSystem &crs ) const override;
QVariantMap decodeUri( const QString &uri ) const override;
QString encodeUri( const QVariantMap &parts ) const override;
ProviderCapabilities providerCapabilities() const override;
};

#endif //QGSMDALPROVIDER_H

0 comments on commit 0ef7d3b

Please sign in to comment.