From abcdd48580e365d40535f5396ba5096c57a459c9 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 22 Nov 2017 16:47:57 +1000 Subject: [PATCH] [ogr] Fix cannot create layers for geopackage datasets when the database does not yet exist --- src/providers/ogr/qgsogrprovider.cpp | 6 +-- tests/src/python/test_provider_ogr_gpkg.py | 43 ++++++++++++++++++++-- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index 50cbc5a0539..935de33fb2e 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -282,14 +282,14 @@ QgsVectorLayerExporter::ExportError QgsOgrProvider::createEmptyLayer( const QStr } } } - action = QgsVectorFileWriter::CreateOrOverwriteLayer; + if ( QFileInfo::exists( uri ) ) + action = QgsVectorFileWriter::CreateOrOverwriteLayer; } } if ( !overwrite && !update ) { - QFileInfo fi( uri ); - if ( fi.exists() ) + if ( QFileInfo::exists( uri ) ) { if ( errorMessage ) *errorMessage += QObject::tr( "Unable to create the datasource. %1 exists and overwrite flag is false." ) diff --git a/tests/src/python/test_provider_ogr_gpkg.py b/tests/src/python/test_provider_ogr_gpkg.py index eabdda11996..1c719f588d9 100644 --- a/tests/src/python/test_provider_ogr_gpkg.py +++ b/tests/src/python/test_provider_ogr_gpkg.py @@ -20,10 +20,19 @@ import time import qgis # NOQA from osgeo import gdal, ogr -from qgis.core import (QgsFeature, QgsFieldConstraints, QgsGeometry, - QgsRectangle, QgsSettings, QgsVectorLayer, - QgsVectorLayerExporter, QgsPointXY) -from qgis.PyQt.QtCore import QCoreApplication +from qgis.core import (QgsFeature, + QgsCoordinateReferenceSystem, + QgsFields, + QgsField, + QgsFieldConstraints, + QgsGeometry, + QgsRectangle, + QgsSettings, + QgsVectorLayer, + QgsVectorLayerExporter, + QgsPointXY, + QgsWkbTypes) +from qgis.PyQt.QtCore import QCoreApplication, QVariant from qgis.testing import start_app, unittest @@ -469,6 +478,32 @@ class TestPyQgsOGRProviderGpkg(unittest.TestCase): self.assertEqual(f['f1'], 3) features = None + def testExportLayerToExistingDatabase(self): + fields = QgsFields() + fields.append(QgsField('f1', QVariant.Int)) + tmpfile = os.path.join(self.basetestpath, 'testCreateNewGeopackage.gpkg') + options = {} + options['update'] = True + options['driverName'] = 'GPKG' + options['layerName'] = 'table1' + exporter = QgsVectorLayerExporter(tmpfile, "ogr", fields, QgsWkbTypes.Polygon, QgsCoordinateReferenceSystem(3111), False, options) + self.assertFalse(exporter.errorCode(), + 'unexpected export error {}: {}'.format(exporter.errorCode(), exporter.errorMessage())) + options['layerName'] = 'table2' + exporter = QgsVectorLayerExporter(tmpfile, "ogr", fields, QgsWkbTypes.Point, QgsCoordinateReferenceSystem(3113), False, options) + self.assertFalse(exporter.errorCode(), + 'unexpected export error {} : {}'.format(exporter.errorCode(), exporter.errorMessage())) + del exporter + # make sure layers exist + lyr = QgsVectorLayer('{}|layername=table1'.format(tmpfile), "lyr1", "ogr") + self.assertTrue(lyr.isValid()) + self.assertEqual(lyr.crs().authid(), 'EPSG:3111') + self.assertEqual(lyr.wkbType(), QgsWkbTypes.Polygon) + lyr2 = QgsVectorLayer('{}|layername=table2'.format(tmpfile), "lyr2", "ogr") + self.assertTrue(lyr2.isValid()) + self.assertEqual(lyr2.crs().authid(), 'EPSG:3113') + self.assertEqual(lyr2.wkbType(), QgsWkbTypes.Point) + def testGeopackageTwoLayerEdition(self): ''' test https://issues.qgis.org/issues/17034 ''' tmpfile = os.path.join(self.basetestpath, 'testGeopackageTwoLayerEdition.gpkg')