[QGIS Commit] r15707 - trunk/qgis/src/mapserver
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Fri Apr 15 10:16:01 EDT 2011
Author: mhugent
Date: 2011-04-15 07:16:00 -0700 (Fri, 15 Apr 2011)
New Revision: 15707
Modified:
trunk/qgis/src/mapserver/qgsconfigcache.cpp
trunk/qgis/src/mapserver/qgsconfigparser.h
trunk/qgis/src/mapserver/qgsmslayercache.cpp
trunk/qgis/src/mapserver/qgsmslayercache.h
trunk/qgis/src/mapserver/qgsprojectparser.cpp
trunk/qgis/src/mapserver/qgsprojectparser.h
trunk/qgis/src/mapserver/qgssldparser.cpp
trunk/qgis/src/mapserver/qgssldparser.h
Log:
More flexible limit of layer number in qgis server depending on number of layers in project. Fixes bug #3502
Modified: trunk/qgis/src/mapserver/qgsconfigcache.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgsconfigcache.cpp 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgsconfigcache.cpp 2011-04-15 14:16:00 UTC (rev 15707)
@@ -17,6 +17,7 @@
#include "qgsconfigcache.h"
#include "qgsmapserverlogger.h"
+#include "qgsmslayercache.h"
#include "qgsprojectparser.h"
#include "qgssldparser.h"
@@ -35,17 +36,25 @@
QgsConfigParser* QgsConfigCache::searchConfiguration( const QString& filePath )
{
+ QgsConfigParser* p = 0;
QMap<QString, QgsConfigParser*>::const_iterator configIt = mCachedConfigurations.find( filePath );
if ( configIt == mCachedConfigurations.constEnd() )
{
QgsMSDebugMsg( "Create new configuration" );
- return insertConfiguration( filePath );
+ p = insertConfiguration( filePath );
}
else
{
QgsMSDebugMsg( "Return configuration from cache" );
- return configIt.value();
+ p = configIt.value();
}
+
+ if ( p )
+ {
+ //there could be more layers in a project than allowed by the cache per default
+ QgsMSLayerCache::instance()->setProjectMaxLayers( p->numberOfLayers() );
+ }
+ return p;
}
QgsConfigParser* QgsConfigCache::insertConfiguration( const QString& filePath )
Modified: trunk/qgis/src/mapserver/qgsconfigparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgsconfigparser.h 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgsconfigparser.h 2011-04-15 14:16:00 UTC (rev 15707)
@@ -44,6 +44,9 @@
If no layers/style are found, an empty list is returned*/
virtual QList<QgsMapLayer*> mapLayerFromStyle( const QString& layerName, const QString& styleName, bool allowCaching = true ) const = 0;
+ /**Returns number of layers in configuration*/
+ virtual int numberOfLayers() const = 0;
+
/**Fills a layer and a style list. The two list have the same number of entries and the style and the layer at a position belong together (similar to the HTTP parameters 'Layers' and 'Styles'. Returns 0 in case of success*/
virtual int layersAndStyles( QStringList& layers, QStringList& styles ) const = 0;
Modified: trunk/qgis/src/mapserver/qgsmslayercache.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgsmslayercache.cpp 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgsmslayercache.cpp 2011-04-15 14:16:00 UTC (rev 15707)
@@ -20,7 +20,7 @@
#include "qgsmapserverlogger.h"
//maximum number of layers in the cache (and upper limit for layers in one published project)
-#define MAX_N_LAYERS 100
+#define DEFAULT_MAX_N_LAYERS 50
QgsMSLayerCache* QgsMSLayerCache::mInstance = 0;
@@ -52,7 +52,7 @@
void QgsMSLayerCache::insertLayer( const QString& url, const QString& layerName, QgsMapLayer* layer, const QList<QString>& tempFiles )
{
QgsMSDebugMsg( "inserting layer" );
- if ( mEntries.size() > MAX_N_LAYERS ) //force cache layer examination after 10 inserted layers
+ if ( mEntries.size() > std::max( DEFAULT_MAX_N_LAYERS, mProjectMaxLayers ) ) //force cache layer examination after 10 inserted layers
{
updateEntries();
}
@@ -102,7 +102,7 @@
void QgsMSLayerCache::updateEntries()
{
QgsMSDebugMsg( "updateEntries" );
- int entriesToDelete = mEntries.size() - MAX_N_LAYERS;
+ int entriesToDelete = mEntries.size() - std::max( DEFAULT_MAX_N_LAYERS, mProjectMaxLayers );
if ( entriesToDelete < 1 )
{
return;
Modified: trunk/qgis/src/mapserver/qgsmslayercache.h
===================================================================
--- trunk/qgis/src/mapserver/qgsmslayercache.h 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgsmslayercache.h 2011-04-15 14:16:00 UTC (rev 15707)
@@ -51,6 +51,10 @@
@return a pointer to the layer or 0 if no such layer*/
QgsMapLayer* searchLayer( const QString& url, const QString& layerName );
+ int projectsMaxLayers() const { return mProjectMaxLayers; }
+
+ void setProjectMaxLayers( int n ) { mProjectMaxLayers = n; }
+
protected:
/**Protected singleton constructor*/
QgsMSLayerCache();
@@ -70,6 +74,9 @@
url is used several time in a request. It ensures that different layer instances are created for different
layer names*/
QHash<QPair<QString, QString>, QgsMSLayerCacheEntry> mEntries;
+
+ /**Maximum number of layers in the cache, overrides DEFAULT_MAX_N_LAYERS if larger*/
+ int mProjectMaxLayers;
};
#endif
Modified: trunk/qgis/src/mapserver/qgsprojectparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgsprojectparser.cpp 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgsprojectparser.cpp 2011-04-15 14:16:00 UTC (rev 15707)
@@ -47,6 +47,12 @@
delete mXMLDoc;
}
+int QgsProjectParser::numberOfLayers() const
+{
+ QList<QDomElement> layerElems = projectLayerElements();
+ return layerElems.size();
+}
+
void QgsProjectParser::layersAndStylesCapabilities( QDomElement& parentElement, QDomDocument& doc ) const
{
QList<QDomElement> layerElems = projectLayerElements();
Modified: trunk/qgis/src/mapserver/qgsprojectparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgsprojectparser.h 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgsprojectparser.h 2011-04-15 14:16:00 UTC (rev 15707)
@@ -38,6 +38,8 @@
/**Adds layer and style specific capabilities elements to the parent node. This includes the individual layers and styles, their description, native CRS, bounding boxes, etc.*/
virtual void layersAndStylesCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
+ int numberOfLayers() const;
+
/**Returns one or possibly several maplayers for a given layer name and style. If no layers/style are found, an empty list is returned*/
virtual QList<QgsMapLayer*> mapLayerFromStyle( const QString& lName, const QString& styleName, bool allowCaching = true ) const;
Modified: trunk/qgis/src/mapserver/qgssldparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgssldparser.cpp 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgssldparser.cpp 2011-04-15 14:16:00 UTC (rev 15707)
@@ -142,6 +142,23 @@
delete mXMLDoc;
}
+int QgsSLDParser::numberOfLayers() const
+{
+ if ( !mXMLDoc )
+ {
+ return 0;
+ }
+
+ QDomElement sldElem = mXMLDoc->documentElement().toElement();
+ if ( sldElem.isNull() )
+ {
+ return 0;
+ }
+ QDomNodeList userLayerList = sldElem.elementsByTagName( "UserLayer" );
+ QDomNodeList namedLayerList = sldElem.elementsByTagName( "NamedLayer" );
+ return ( userLayerList.size() + namedLayerList.size() );
+}
+
void QgsSLDParser::layersAndStylesCapabilities( QDomElement& parentElement, QDomDocument& doc ) const
{
//iterate over all <UserLayer> nodes
Modified: trunk/qgis/src/mapserver/qgssldparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgssldparser.h 2011-04-15 13:45:21 UTC (rev 15706)
+++ trunk/qgis/src/mapserver/qgssldparser.h 2011-04-15 14:16:00 UTC (rev 15707)
@@ -57,6 +57,9 @@
/**Adds layer and style specific capabilities elements to the parent node. This includes the individual layers and styles, their description, native CRS, bounding boxes, etc.*/
void layersAndStylesCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
+ /**Returns number of layers in configuration*/
+ int numberOfLayers() const;
+
/**Returns one or possibly several maplayers for a given layer name and style. If no layers/style are found, an empty list is returned*/
QList<QgsMapLayer*> mapLayerFromStyle( const QString& layerName, const QString& styleName, bool allowCaching = true ) const;
More information about the QGIS-commit
mailing list