Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add QgsCPLHTTPFetchOverrider class and use it in OGR provider
This utility class redirects GDAL's CPL HTTP calls through QgsBlockingNetworkRequest,
for GDAL >= 3.2 (see OSGeo/gdal#2991)
  • Loading branch information
rouault authored and nyalldawson committed Oct 24, 2020
1 parent 3ba4cb4 commit 2613ac8
Show file tree
Hide file tree
Showing 8 changed files with 403 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/core/CMakeLists.txt
Expand Up @@ -257,6 +257,7 @@ SET(QGIS_CORE_SRCS
qgscoordinatetransform_p.cpp
qgscoordinatetransformcontext.cpp
qgscoordinateutils.cpp
qgscplhttpfetchoverrider.cpp
qgscredentials.cpp
qgsdartmeasurement.cpp
qgsdatabaseschemamodel.cpp
Expand Down
14 changes: 14 additions & 0 deletions src/core/providers/ogr/qgsogrfeatureiterator.cpp
Expand Up @@ -18,6 +18,7 @@
#include "qgsogrexpressioncompiler.h"
#include "qgssqliteexpressioncompiler.h"

#include "qgscplhttpfetchoverrider.h"
#include "qgsogrutils.h"
#include "qgsapplication.h"
#include "qgsgeometry.h"
Expand Down Expand Up @@ -46,6 +47,7 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
, mSharedDS( source->mSharedDS )
, mFirstFieldIsFid( source->mFirstFieldIsFid )
, mFieldsWithoutFid( source->mFieldsWithoutFid )
, mAuthCfg( source->mAuthCfg )
{

/* When inside a transaction for GPKG/SQLite and fetching fid(s) we might be nested inside an outer fetching loop,
Expand All @@ -57,6 +59,9 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
( mRequest.filterType() != QgsFeatureRequest::FilterType::FilterFid
&& mRequest.filterType() != QgsFeatureRequest::FilterType::FilterFids );

QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrFeatureIterator" ) );

for ( const auto &id : mRequest.filterFids() )
{
mFilterFids.insert( id );
Expand Down Expand Up @@ -334,10 +339,18 @@ bool QgsOgrFeatureIterator::checkFeature( gdal::ogr_feature_unique_ptr &fet, Qgs
return true;
}

void QgsOgrFeatureIterator::setInterruptionChecker( QgsFeedback *interruptionChecker )
{
mInterruptionChecker = interruptionChecker;
}

bool QgsOgrFeatureIterator::fetchFeature( QgsFeature &feature )
{
QMutexLocker locker( mSharedDS ? &mSharedDS->mutex() : nullptr );

QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg, mInterruptionChecker );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrFeatureIterator" ) );

feature.setValid( false );

if ( mClosed || !mOgrLayer )
Expand Down Expand Up @@ -568,6 +581,7 @@ bool QgsOgrFeatureIterator::readFeature( gdal::ogr_feature_unique_ptr fet, QgsFe

QgsOgrFeatureSource::QgsOgrFeatureSource( const QgsOgrProvider *p )
: mDataSource( p->dataSourceUri( true ) )
, mAuthCfg( p->authCfg() )
, mShareSameDatasetAmongLayers( p->mShareSameDatasetAmongLayers )
, mLayerName( p->layerName() )
, mLayerIndex( p->layerIndex() )
Expand Down
6 changes: 6 additions & 0 deletions src/core/providers/ogr/qgsogrfeatureiterator.h
Expand Up @@ -43,6 +43,7 @@ class QgsOgrFeatureSource final: public QgsAbstractFeatureSource

private:
QString mDataSource;
QString mAuthCfg;
bool mShareSameDatasetAmongLayers;
QString mLayerName;
int mLayerIndex;
Expand Down Expand Up @@ -72,6 +73,8 @@ class QgsOgrFeatureIterator final: public QgsAbstractFeatureIteratorFromSource<Q
bool rewind() override;
bool close() override;

void setInterruptionChecker( QgsFeedback *interruptionChecker ) override;

protected:
bool checkFeature( gdal::ogr_feature_unique_ptr &fet, QgsFeature &feature ) ;
bool fetchFeature( QgsFeature &feature ) override;
Expand Down Expand Up @@ -102,6 +105,9 @@ class QgsOgrFeatureIterator final: public QgsAbstractFeatureIteratorFromSource<Q

bool mFirstFieldIsFid = false;
QgsFields mFieldsWithoutFid;
QString mAuthCfg;

QgsFeedback *mInterruptionChecker = nullptr;

/* This flag tells the iterator when to skip all calls that might reset the reading (rewind),
* to be used when the request is for a single fid or for a list of fids and we are inside
Expand Down
49 changes: 49 additions & 0 deletions src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -28,6 +28,7 @@ email : sherman at mrcc.com
#include "qgssettings.h"
#include "qgsapplication.h"
#include "qgsauthmanager.h"
#include "qgscplhttpfetchoverrider.h"
#include "qgsdataitem.h"
#include "qgsdataprovider.h"
#include "qgsfeature.h"
Expand Down Expand Up @@ -491,6 +492,18 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
mOgrGeometryTypeFilter,
mOpenOptions );

if ( mFilePath.contains( QLatin1String( "authcfg" ) ) )
{
QRegularExpression authcfgRe( " authcfg='([^']+)'" );
QRegularExpressionMatch match;
if ( mFilePath.contains( authcfgRe, &match ) )
{
mAuthCfg = match.captured( 1 );
}
}
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

open( OpenModeInitial );

int nMaxIntLen = 11;
Expand Down Expand Up @@ -1364,6 +1377,9 @@ QgsRectangle QgsOgrProvider::extent() const
{
if ( !mExtent )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

mExtent.reset( new OGREnvelope() );

// get the extent_ (envelope) of the layer
Expand Down Expand Up @@ -1433,6 +1449,9 @@ QgsRectangle QgsOgrProvider::extent() const

QVariant QgsOgrProvider::defaultValue( int fieldId ) const
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( fieldId < 0 || fieldId >= mAttributeFields.count() )
return QVariant();

Expand Down Expand Up @@ -1848,6 +1867,9 @@ bool QgsOgrProvider::addFeaturePrivate( QgsFeature &f, Flags flags )

bool QgsOgrProvider::addFeatures( QgsFeatureList &flist, Flags flags )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !doInitialActionsForEdition() )
return false;

Expand Down Expand Up @@ -1988,6 +2010,9 @@ bool QgsOgrProvider::addAttributeOGRLevel( const QgsField &field, bool &ignoreEr

bool QgsOgrProvider::addAttributes( const QList<QgsField> &attributes )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !doInitialActionsForEdition() )
return false;

Expand Down Expand Up @@ -2106,6 +2131,9 @@ bool QgsOgrProvider::deleteAttributes( const QgsAttributeIds &attributes )

bool QgsOgrProvider::renameAttributes( const QgsFieldNameMap &renamedAttributes )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !doInitialActionsForEdition() )
return false;

Expand Down Expand Up @@ -2195,6 +2223,9 @@ bool QgsOgrProvider::_setSubsetString( const QString &theSQL, bool updateFeature
{
QgsCPLErrorHandler handler;

QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !mOgrOrigLayer )
return false;

Expand Down Expand Up @@ -2307,6 +2338,9 @@ bool QgsOgrProvider::_setSubsetString( const QString &theSQL, bool updateFeature

bool QgsOgrProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_map )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !doInitialActionsForEdition() )
return false;

Expand Down Expand Up @@ -2520,6 +2554,9 @@ bool QgsOgrProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_

bool QgsOgrProvider::changeGeometryValues( const QgsGeometryMap &geometry_map )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !doInitialActionsForEdition() )
return false;

Expand Down Expand Up @@ -2628,6 +2665,9 @@ bool QgsOgrProvider::changeGeometryValues( const QgsGeometryMap &geometry_map )

bool QgsOgrProvider::createSpatialIndex()
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !mOgrOrigLayer )
return false;
if ( !doInitialActionsForEdition() )
Expand Down Expand Up @@ -2670,6 +2710,9 @@ QString QgsOgrProvider::createIndexName( QString tableName, QString field )

bool QgsOgrProvider::createAttributeIndex( int field )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( field < 0 || field >= mAttributeFields.count() )
return false;

Expand Down Expand Up @@ -2708,6 +2751,9 @@ bool QgsOgrProvider::createAttributeIndex( int field )

bool QgsOgrProvider::deleteFeatures( const QgsFeatureIds &id )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !doInitialActionsForEdition() )
return false;

Expand Down Expand Up @@ -2764,6 +2810,9 @@ bool QgsOgrProvider::deleteFeatures( const QgsFeatureIds &id )

bool QgsOgrProvider::deleteFeature( QgsFeatureId id )
{
QgsCPLHTTPFetchOverrider oCPLHTTPFetcher( mAuthCfg );
QgsSetCPLHTTPFetchOverriderInitiatorClass( oCPLHTTPFetcher, QStringLiteral( "QgsOgrProvider" ) );

if ( !doInitialActionsForEdition() )
return false;

Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/ogr/qgsogrprovider.h
Expand Up @@ -163,6 +163,8 @@ class QgsOgrProvider final: public QgsVectorDataProvider

QString filePath() const { return mFilePath; }

QString authCfg() const { return mAuthCfg; }

int layerIndex() const { return mLayerIndex; }

QByteArray quotedIdentifier( const QByteArray &field ) const;
Expand Down Expand Up @@ -255,6 +257,9 @@ class QgsOgrProvider final: public QgsVectorDataProvider
//! path to filename
QString mFilePath;

//! Authentication configuration
QString mAuthCfg;

//! layer name
QString mLayerName;

Expand Down

0 comments on commit 2613ac8

Please sign in to comment.