27#include "moc_qgsconfigcache.cpp"
39 QStringLiteral(
"Initializing 'periodic' cache strategy" ),
47 QStringLiteral(
"Initializing 'off' cache strategy" ),
55 QStringLiteral(
"Initializing 'filesystem' cache strategy" ),
69 QStringLiteral(
"Project's cache is already initialized" ),
82 qFatal(
"QgsConfigCache must be initialized before accessing QgsConfigCache instance." );
96 : mStrategy( strategy )
98 mStrategy->attach(
this );
108 if ( !mProjectCache[path] )
117 prj->setBadLayerHandler( badLayerHandler );
142 if ( prj->read( path, readFlags ) )
144 if ( !badLayerHandler->
badLayers().isEmpty() )
147 QStringList unrestrictedBadLayers;
149 const QStringList badLayerIds = badLayerHandler->
badLayers();
150 const QMap<QString, QString> badLayerNames = badLayerHandler->
badLayerNames();
152 for (
const QString &badLayerId : badLayerIds )
156 if ( badLayerNames.contains( badLayerId ) && restrictedLayers.contains( badLayerNames.value( badLayerId ) ) )
160 unrestrictedBadLayers.append( badLayerId );
162 if ( !unrestrictedBadLayers.isEmpty() )
168 QStringLiteral(
"Error, Layer(s) %1 not valid in project %2" ).arg( unrestrictedBadLayers.join( QLatin1String(
", " ) ), path ),
176 QStringLiteral(
"Warning, Layer(s) %1 not valid in project %2" ).arg( unrestrictedBadLayers.join( QLatin1String(
", " ) ), path ),
182 cacheProject( path, prj.release() );
187 QStringLiteral(
"Error when loading project file '%1': %2 " ).arg( path, prj->error() ),
193 auto entry = mProjectCache[path];
200 if ( ( settings && settings->
retryBadLayers() ) && ( entry->second->validCount() != entry->second->count() ) )
202 for (
const auto &l : entry->second->mapLayers() )
206 QString subsetString;
213 l->setDataSource( l->source(), l->name(), l->providerType(), options );
214 if ( vlayer && !subsetString.isEmpty() )
222 return entry->second.get();
229 const auto constKeys { mProjectCache.keys() };
230 for (
const auto &path : std::as_const( constKeys ) )
232 projects << mProjectCache[path]->second.get();
238QDomDocument *QgsConfigCache::xmlDocument(
const QString &filePath )
241 QFile configFile( filePath );
242 if ( !configFile.exists() )
248 if ( !configFile.open( QIODevice::ReadOnly ) )
255 QDomDocument *xmlDoc = mXmlDocumentCache.object( filePath );
259 xmlDoc =
new QDomDocument();
262 if ( !xmlDoc->setContent( &configFile,
true, &errorMsg, &line, &column ) )
268 mXmlDocumentCache.insert( filePath, xmlDoc );
269 xmlDoc = mXmlDocumentCache.object( filePath );
276void QgsConfigCache::cacheProject(
const QString &path,
QgsProject *project )
278 mProjectCache.insert( path,
new std::pair<QDateTime, std::unique_ptr<QgsProject>>(
project->lastModified(), std::unique_ptr<QgsProject>(
project ) ) );
280 mStrategy->entryInserted( path );
285 mProjectCache.remove( path );
288 mXmlDocumentCache.remove( path );
290 mStrategy->entryRemoved( path );
307 const auto constKeys { mProjectCache.keys() };
308 for (
const auto &path : std::as_const( constKeys ) )
310 const auto entry = mProjectCache[path];
311 if ( entry && entry->first < entry->second->lastModified() )
332 mFileSystemWatcher.removePath( path );
337 mFileSystemWatcher.addPath( path );
343 : mInterval( interval )
362 if ( !mTimer.isActive() )
364 mTimer.start( mInterval );
370 if ( mTimer.isActive() )
373 mTimer.start( msec );
@ DontLoad3DViews
Skip loading 3D views.
@ DontStoreOriginalStyles
Skip the initial XML style storage for layers. Useful for minimising project load times in non-intera...
@ ForceReadOnlyLayers
Open layers in a read-only mode.
@ TrustLayerMetadata
Trust layer metadata. Improves project read time. Do not use it if layers' extent is not fixed during...
@ DontUpgradeAnnotations
Don't upgrade old annotation items to QgsAnnotationItem.
@ DontLoadLayouts
Don't load print layouts. Improves project read time if layouts are not required, and allows projects...
QFlags< ProjectCapability > ProjectCapabilities
Flags which control project capabilities.
QFlags< ProjectReadFlag > ProjectReadFlags
Project load flags.
@ Warning
Warning message.
@ Critical
Critical/error message.
@ Info
Information message.
Abstract base class for implementing cache invalidation strategy.
Cache for server configuration.
QList< QgsProject * > projects() const
Returns projects currently in cache.
QgsConfigCache(QgsServerSettings *settings)
Initialize from settings.
void removeChangedEntry(const QString &path)
Remove cache entry.
void removeEntry(const QString &path)
Removes an entry from cache.
void removeChangedEntries()
Remove all changed cache entries.
static QgsConfigCache * instance()
Returns the current instance.
static void initialize(QgsServerSettings *settings)
Initialize from settings.
void projectRemovedFromCache(const QString &path)
Emitted whenever a project is removed from the cache.
const QgsProject * project(const QString &path, const QgsServerSettings *settings=nullptr)
If the project is not cached yet, then the project is read from the path.
File system cache strategy for server configuration.
void entryInserted(const QString &path) override
Called when an entry is inserted.
QgsFileSystemCacheStrategy()
Creates a new filesystem strategy.
void entryRemoved(const QString &path) override
Called when an entry is removed from cache.
void attach(QgsConfigCache *cache) override
Attach cache to this strategy.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
Null system cache strategy for server configuration, completely disable cache invalidation invalidati...
void entryInserted(const QString &path) override
Called when an entry is inserted.
void entryRemoved(const QString &path) override
Called when an entry is removed from cache.
void attach(QgsConfigCache *owner) override
Attaches cache to this strategy.
Periodic system cache strategy for server configuration.
void entryInserted(const QString &path) override
Called when an entry is inserted.
void attach(QgsConfigCache *owner) override
Attaches cache to this strategy.
QgsPeriodicCacheStrategy(int interval=3000)
Creates a new periodic strategy.
void entryRemoved(const QString &path) override
Called when an entry is removed from cache.
void setCheckInterval(int msec)
Sets the invalidation check interval for PeriodicStrategy.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
static void setInstance(QgsProject *project)
Set the current project singleton instance to project.
Exception base class for server exceptions.
static QStringList wmsRestrictedLayers(const QgsProject &project)
Returns the restricted layer name list.
Provides a way to retrieve settings by prioritizing according to environment variables,...
bool getPrintDisabled() const
Returns true if WMS GetPrint request is disabled and the project's reading flag QgsProject::ReadFlag:...
int projectCacheSize() const
Returns the projects cache size The default value is 100, the value can be changed by setting the env...
int projectCacheCheckInterval() const
Returns the config cache check interval (in ms) for the 'periodic' strategy.
bool retryBadLayers() const
Returns true if bad layers should be re-checked after the project has been cached.
bool forceReadOnlyLayers() const
Returns true if the reading flag force layer read only is activated.
bool ignoreBadLayers() const
Returns true if the bad layers are ignored and false when the presence of a bad layers invalidates th...
QString projectCacheStrategy() const
Returns the project's cache strategy The default value is 'filesystem', the value can be changed by s...
bool trustLayerMetadata() const
Returns true if the reading flag trust layer metadata is activated.
Stores layer IDs for bad (broken) layers.
QMap< QString, QString > badLayerNames() const
Returns names of bad layers with ids.
QStringList badLayers() const
badLayers
Represents a vector layer which manages a vector based dataset.
virtual bool setSubsetString(const QString &subset)
Sets the string (typically sql) used to define a subset of the layer.
QgsAbstractCacheStrategy * getStrategyFromSettings(QgsServerSettings *settings)
Setting options for creating vector data providers.