@@ -365,9 +365,10 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
365365
366366 if (swapEndian)
367367 oid = ntohl (oid); // convert oid to opposite endian
368-
368+
369+ mFeatureQueue .push (QgsFeature ());
369370 // set ID
370- feature .setFeatureId (oid);
371+ mFeatureQueue . back () .setFeatureId (oid);
371372
372373 // fetch attributes
373374 std::list<QString>::const_iterator name_it = mFetchAttributeNames .begin ();
@@ -389,13 +390,13 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
389390 switch (attributeFields[*index_it].type ())
390391 {
391392 case QVariant::Int:
392- feature .addAttribute (*index_it, val.toInt ());
393+ mFeatureQueue . back () .addAttribute (*index_it, val.toInt ());
393394 break ;
394395 case QVariant::Double:
395- feature .addAttribute (*index_it, val.toDouble ());
396+ mFeatureQueue . back () .addAttribute (*index_it, val.toDouble ());
396397 break ;
397398 case QVariant::String:
398- feature .addAttribute (*index_it, val);
399+ mFeatureQueue . back () .addAttribute (*index_it, val);
399400 break ;
400401 default :
401402 assert (0 && " unsupported field type" );
@@ -411,20 +412,14 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
411412 unsigned char *featureGeom = new unsigned char [returnedLength + 1 ];
412413 memset (featureGeom, ' \0 ' , returnedLength + 1 );
413414 memcpy (featureGeom, PQgetvalue (queryResult, row, PQfnumber (queryResult," qgs_feature_geometry" )), returnedLength);
414- feature .setGeometryAndOwnership (featureGeom, returnedLength + 1 );
415+ mFeatureQueue . back () .setGeometryAndOwnership (featureGeom, returnedLength + 1 );
415416 }
416417 else
417418 {
419+ mFeatureQueue .back ().setGeometryAndOwnership (0 , 0 );
418420 QgsDebugMsg (" Couldn't get the feature geometry in binary form" );
419421 }
420422 }
421-
422- // don't copy the geometry. Just pass a pointer instead
423- mFeatureQueue .push (QgsFeature ());
424- mFeatureQueue .back ().setGeometry (feature.geometryAndOwnership ());
425- mFeatureQueue .back ().setFeatureId (feature.featureId ());
426- mFeatureQueue .back ().setAttributeMap (feature.attributeMap ());
427-
428423 } // for each row in queue
429424
430425 PQclear (queryResult);
@@ -437,8 +432,15 @@ bool QgsPostgresProvider::getNextFeature(QgsFeature& feature)
437432 } // if new queue is required
438433
439434 // Now return the next feature from the queue
440- // don't copy the geometry. Just pass a pointer instead
441- feature.setGeometry (mFeatureQueue .front ().geometryAndOwnership ());
435+ if (mFetchGeom )
436+ {
437+ QgsGeometry* featureGeom = mFeatureQueue .front ().geometryAndOwnership ();
438+ feature.setGeometryAndOwnership (featureGeom->wkbBuffer (), featureGeom->wkbSize ());
439+ }
440+ else
441+ {
442+ feature.setGeometryAndOwnership (0 , 0 );
443+ }
442444 feature.setFeatureId (mFeatureQueue .front ().featureId ());
443445 feature.setAttributeMap (mFeatureQueue .front ().attributeMap ());
444446
0 commit comments