@@ -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
QgsPostgresResult res ( PQexec ( query, false ) );
1143
1172
@@ -1163,32 +1192,6 @@ bool QgsPostgresConn::PQexecNR( const QString &query, bool retry )
1163
1192
{
1164
1193
PQexecNR ( QStringLiteral ( " ROLLBACK" ) );
1165
1194
}
1166
- else if ( retry )
1167
- {
1168
- QgsMessageLog::logMessage ( tr ( " resetting bad connection." ), tr ( " PostGIS" ) );
1169
- ::PQreset ( mConn );
1170
- if ( PQstatus () == CONNECTION_OK )
1171
- {
1172
- if ( PQexecNR ( query, false ) )
1173
- {
1174
- QgsMessageLog::logMessage ( tr ( " retry after reset succeeded." ), tr ( " PostGIS" ) );
1175
- return true ;
1176
- }
1177
- else
1178
- {
1179
- QgsMessageLog::logMessage ( tr ( " retry after reset failed again." ), tr ( " PostGIS" ) );
1180
- return false ;
1181
- }
1182
- }
1183
- else
1184
- {
1185
- QgsMessageLog::logMessage ( tr ( " connection still bad after reset." ), tr ( " PostGIS" ) );
1186
- }
1187
- }
1188
- else
1189
- {
1190
- QgsMessageLog::logMessage ( tr ( " bad connection, not retrying." ), tr ( " PostGIS" ) );
1191
- }
1192
1195
1193
1196
return false ;
1194
1197
}
0 commit comments