[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