Skip to content

Commit 8757853

Browse files
committedJan 15, 2019
Server: throw exception in GetMap if DB connection is not ok
1 parent 4ea42fa commit 8757853

File tree

7 files changed

+56
-1
lines changed

7 files changed

+56
-1
lines changed
 

‎src/core/qgsmaprendererjob.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct LayerRenderJob
5555
bool cached; // if true, img already contains cached image from previous rendering
5656
QgsWeakMapLayerPointer layer;
5757
int renderingTime; //!< Time it took to render the layer in ms (it is -1 if not rendered or still rendering)
58+
QStringList errors; //! rendering errors
5859
};
5960

6061
typedef QList<LayerRenderJob> LayerRenderJobs;

‎src/core/qgsmaprendererparalleljob.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,15 @@ void QgsMapRendererParallelJob::renderLayersFinished()
195195
{
196196
Q_ASSERT( mStatus == RenderingLayers );
197197

198+
LayerRenderJobs::const_iterator it = mLayerJobs.constBegin();
199+
for ( ; it != mLayerJobs.constEnd(); ++it )
200+
{
201+
if ( !it->errors.isEmpty() )
202+
{
203+
mErrors.append( Error( it->layer->id(), it->errors.join( ',' ) ) );
204+
}
205+
}
206+
198207
// compose final image
199208
mFinalImage = composeImage( mSettings, mLayerJobs, mLabelJob );
200209

@@ -269,6 +278,8 @@ void QgsMapRendererParallelJob::renderLayerStatic( LayerRenderJob &job )
269278
{
270279
QgsDebugMsg( QStringLiteral( "Caught unhandled unknown exception" ) );
271280
}
281+
282+
job.errors = job.renderer->errors();
272283
job.renderingTime += t.elapsed();
273284
QgsDebugMsgLevel( QStringLiteral( "job %1 end [%2 ms] (layer %3)" ).arg( reinterpret_cast< quint64 >( &job ), 0, 16 ).arg( job.renderingTime ).arg( job.layer ? job.layer->id() : QString() ), 2 );
274285
}

‎src/core/qgsvectorlayerrenderer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ bool QgsVectorLayerRenderer::render()
246246
else
247247
drawRenderer( fit );
248248

249+
if ( !fit.isValid() )
250+
{
251+
mErrors.append( QStringLiteral( "Data source invalid" ) );
252+
}
253+
249254
if ( usingEffect )
250255
{
251256
mRenderer->paintEffect()->end( mContext );

‎src/providers/postgres/qgspostgresfeatureiterator.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ QgsPostgresFeatureIterator::QgsPostgresFeatureIterator( QgsPostgresFeatureSource
4747
mIsTransactionConnection = true;
4848
}
4949

50-
if ( !mConn )
50+
if ( !mConn || mConn->PQstatus() != CONNECTION_OK )
5151
{
52+
mValid = false;
5253
mClosed = true;
5354
iteratorClosed();
5455
return;

‎src/server/services/wms/qgsmaprendererjobproxy.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ namespace QgsWms
6666
renderJob.waitForFinished();
6767
*image = renderJob.renderedImage();
6868
mPainter.reset( new QPainter( image ) );
69+
70+
getRenderErrors( &renderJob );
6971
}
7072
else
7173
{
@@ -75,6 +77,7 @@ namespace QgsWms
7577
renderJob.setFeatureFilterProvider( mFeatureFilterProvider );
7678
#endif
7779
renderJob.renderSynchronously();
80+
getRenderErrors( &renderJob );
7881
}
7982
}
8083

@@ -83,4 +86,20 @@ namespace QgsWms
8386
return mPainter.release();
8487
}
8588

89+
void QgsMapRendererJobProxy::getRenderErrors( const QgsMapRendererJob *job )
90+
{
91+
if ( !job )
92+
{
93+
return;
94+
}
95+
96+
mErrors.clear();
97+
QgsMapRendererJob::Errors e = job->errors();
98+
QgsMapRendererJob::Errors::const_iterator eIt = e.constBegin();
99+
for ( ; eIt != e.constEnd(); ++eIt )
100+
{
101+
mErrors.append( qMakePair( eIt->layerID, eIt->message ) );
102+
}
103+
}
104+
86105
} // namespace qgsws

‎src/server/services/wms/qgsmaprendererjobproxy.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,17 @@ namespace QgsWms
6161
*/
6262
QPainter *takePainter();
6363

64+
const QList< QPair< QString, QString > > &errors() const { return mErrors; }
65+
6466
private:
6567
bool mParallelRendering;
6668
QgsFeatureFilterProvider *mFeatureFilterProvider = nullptr;
6769
std::unique_ptr<QPainter> mPainter;
70+
71+
void getRenderErrors( const QgsMapRendererJob *job );
72+
73+
//! Layer id / error message
74+
QList< QPair< QString, QString > > mErrors;
6875
};
6976

7077

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2917,6 +2917,17 @@ namespace QgsWms
29172917
QgsMapRendererJobProxy renderJob( mSettings.parallelRendering(), mSettings.maxThreads(), &filters );
29182918
renderJob.render( mapSettings, &image );
29192919
painter = renderJob.takePainter();
2920+
2921+
if ( !renderJob.errors().isEmpty() )
2922+
{
2923+
QString layerWMSName;
2924+
QgsMapLayer *errorLayer = mProject->mapLayer( renderJob.errors().at( 0 ).first );
2925+
if ( errorLayer )
2926+
{
2927+
layerWMSName = layerNickname( *errorLayer );
2928+
}
2929+
throw QgsServerException( QString( "Map rendering error in layer '%1'" ).arg( layerWMSName ) );
2930+
}
29202931
}
29212932

29222933
return painter;

0 commit comments

Comments
 (0)
Please sign in to comment.