Skip to content

Commit

Permalink
OGR CSV: fix slow update
Browse files Browse the repository at this point in the history
Fix #51668
  • Loading branch information
elpaso authored and nyalldawson committed Mar 6, 2023
1 parent 45a10b2 commit a4fc2b5
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -2176,6 +2176,10 @@ bool QgsOgrProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
{
mayNeedResetReadingAfterGetFeature = false;
}
else if ( mGDALDriverName == QLatin1String( "CSV" ) )
{
mayNeedResetReadingAfterGetFeature = false;
}

for ( QgsChangedAttributesMap::const_iterator it = attr_map.begin(); it != attr_map.end(); ++it )
{
Expand Down
35 changes: 35 additions & 0 deletions tests/src/python/test_provider_ogr.py
Expand Up @@ -2961,6 +2961,41 @@ def testUnknownButNoGeometry(self):
self.assertEqual(vl.featureCount(), 2)
self.assertEqual(len([x for x in vl.getFeatures()]), 2)

def testCsvInterleavedUpdate(self):
"""Checks whether a full update with interleaved fids works reliably, related to GH #51668"""

temp_dir = QTemporaryDir()
temp_path = temp_dir.path()
csv_path = os.path.join(temp_path, 'test.csv')
with open(csv_path, 'w+') as f:
f.write('fid\tname\n')
f.write('1\t"feat 1"\n')
f.write('2\t"feat 2"\n')
f.write('3\t"feat 3"\n')

vl = QgsVectorLayer(csv_path, 'csv')
self.assertTrue(vl.isValid())
self.assertEqual(vl.featureCount(), 3)
f = next(vl.getFeatures())
self.assertEqual(f.attributes(), ['1', "feat 1"])

self.assertTrue(vl.startEditing())
self.assertTrue(vl.addAttribute(QgsField('newf', QVariant.String)))
self.assertTrue(vl.changeAttributeValues(3, {2: 'fid 3'}))
self.assertTrue(vl.changeAttributeValues(1, {2: 'fid 1'}))
self.assertTrue(vl.changeAttributeValues(2, {2: 'fid 2'}))
self.assertTrue(vl.commitChanges())

vl = QgsVectorLayer(csv_path, 'csv')
self.assertTrue(vl.isValid())
self.assertEqual(vl.featureCount(), 3)
features = {f.id(): f.attributes() for f in vl.getFeatures()}
self.assertEqual(features, {
1: ['1', 'feat 1', 'fid 1'],
2: ['2', 'feat 2', 'fid 2'],
3: ['3', 'feat 3', 'fid 3']
})


if __name__ == '__main__':
unittest.main()

0 comments on commit a4fc2b5

Please sign in to comment.