Skip to content

Commit

Permalink
[WFS provider] Fix getCachedCapabilities() short-lived in-memory cach…
Browse files Browse the repository at this point in the history
…e for WFS capabilities
  • Loading branch information
rouault committed Jan 3, 2023
1 parent acd7d02 commit d469574
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 9 deletions.
9 changes: 7 additions & 2 deletions src/providers/wfs/qgswfscapabilities.cpp
Expand Up @@ -41,7 +41,7 @@ QgsWfsCapabilities::QgsWfsCapabilities( const QString &uri, const QgsDataProvide
connect( this, &QgsWfsRequest::downloadFinished, this, &QgsWfsCapabilities::capabilitiesReplyFinished, Qt::DirectConnection );
}

bool QgsWfsCapabilities::requestCapabilities( bool synchronous, bool forceRefresh )
QUrl QgsWfsCapabilities::requestUrl() const
{
QUrl url( mUri.baseURL( ) );
QUrlQuery query( url );
Expand All @@ -55,7 +55,12 @@ bool QgsWfsCapabilities::requestCapabilities( bool synchronous, bool forceRefres
query.addQueryItem( QStringLiteral( "VERSION" ), version );

url.setQuery( query );
if ( !sendGET( url, QString(), synchronous, forceRefresh ) )
return url;
}

bool QgsWfsCapabilities::requestCapabilities( bool synchronous, bool forceRefresh )
{
if ( !sendGET( requestUrl(), QString(), synchronous, forceRefresh ) )
{
emit gotCapabilities();
return false;
Expand Down
3 changes: 3 additions & 0 deletions src/providers/wfs/qgswfscapabilities.h
Expand Up @@ -29,6 +29,9 @@ class QgsWfsCapabilities : public QgsWfsRequest
public:
explicit QgsWfsCapabilities( const QString &uri, const QgsDataProvider::ProviderOptions &options = QgsDataProvider::ProviderOptions() );

//! returns request URL
QUrl requestUrl() const;

//! start network connection to get capabilities
bool requestCapabilities( bool synchronous, bool forceRefresh );

Expand Down
17 changes: 10 additions & 7 deletions src/providers/wfs/qgswfsprovider.cpp
Expand Up @@ -2190,20 +2190,23 @@ void QgsWFSProvider::handleException( const QDomDocument &serverResponse )
QgsWfsCapabilities::Capabilities QgsWFSProvider::getCachedCapabilities( const QString &uri )
{
static QMutex mutex;
static std::map<QString, std::pair<QDateTime, QgsWfsCapabilities::Capabilities>> gCacheCaps;
static std::map<QUrl, std::pair<QDateTime, QgsWfsCapabilities::Capabilities>> gCacheCaps;
QgsWfsCapabilities getCapabilities( uri );
QUrl requestUrl = getCapabilities.requestUrl();

constexpr int DELAY_OF_CACHING_IN_SECS = 10;
QDateTime now = QDateTime::currentDateTime();
{
QMutexLocker lock( &mutex );
auto iter = gCacheCaps.find( uri );
if ( iter != gCacheCaps.end() && iter->second.first.secsTo( now ) < DELAY_OF_CACHING_IN_SECS )
auto iter = gCacheCaps.find( requestUrl );
QgsSettings s;
const int delayOfCachingInSecs = s.value( QStringLiteral( "qgis/wfsMemoryCacheDelay" ), 60 ).toInt();
if ( iter != gCacheCaps.end() && iter->second.first.secsTo( now ) < delayOfCachingInSecs )
{
QgsDebugMsgLevel( QStringLiteral( "Reusing cached GetCapabilities response for %1" ).arg( requestUrl.toString() ), 4 );
return iter->second.second;
}
}
QgsWfsCapabilities::Capabilities caps;
QgsWfsCapabilities getCapabilities( uri );
const bool synchronous = true;
const bool forceRefresh = false;
if ( !getCapabilities.requestCapabilities( synchronous, forceRefresh ) )
Expand All @@ -2217,10 +2220,10 @@ QgsWfsCapabilities::Capabilities QgsWFSProvider::getCachedCapabilities( const QS
caps = getCapabilities.capabilities();

QgsSettings s;
if ( s.value( QStringLiteral( "qgis/wfsCapabilitiesMemoryCacheAllowed" ), true ).toBool() )
if ( s.value( QStringLiteral( "qgis/wfsMemoryCacheAllowed" ), true ).toBool() )
{
QMutexLocker lock( &mutex );
gCacheCaps[uri] = std::make_pair( now, caps );
gCacheCaps[requestUrl] = std::make_pair( now, caps );
}
return caps;
}

0 comments on commit d469574

Please sign in to comment.