@@ -1042,8 +1042,34 @@ QString QgsPostgresConn::quotedValue( const QVariant &value )
1042
1042
}
1043
1043
}
1044
1044
1045
- PGresult *QgsPostgresConn::PQexec ( const QString &query, bool logError ) const
1045
+ PGresult *QgsPostgresConn::PQexec ( const QString &query, bool logError, bool retry ) const
1046
1046
{
1047
+ QMutexLocker locker ( &mLock );
1048
+
1049
+ QgsDebugMsgLevel ( QStringLiteral ( " Executing SQL: %1" ).arg ( query ), 3 );
1050
+
1051
+ PGresult *res = ::PQexec ( mConn , query.toUtf8 () );
1052
+
1053
+ // libpq may return a non null ptr with conn status not OK so we need to check for it to allow a retry below
1054
+ if ( res && PQstatus () == CONNECTION_OK )
1055
+ {
1056
+ int errorStatus = PQresultStatus ( res );
1057
+ if ( errorStatus != PGRES_COMMAND_OK && errorStatus != PGRES_TUPLES_OK )
1058
+ {
1059
+ if ( logError )
1060
+ {
1061
+ QgsMessageLog::logMessage ( tr ( " Erroneous query: %1 returned %2 [%3]" )
1062
+ .arg ( query ).arg ( errorStatus ).arg ( PQresultErrorMessage ( res ) ),
1063
+ tr ( " PostGIS" ) );
1064
+ }
1065
+ else
1066
+ {
1067
+ QgsDebugMsg ( QStringLiteral ( " Not logged erroneous query: %1 returned %2 [%3]" )
1068
+ .arg ( query ).arg ( errorStatus ).arg ( PQresultErrorMessage ( res ) ) );
1069
+ }
1070
+ }
1071
+ return res;
1072
+ }
1047
1073
if ( PQstatus () != CONNECTION_OK )
1048
1074
{
1049
1075
if ( logError )
@@ -1057,45 +1083,48 @@ PGresult *QgsPostgresConn::PQexec( const QString &query, bool logError ) const
1057
1083
QgsDebugMsg ( QStringLiteral ( " Connection error: %1 returned %2 [%3]" )
1058
1084
.arg ( query ).arg ( PQstatus () ).arg ( PQerrorMessage () ) );
1059
1085
}
1060
-
1061
- return nullptr ;
1062
1086
}
1063
-
1064
- QgsDebugMsgLevel ( QStringLiteral ( " Executing SQL: %1" ).arg ( query ), 3 );
1065
- PGresult *res = nullptr ;
1087
+ else
1066
1088
{
1067
- QMutexLocker locker ( &mLock );
1068
- res = ::PQexec ( mConn , query.toUtf8 () );
1089
+ if ( logError )
1090
+ {
1091
+ QgsMessageLog::logMessage ( tr ( " Query failed: %1\n Error: no result buffer" ).arg ( query ), tr ( " PostGIS" ) );
1092
+ }
1093
+ else
1094
+ {
1095
+ QgsDebugMsg ( QStringLiteral ( " Not logged query failed: %1\n Error: no result buffer" ).arg ( query ) );
1096
+ }
1097
+ }
1069
1098
1070
- if ( res )
1099
+ if ( retry )
1100
+ {
1101
+ QgsMessageLog::logMessage ( tr ( " resetting bad connection." ), tr ( " PostGIS" ) );
1102
+ ::PQreset ( mConn );
1103
+ res = PQexec ( query, logError, false );
1104
+ if ( PQstatus () == CONNECTION_OK )
1071
1105
{
1072
- int errorStatus = PQresultStatus ( res );
1073
- if ( errorStatus != PGRES_COMMAND_OK && errorStatus != PGRES_TUPLES_OK )
1106
+ if ( res )
1074
1107
{
1075
- if ( logError )
1076
- {
1077
- QgsMessageLog::logMessage ( tr ( " Erroneous query: %1 returned %2 [%3]" )
1078
- .arg ( query ).arg ( errorStatus ).arg ( PQresultErrorMessage ( res ) ),
1079
- tr ( " PostGIS" ) );
1080
- }
1081
- else
1082
- {
1083
- QgsDebugMsg ( QStringLiteral ( " Not logged erroneous query: %1 returned %2 [%3]" )
1084
- .arg ( query ).arg ( errorStatus ).arg ( PQresultErrorMessage ( res ) ) );
1085
- }
1108
+ QgsMessageLog::logMessage ( tr ( " retry after reset succeeded." ), tr ( " PostGIS" ) );
1109
+ return res;
1110
+ }
1111
+ else
1112
+ {
1113
+ QgsMessageLog::logMessage ( tr ( " retry after reset failed again." ), tr ( " PostGIS" ) );
1114
+ return nullptr ;
1086
1115
}
1087
- }
1088
- else if ( logError )
1089
- {
1090
- QgsMessageLog::logMessage ( tr ( " Query failed: %1\n Error: no result buffer" ).arg ( query ), tr ( " PostGIS" ) );
1091
1116
}
1092
1117
else
1093
1118
{
1094
- QgsDebugMsg ( QStringLiteral ( " Not logged query failed: %1 \n Error: no result buffer " ). arg ( query ) );
1119
+ QgsMessageLog::logMessage ( tr ( " connection still bad after reset. " ), tr ( " PostGIS " ) );
1095
1120
}
1096
1121
}
1122
+ else
1123
+ {
1124
+ QgsMessageLog::logMessage ( tr ( " bad connection, not retrying." ), tr ( " PostGIS" ) );
1125
+ }
1126
+ return nullptr ;
1097
1127
1098
- return res;
1099
1128
}
1100
1129
1101
1130
bool QgsPostgresConn::openCursor ( const QString &cursorName, const QString &sql )
@@ -1137,7 +1166,7 @@ QString QgsPostgresConn::uniqueCursorName()
1137
1166
return QStringLiteral ( " qgis_%1" ).arg ( ++mNextCursorId );
1138
1167
}
1139
1168
1140
- bool QgsPostgresConn::PQexecNR ( const QString &query, bool retry )
1169
+ bool QgsPostgresConn::PQexecNR ( const QString &query )
1141
1170
{
1142
1171
QMutexLocker locker ( &mLock ); // to protect access to mOpenCursors
1143
1172
@@ -1165,32 +1194,6 @@ bool QgsPostgresConn::PQexecNR( const QString &query, bool retry )
1165
1194
{
1166
1195
PQexecNR ( QStringLiteral ( " ROLLBACK" ) );
1167
1196
}
1168
- else if ( retry )
1169
- {
1170
- QgsMessageLog::logMessage ( tr ( " resetting bad connection." ), tr ( " PostGIS" ) );
1171
- ::PQreset ( mConn );
1172
- if ( PQstatus () == CONNECTION_OK )
1173
- {
1174
- if ( PQexecNR ( query, false ) )
1175
- {
1176
- QgsMessageLog::logMessage ( tr ( " retry after reset succeeded." ), tr ( " PostGIS" ) );
1177
- return true ;
1178
- }
1179
- else
1180
- {
1181
- QgsMessageLog::logMessage ( tr ( " retry after reset failed again." ), tr ( " PostGIS" ) );
1182
- return false ;
1183
- }
1184
- }
1185
- else
1186
- {
1187
- QgsMessageLog::logMessage ( tr ( " connection still bad after reset." ), tr ( " PostGIS" ) );
1188
- }
1189
- }
1190
- else
1191
- {
1192
- QgsMessageLog::logMessage ( tr ( " bad connection, not retrying." ), tr ( " PostGIS" ) );
1193
- }
1194
1197
1195
1198
return false ;
1196
1199
}
0 commit comments