@@ -420,15 +420,31 @@ bool QgsWFSProvider::processSQL( const QString &sqlString, QString &errorMsg, QS
420
420
}
421
421
422
422
QgsWFSDescribeFeatureType describeFeatureType ( mShared ->mURI );
423
- if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
424
- concatenatedTypenames ) )
423
+ bool bUsePlural = false ;
424
+ QByteArray response;
425
+ for ( int i = 0 ; i < 2 ; i++ )
425
426
{
426
- errorMsg = tr ( " DescribeFeatureType failed for url %1: %2" ).
427
- arg ( dataSourceUri (), describeFeatureType.errorMessage () );
428
- return false ;
429
- }
427
+ if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
428
+ concatenatedTypenames, bUsePlural ) )
429
+ {
430
+ errorMsg = tr ( " DescribeFeatureType failed for url %1: %2" ).
431
+ arg ( dataSourceUri (), describeFeatureType.errorMessage () );
432
+ return false ;
433
+ }
430
434
431
- const QByteArray &response = describeFeatureType.response ();
435
+ response = describeFeatureType.response ();
436
+ // "http://geoportal.samregion.ru/wfs12?SERVICE=WFS&REQUEST=DescribeFeatureType&TYPENAME=EC_1_132&VERSION=2.0.0"
437
+ // returns a <ExceptionText><![CDATA[Missing typeNames parameter]]></ExceptionText>
438
+ if ( i == 0 && response.indexOf ( " <![CDATA[Missing typeNames parameter]]>" ) >= 0 )
439
+ {
440
+ QgsDebugMsg ( " Server does not accept TYPENAME parameter for DescribeFeatureType. Re-trying with TYPENAMES" );
441
+ bUsePlural = true ;
442
+ }
443
+ else
444
+ {
445
+ break ;
446
+ }
447
+ }
432
448
433
449
QDomDocument describeFeatureDocument;
434
450
errorMsg.clear ();
@@ -919,7 +935,7 @@ bool QgsWFSProvider::deleteFeatures( const QgsFeatureIds &id )
919
935
transactionDoc.appendChild ( transactionElem );
920
936
// delete element
921
937
QDomElement deleteElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Delete" ) );
922
- deleteElem.setAttribute ( QgsWFSUtils::typeNameParameterForVersion ( mShared -> mWFSVersion ), tname );
938
+ deleteElem.setAttribute ( QStringLiteral ( " typeName " ), tname );
923
939
QDomElement filterElem = transactionDoc.createElementNS ( QgsWFSConstants::OGC_NAMESPACE, QStringLiteral ( " Filter" ) );
924
940
925
941
@@ -984,7 +1000,7 @@ bool QgsWFSProvider::changeGeometryValues( const QgsGeometryMap &geometry_map )
984
1000
continue ;
985
1001
}
986
1002
QDomElement updateElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Update" ) );
987
- updateElem.setAttribute ( QgsWFSUtils::typeNameParameterForVersion ( mShared -> mWFSVersion ), tname );
1003
+ updateElem.setAttribute ( QStringLiteral ( " typeName " ), tname );
988
1004
// Property
989
1005
QDomElement propertyElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Property" ) );
990
1006
QDomElement nameElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Name" ) );
@@ -1040,7 +1056,6 @@ QString QgsWFSProvider::convertToXML( const QVariant &value )
1040
1056
return valueStr;
1041
1057
}
1042
1058
1043
-
1044
1059
bool QgsWFSProvider::changeAttributeValues ( const QgsChangedAttributesMap &attr_map )
1045
1060
{
1046
1061
// find out typename from uri and strip namespace prefix
@@ -1066,7 +1081,7 @@ bool QgsWFSProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
1066
1081
}
1067
1082
1068
1083
QDomElement updateElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Update" ) );
1069
- updateElem.setAttribute ( QgsWFSUtils::typeNameParameterForVersion ( mShared -> mWFSVersion ), tname );
1084
+ updateElem.setAttribute ( QStringLiteral ( " typeName " ), tname );
1070
1085
1071
1086
QgsAttributeMap::const_iterator attMapIt = attIt.value ().constBegin ();
1072
1087
for ( ; attMapIt != attIt.value ().constEnd (); ++attMapIt )
@@ -1159,25 +1174,38 @@ QString QgsWFSProvider::translateMetadataValue( const QString &mdKey, const QVar
1159
1174
{
1160
1175
return value.toString ();
1161
1176
}
1162
- }
1177
+ };
1163
1178
1164
- bool QgsWFSProvider::describeFeatureType ( QString &geometryAttribute,
1165
- QgsFields &fields,
1166
- QgsWkbTypes::Type &geomType,
1167
- bool forceSingularTypeNames )
1179
+ bool QgsWFSProvider::describeFeatureType ( QString &geometryAttribute, QgsFields &fields, QgsWkbTypes::Type &geomType )
1168
1180
{
1169
1181
fields.clear ();
1170
1182
1171
1183
QgsWFSDescribeFeatureType describeFeatureType ( mShared ->mURI );
1172
- if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
1173
- mShared ->mURI .typeName (), forceSingularTypeNames ) )
1184
+ bool bUsePlural = false ;
1185
+ QByteArray response;
1186
+ for ( int i = 0 ; i < 2 ; i++ )
1174
1187
{
1175
- QgsMessageLog::logMessage ( tr ( " DescribeFeatureType network request failed for url %1: %2" ).
1176
- arg ( dataSourceUri (), describeFeatureType.errorMessage () ), tr ( " WFS" ) );
1177
- return false ;
1178
- }
1188
+ if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
1189
+ mShared ->mURI .typeName (), bUsePlural ) )
1190
+ {
1191
+ QgsMessageLog::logMessage ( tr ( " DescribeFeatureType network request failed for url %1: %2" ).
1192
+ arg ( dataSourceUri (), describeFeatureType.errorMessage () ), tr ( " WFS" ) );
1193
+ return false ;
1194
+ }
1179
1195
1180
- const QByteArray &response = describeFeatureType.response ();
1196
+ response = describeFeatureType.response ();
1197
+ // "http://geoportal.samregion.ru/wfs12?SERVICE=WFS&REQUEST=DescribeFeatureType&TYPENAME=EC_1_132&VERSION=2.0.0"
1198
+ // returns a <ExceptionText><![CDATA[Missing typeNames parameter]]></ExceptionText>
1199
+ if ( i == 0 && response.indexOf ( " <![CDATA[Missing typeNames parameter]]>" ) >= 0 )
1200
+ {
1201
+ QgsDebugMsg ( " Server does not accept TYPENAME parameter for DescribeFeatureType. Re-trying with TYPENAMES" );
1202
+ bUsePlural = true ;
1203
+ }
1204
+ else
1205
+ {
1206
+ break ;
1207
+ }
1208
+ }
1181
1209
1182
1210
QDomDocument describeFeatureDocument;
1183
1211
QString errorMsg;
@@ -1193,19 +1221,11 @@ bool QgsWFSProvider::describeFeatureType( QString &geometryAttribute,
1193
1221
mShared ->mURI .typeName (),
1194
1222
geometryAttribute, fields, geomType, errorMsg ) )
1195
1223
{
1196
- // If 2.0.0, let's assume it was a server that only accepted TYPENAME singular form
1197
- // and try with that ...
1198
- if ( ! forceSingularTypeNames && mShared ->mWFSVersion .startsWith ( ' 2' ) )
1199
- {
1200
- return QgsWFSProvider::describeFeatureType ( geometryAttribute,
1201
- fields,
1202
- geomType,
1203
- true );
1204
- }
1205
1224
QgsMessageLog::logMessage ( tr ( " Analysis of DescribeFeatureType response failed for url %1: %2" ).
1206
1225
arg ( dataSourceUri (), errorMsg ), tr ( " WFS" ) );
1207
1226
return false ;
1208
1227
}
1228
+
1209
1229
return true ;
1210
1230
}
1211
1231
@@ -1479,8 +1499,7 @@ QDomElement QgsWFSProvider::createTransactionElement( QDomDocument &doc ) const
1479
1499
describeFeatureTypeURL.addQueryItem ( QStringLiteral ( " REQUEST" ), QStringLiteral ( " DescribeFeatureType" ) );
1480
1500
}
1481
1501
describeFeatureTypeURL.addQueryItem ( QStringLiteral ( " VERSION" ), QStringLiteral ( " 1.0.0" ) );
1482
- // TODO: proper support of 2.0.0, for now hardcoded
1483
- describeFeatureTypeURL.addQueryItem ( QgsWFSUtils::typeNameParameterForVersion ( WfsVersion ).toUpper (), mShared ->mURI .typeName () );
1502
+ describeFeatureTypeURL.addQueryItem ( QStringLiteral ( " TYPENAME" ), mShared ->mURI .typeName () );
1484
1503
1485
1504
transactionElem.setAttribute ( QStringLiteral ( " xsi:schemaLocation" ), mApplicationNamespace + ' '
1486
1505
+ describeFeatureTypeURL.toEncoded () );
0 commit comments