Skip to content

Commit c2d339b

Browse files
author
mhugent
committed
Insert 0 for missing geometries in postgres provider. Plus little performance enhancement by avoiding unnecessary copies
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@8101 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent bb008af commit c2d339b

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)