Skip to content

Commit aa413b6

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 71bfa1d commit aa413b6

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
@@ -512,16 +512,43 @@ def ogrConnectionString(uri):
512512
return '"' + ogrstr + '"'
513513

514514

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

0 commit comments

Comments
 (0)
Please sign in to comment.