Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Server: skip initial style storage
  • Loading branch information
github-actions[bot] authored and nyalldawson committed Dec 1, 2020
1 parent 99012be commit 35c0629
Show file tree
Hide file tree
Showing 8 changed files with 19 additions and 5 deletions.
4 changes: 3 additions & 1 deletion python/core/auto_additions/qgsproject.py
Expand Up @@ -6,7 +6,9 @@
QgsProject.ReadFlag.FlagDontLoadLayouts.__doc__ = "Don't load print layouts. Improves project read time if layouts are not required, and allows projects to be safely read in background threads (since print layouts are not thread safe)."
QgsProject.FlagTrustLayerMetadata = QgsProject.ReadFlag.FlagTrustLayerMetadata
QgsProject.ReadFlag.FlagTrustLayerMetadata.__doc__ = "Trust layer metadata. Improves project read time. Do not use it if layers' extent is not fixed during the project's use by QGIS and QGIS Server."
QgsProject.ReadFlag.__doc__ = 'Flags which control project read behavior.\n\n.. versionadded:: 3.10\n\n' + '* ``FlagDontResolveLayers``: ' + QgsProject.ReadFlag.FlagDontResolveLayers.__doc__ + '\n' + '* ``FlagDontLoadLayouts``: ' + QgsProject.ReadFlag.FlagDontLoadLayouts.__doc__ + '\n' + '* ``FlagTrustLayerMetadata``: ' + QgsProject.ReadFlag.FlagTrustLayerMetadata.__doc__
QgsProject.FlagDontStoreOriginalStyles = QgsProject.ReadFlag.FlagDontStoreOriginalStyles
QgsProject.ReadFlag.FlagDontStoreOriginalStyles.__doc__ = "Skip the initial XML style storage for layers. Useful for minimising project load times in non-interactive contexts."
QgsProject.ReadFlag.__doc__ = 'Flags which control project read behavior.\n\n.. versionadded:: 3.10\n\n' + '* ``FlagDontResolveLayers``: ' + QgsProject.ReadFlag.FlagDontResolveLayers.__doc__ + '\n' + '* ``FlagDontLoadLayouts``: ' + QgsProject.ReadFlag.FlagDontLoadLayouts.__doc__ + '\n' + '* ``FlagTrustLayerMetadata``: ' + QgsProject.ReadFlag.FlagTrustLayerMetadata.__doc__ + '\n' + '* ``FlagDontStoreOriginalStyles``: ' + QgsProject.ReadFlag.FlagDontStoreOriginalStyles.__doc__
# --
# monkey patching scoped based enum
QgsProject.FileFormat.Qgz.__doc__ = "Archive file format, supports auxiliary data"
Expand Down
1 change: 1 addition & 0 deletions python/core/auto_generated/qgsproject.sip.in
Expand Up @@ -40,6 +40,7 @@ open within the main QGIS application.
FlagDontResolveLayers,
FlagDontLoadLayouts,
FlagTrustLayerMetadata,
FlagDontStoreOriginalStyles,
};
typedef QFlags<QgsProject::ReadFlag> ReadFlags;

Expand Down
2 changes: 1 addition & 1 deletion src/app/browser/qgsinbuiltdataitemproviders.cpp
Expand Up @@ -689,7 +689,7 @@ void QgsProjectItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *m

QgsProject p;
QgsTemporaryCursorOverride override( Qt::WaitCursor );
if ( p.read( projectPath, QgsProject::ReadFlag::FlagDontResolveLayers ) )
if ( p.read( projectPath, QgsProject::ReadFlag::FlagDontResolveLayers | QgsProject::ReadFlag::FlagDontStoreOriginalStyles ) )
{
p.accept( &visitor );
override.release();
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsappbrowserproviders.cpp
Expand Up @@ -473,7 +473,7 @@ QVector<QgsDataItem *> QgsProjectRootDataItem::createChildren()
QVector<QgsDataItem *> childItems;

QgsProject p;
if ( !p.read( mPath, QgsProject::ReadFlag::FlagDontResolveLayers | QgsProject::ReadFlag::FlagDontLoadLayouts ) )
if ( !p.read( mPath, QgsProject::ReadFlag::FlagDontResolveLayers | QgsProject::ReadFlag::FlagDontLoadLayouts | QgsProject::ReadFlag::FlagDontStoreOriginalStyles ) )
{
childItems.append( new QgsErrorItem( nullptr, p.error(), mPath + "/error" ) );
return childItems;
Expand Down
5 changes: 4 additions & 1 deletion src/core/qgsproject.cpp
Expand Up @@ -1619,7 +1619,10 @@ bool QgsProject::readProjectFile( const QString &filename, QgsProject::ReadFlags
// After bad layer handling we might still have invalid layers,
// store them in case the user wanted to handle them later
// or wanted to pass them through when saving
QgsLayerTreeUtils::storeOriginalLayersProperties( mRootGroup, doc.get() );
if ( !( flags & QgsProject::ReadFlag::FlagDontStoreOriginalStyles ) )
{
QgsLayerTreeUtils::storeOriginalLayersProperties( mRootGroup, doc.get() );
}

mRootGroup->removeCustomProperty( QStringLiteral( "loading" ) );

Expand Down
1 change: 1 addition & 0 deletions src/core/qgsproject.h
Expand Up @@ -121,6 +121,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
FlagDontResolveLayers = 1 << 0, //!< Don't resolve layer paths (i.e. don't load any layer content). Dramatically improves project read time if the actual data from the layers is not required.
FlagDontLoadLayouts = 1 << 1, //!< Don't load print layouts. Improves project read time if layouts are not required, and allows projects to be safely read in background threads (since print layouts are not thread safe).
FlagTrustLayerMetadata = 1 << 2, //!< Trust layer metadata. Improves project read time. Do not use it if layers' extent is not fixed during the project's use by QGIS and QGIS Server.
FlagDontStoreOriginalStyles = 1 << 3, //!< Skip the initial XML style storage for layers. Useful for minimising project load times in non-interactive contexts.
};
Q_DECLARE_FLAGS( ReadFlags, ReadFlag )

Expand Down
3 changes: 2 additions & 1 deletion src/server/qgsconfigcache.cpp
Expand Up @@ -48,7 +48,8 @@ const QgsProject *QgsConfigCache::project( const QString &path, QgsServerSetting
QgsStoreBadLayerInfo *badLayerHandler = new QgsStoreBadLayerInfo();
prj->setBadLayerHandler( badLayerHandler );

QgsProject::ReadFlags readFlags = QgsProject::ReadFlag();
// Always skip original styles storage
QgsProject::ReadFlags readFlags = QgsProject::ReadFlag() | QgsProject::ReadFlag::FlagDontStoreOriginalStyles ;
if ( settings )
{
// Activate trust layer metadata flag
Expand Down
6 changes: 6 additions & 0 deletions tests/src/core/testqgsproject.cpp
Expand Up @@ -451,6 +451,12 @@ void TestQgsProject::testReadFlags()
QCOMPARE( qobject_cast< QgsVectorLayer * >( layers.value( QStringLiteral( "points20170310142652246" ) ) )->renderer()->type(), QStringLiteral( "categorizedSymbol" ) );
QCOMPARE( qobject_cast< QgsVectorLayer * >( layers.value( QStringLiteral( "lines20170310142652255" ) ) )->renderer()->type(), QStringLiteral( "categorizedSymbol" ) );
QCOMPARE( qobject_cast< QgsVectorLayer * >( layers.value( QStringLiteral( "polys20170310142652234" ) ) )->renderer()->type(), QStringLiteral( "categorizedSymbol" ) );
QVERIFY( ! layers.value( QStringLiteral( "polys20170310142652234" ) )->originalXmlProperties().isEmpty() );

// do not store styles
QVERIFY( p.read( project1Path, QgsProject::ReadFlag::FlagDontStoreOriginalStyles ) );
layers = p.mapLayers();
QVERIFY( layers.value( QStringLiteral( "polys20170310142652234" ) )->originalXmlProperties().isEmpty() );

// project with embedded groups
QString project2Path = QString( TEST_DATA_DIR ) + QStringLiteral( "/embedded_groups/project2.qgs" );
Expand Down

0 comments on commit 35c0629

Please sign in to comment.