From c343af75c051d4c06cd6bade044f8a157216a4ff Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Sat, 23 May 2020 15:51:46 +0200 Subject: [PATCH] Fix transaction groups on multiple GPKGs Fixes #36525 --- src/core/qgsproject.cpp | 4 +-- tests/src/python/test_provider_ogr_gpkg.py | 41 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/core/qgsproject.cpp b/src/core/qgsproject.cpp index 3c615efbe091..e2cd760e685c 100644 --- a/src/core/qgsproject.cpp +++ b/src/core/qgsproject.cpp @@ -1880,8 +1880,8 @@ void QgsProject::onMapLayersAdded( const QList &layers ) { if ( QgsTransaction::supportsTransaction( vlayer ) ) { - QString connString = QgsDataSourceUri( vlayer->source() ).connectionInfo(); - QString key = vlayer->providerType(); + const QString connString = QgsTransaction::connectionString( vlayer->source() ); + const QString key = vlayer->providerType(); QgsTransactionGroup *tg = mTransactionGroups.value( qMakePair( key, connString ) ); diff --git a/tests/src/python/test_provider_ogr_gpkg.py b/tests/src/python/test_provider_ogr_gpkg.py index 48dc38735506..29a5ff359835 100644 --- a/tests/src/python/test_provider_ogr_gpkg.py +++ b/tests/src/python/test_provider_ogr_gpkg.py @@ -1578,6 +1578,47 @@ def testExporterWithFIDColumn(self): self.assertEqual(f.attributes(), [123, 'text1']) self.assertEqual(f.id(), 123) + def testTransactionGroup(self): + """Issue https://github.com/qgis/QGIS/issues/36525""" + + project = QgsProject() + project.setAutoTransaction(True) + tmpfile1 = os.path.join(self.basetestpath, 'tempGeoPackageTransactionGroup1.gpkg') + tmpfile2 = os.path.join(self.basetestpath, 'tempGeoPackageTransactionGroup2.gpkg') + for tmpfile in (tmpfile1, tmpfile2): + ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile) + for i in range(2): + lyr = ds.CreateLayer('test%s' % i, geom_type=ogr.wkbPoint) + lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) + f = ogr.Feature(lyr.GetLayerDefn()) + f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetField('str_field', 'one') + lyr.CreateFeature(f) + + vl1_1 = QgsVectorLayer(tmpfile1, 'test1_1', 'ogr') + self.assertTrue(vl1_1.isValid()) + vl1_2 = QgsVectorLayer(tmpfile1, 'test1_2', 'ogr') + self.assertTrue(vl1_2.isValid()) + vl2_1 = QgsVectorLayer(tmpfile2, 'test2_1', 'ogr') + self.assertTrue(vl2_1.isValid()) + vl2_2 = QgsVectorLayer(tmpfile2, 'test2_2', 'ogr') + self.assertTrue(vl2_2.isValid()) + project.addMapLayers([vl1_1, vl1_2, vl2_1, vl2_2]) + + self.assertTrue(vl1_1.startEditing()) + self.assertTrue(vl1_2.isEditable()) + self.assertFalse(vl2_1.isEditable()) + self.assertFalse(vl2_2.isEditable()) + + self.assertTrue(vl1_1.rollBack()) + self.assertFalse(vl1_1.isEditable()) + self.assertFalse(vl1_2.isEditable()) + + self.assertTrue(vl2_1.startEditing()) + self.assertTrue(vl2_2.isEditable()) + self.assertFalse(vl1_1.isEditable()) + self.assertFalse(vl1_2.isEditable()) + if __name__ == '__main__': unittest.main()