Skip to content

Commit 566e93e

Browse files
committedOct 18, 2016
Fix ogrLayerName handling of PostgreSQL dataset URIs
Also document "uri" parameter semantic, and add more tests. See for background https://lists.osgeo.org/pipermail/qgis-developer/2016-October/045311.html REF #15698
1 parent 55505f9 commit 566e93e

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed
 

‎python/plugins/processing/tests/ToolsTest.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,33 +70,41 @@ def test_ogrLayerName(self):
7070
def linkTestfile(f, t):
7171
os.link(os.path.join(dataFolder, f), os.path.join(tmpdir, t))
7272

73+
# URI from OGR provider
7374
linkTestfile('geom_data.csv', 'a.csv')
7475
name = vector.ogrLayerName(tmpdir)
7576
self.assertEqual(name, 'a')
7677

78+
# URI from OGR provider
7779
linkTestfile('wkt_data.csv', 'b.csv')
7880
name = vector.ogrLayerName(tmpdir + '|layerid=0')
7981
self.assertEqual(name, 'a')
8082
name = vector.ogrLayerName(tmpdir + '|layerid=1')
8183
self.assertEqual(name, 'b')
8284

85+
# URI from OGR provider
8386
name = vector.ogrLayerName(tmpdir + '|layerid=2')
8487
self.assertEqual(name, 'invalid-layerid')
8588

89+
# URI from OGR provider
8690
name = vector.ogrLayerName(tmpdir + '|layername=f')
8791
self.assertEqual(name, 'f') # layername takes precedence
8892

93+
# URI from OGR provider
8994
name = vector.ogrLayerName(tmpdir + '|layerid=0|layername=f2')
9095
self.assertEqual(name, 'f2') # layername takes precedence
9196

97+
# URI from OGR provider
9298
name = vector.ogrLayerName(tmpdir + '|layername=f2|layerid=0')
9399
self.assertEqual(name, 'f2') # layername takes precedence
94100

101+
# URI from Sqlite provider
95102
name = vector.ogrLayerName('dbname=\'/tmp/x.sqlite\' table="t" (geometry) sql=')
96103
self.assertEqual(name, 't')
97104

98-
name = vector.ogrLayerName('dbname=\'/tmp/x.sqlite\' table="s.t" (geometry) sql=')
99-
self.assertEqual(name, 's.t')
105+
# URI from PostgreSQL provider
106+
name = vector.ogrLayerName('port=5493 sslmode=disable key=\'edge_id\' srid=0 type=LineString table="city_data"."edge" (geom) sql=')
107+
self.assertEqual(name, 'city_data.edge')
100108

101109
def testFeatures(self):
102110
ProcessingConfig.initialize()

‎python/plugins/processing/tools/vector.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -510,16 +510,43 @@ def ogrConnectionString(uri):
510510
return '"' + ogrstr + '"'
511511

512512

513+
#
514+
# The uri parameter is an URI from any QGIS provider,
515+
# so could have different formats.
516+
# Example formats:
517+
#
518+
# -- PostgreSQL provider
519+
# port=5493 sslmode=disable key='edge_id' srid=0 type=LineString table="city_data"."edge" (geom) sql=
520+
#
521+
# -- Spatialite provider
522+
# dbname='/tmp/x.sqlite' table="t" (geometry) sql='
523+
#
524+
# -- OGR provider (single-layer directory)
525+
# /tmp/x.gdb
526+
#
527+
# -- OGR provider (multi-layer directory)
528+
# /tmp/x.gdb|layerid=1
529+
#
530+
# -- OGR provider (multi-layer directory)
531+
# /tmp/x.gdb|layername=thelayer
532+
#
513533
def ogrLayerName(uri):
514-
if 'host' in uri:
515-
regex = re.compile('table="(.+?)\.(.+?)"')
516-
r = regex.search(uri)
517-
return '"' + r.groups()[0] + '.' + r.groups()[1] + '"'
518-
elif 'dbname' in uri:
519-
regex = re.compile('table="(.+?)"')
520-
r = regex.search(uri)
521-
return r.groups()[0]
522-
elif 'layername' in uri:
534+
535+
# handle URIs of database providers
536+
if ' table=' in uri:
537+
# Matches table="schema"."table"
538+
re_table_schema = re.compile(' table="([^"]*)"\."([^"]*)"')
539+
r = re_table_schema.search(uri)
540+
if r:
541+
return r.groups()[0] + '.' + r.groups()[1]
542+
# Matches table="table"
543+
re_table = re.compile(' table="([^"]*)"')
544+
r = re_table.search(uri)
545+
if r:
546+
return r.groups()[0]
547+
548+
# handle URIs of OGR provider with explicit layername
549+
if 'layername' in uri:
523550
regex = re.compile('(layername=)([^|]*)')
524551
r = regex.search(uri)
525552
return r.groups()[1]

0 commit comments

Comments
 (0)