Skip to content

Commit ae60a2f

Browse files
committedMay 6, 2020
PG and PG raster en/decode URI fix and tests
More bugfixes and tests for PG metadata encode and decode URI.
1 parent 0d5ea7d commit ae60a2f

File tree

4 files changed

+181
-33
lines changed

4 files changed

+181
-33
lines changed
 

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5452,7 +5452,8 @@ QVariantMap QgsPostgresProviderMetadata::decodeUri( const QString &uri )
54525452
if ( dsUri.wkbType() != QgsWkbTypes::Type::Unknown )
54535453
uriParts[ QStringLiteral( "type" ) ] = dsUri.wkbType();
54545454

5455-
uriParts[ QStringLiteral( "selectatid" ) ] = dsUri.selectAtIdDisabled();
5455+
if ( uri.contains( QStringLiteral( "selectatid=" ), Qt::CaseSensitivity::CaseInsensitive ) )
5456+
uriParts[ QStringLiteral( "selectatid" ) ] = ! dsUri.selectAtIdDisabled();
54565457

54575458
if ( ! dsUri.table().isEmpty() )
54585459
uriParts[ QStringLiteral( "table" ) ] = dsUri.table();
@@ -5463,8 +5464,11 @@ QVariantMap QgsPostgresProviderMetadata::decodeUri( const QString &uri )
54635464
if ( ! dsUri.srid().isEmpty() )
54645465
uriParts[ QStringLiteral( "srid" ) ] = dsUri.srid();
54655466

5466-
uriParts[ QStringLiteral( "estimatedmetadata" ) ] = dsUri.useEstimatedMetadata();
5467-
uriParts[ QStringLiteral( "sslmode" ) ] = dsUri.sslMode();
5467+
if ( uri.contains( QStringLiteral( "estimatedmetadata=" ), Qt::CaseSensitivity::CaseInsensitive ) )
5468+
uriParts[ QStringLiteral( "estimatedmetadata" ) ] = dsUri.useEstimatedMetadata();
5469+
5470+
if ( uri.contains( QStringLiteral( "sslmode=" ), Qt::CaseSensitivity::CaseInsensitive ) )
5471+
uriParts[ QStringLiteral( "sslmode" ) ] = dsUri.sslMode();
54685472

54695473
if ( ! dsUri.sql().isEmpty() )
54705474
uriParts[ QStringLiteral( "sql" ) ] = dsUri.sql();
@@ -5514,5 +5518,5 @@ QString QgsPostgresProviderMetadata::encodeUri( const QVariantMap &parts )
55145518
dsUri.setParam( QStringLiteral( "checkPrimaryKeyUnicity" ), parts.value( QStringLiteral( "checkPrimaryKeyUnicity" ) ).toString() );
55155519
if ( parts.contains( QStringLiteral( "geometrycolumn" ) ) )
55165520
dsUri.setGeometryColumn( parts.value( QStringLiteral( "geometrycolumn" ) ).toString() );
5517-
return dsUri.uri();
5521+
return dsUri.uri( false );
55185522
}

‎src/providers/postgres/raster/qgspostgresrasterprovider.cpp

Lines changed: 81 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -542,28 +542,86 @@ QgsPostgresRasterProviderMetadata::QgsPostgresRasterProviderMetadata()
542542
QVariantMap QgsPostgresRasterProviderMetadata::decodeUri( const QString &uri )
543543
{
544544
const QgsDataSourceUri dsUri { uri };
545-
return
546-
{
547-
{ QStringLiteral( "dbname" ), dsUri.database() },
548-
{ QStringLiteral( "host" ), dsUri.host() },
549-
{ QStringLiteral( "port" ), dsUri.port() },
550-
{ QStringLiteral( "service" ), dsUri.service() },
551-
{ QStringLiteral( "username" ), dsUri.username() },
552-
{ QStringLiteral( "password" ), dsUri.password() },
553-
{ QStringLiteral( "authcfg" ), dsUri.authConfigId() },
554-
{ QStringLiteral( "selectatid" ), dsUri.selectAtIdDisabled() },
555-
{ QStringLiteral( "table" ), dsUri.table() },
556-
{ QStringLiteral( "schema" ), dsUri.schema() },
557-
{ QStringLiteral( "key" ), dsUri.keyColumn() },
558-
{ QStringLiteral( "srid" ), dsUri.srid() },
559-
{ QStringLiteral( "estimatedmetadata" ), dsUri.useEstimatedMetadata() },
560-
{ QStringLiteral( "sslmode" ), dsUri.sslMode() },
561-
{ QStringLiteral( "sql" ), dsUri.sql() },
562-
{ QStringLiteral( "geometrycolumn" ), dsUri.geometryColumn() },
563-
{ QStringLiteral( "temporalFieldIndex" ), dsUri.param( QStringLiteral( "temporalFieldIndex" ) ) },
564-
{ QStringLiteral( "temporalDefaultTime" ), dsUri.param( QStringLiteral( "temporalDefaultTime" ) ) },
565-
{ QStringLiteral( "enableTime" ), dsUri.param( QStringLiteral( "enableTime" ) ) },
566-
};
545+
QVariantMap decoded;
546+
547+
if ( ! dsUri.database().isEmpty() )
548+
{
549+
decoded[ QStringLiteral( "dbname" ) ] = dsUri.database();
550+
}
551+
if ( ! dsUri.host().isEmpty() )
552+
{
553+
decoded[ QStringLiteral( "host" ) ] = dsUri.host();
554+
}
555+
if ( ! dsUri.port().isEmpty() )
556+
{
557+
decoded[ QStringLiteral( "port" ) ] = dsUri.host();
558+
}
559+
if ( ! dsUri.service().isEmpty() )
560+
{
561+
decoded[ QStringLiteral( "service" ) ] = dsUri.service();
562+
}
563+
if ( ! dsUri.username().isEmpty() )
564+
{
565+
decoded[ QStringLiteral( "username" ) ] = dsUri.username();
566+
}
567+
if ( ! dsUri.password().isEmpty() )
568+
{
569+
decoded[ QStringLiteral( "password" ) ] = dsUri.password();
570+
}
571+
if ( ! dsUri.authConfigId().isEmpty() )
572+
{
573+
decoded[ QStringLiteral( "authcfg" ) ] = dsUri.authConfigId();
574+
}
575+
if ( ! dsUri.schema().isEmpty() )
576+
{
577+
decoded[ QStringLiteral( "schema" ) ] = dsUri.schema();
578+
}
579+
if ( ! dsUri.table().isEmpty() )
580+
{
581+
decoded[ QStringLiteral( "table" ) ] = dsUri.table();
582+
}
583+
if ( ! dsUri.keyColumn().isEmpty() )
584+
{
585+
decoded[ QStringLiteral( "key" ) ] = dsUri.keyColumn();
586+
}
587+
if ( ! dsUri.srid().isEmpty() )
588+
{
589+
decoded[ QStringLiteral( "srid" ) ] = dsUri.srid();
590+
}
591+
if ( uri.contains( QStringLiteral( "estimatedmetadata=" ), Qt::CaseSensitivity::CaseInsensitive ) )
592+
{
593+
decoded[ QStringLiteral( "estimatedmetadata" ) ] = dsUri.useEstimatedMetadata();
594+
}
595+
if ( uri.contains( QStringLiteral( "sslmode=" ), Qt::CaseSensitivity::CaseInsensitive ) )
596+
{
597+
decoded[ QStringLiteral( "sslmode" ) ] = dsUri.sslMode();
598+
}
599+
// Do not add sql if it's empty
600+
if ( ! dsUri.sql().isEmpty() )
601+
{
602+
decoded[ QStringLiteral( "sql" ) ] = dsUri.sql();
603+
}
604+
if ( ! dsUri.geometryColumn().isEmpty() )
605+
{
606+
decoded[ QStringLiteral( "geometrycolumn" ) ] = dsUri.geometryColumn();
607+
}
608+
609+
// Params
610+
const static QStringList params {{
611+
QStringLiteral( "temporalFieldIndex" ),
612+
QStringLiteral( "temporalDefaultTime" ),
613+
QStringLiteral( "enableTime" )
614+
}};
615+
616+
for ( const QString &pname : qgis::as_const( params ) )
617+
{
618+
if ( dsUri.hasParam( pname ) )
619+
{
620+
decoded[ pname ] = dsUri.param( pname );
621+
}
622+
}
623+
624+
return decoded;
567625
}
568626

569627

@@ -608,7 +666,7 @@ QString QgsPostgresRasterProviderMetadata::encodeUri( const QVariantMap &parts )
608666
dsUri.setParam( QStringLiteral( "temporalDefaultTime" ), parts.value( QStringLiteral( "temporalDefaultTime" ) ).toString() );
609667
if ( parts.contains( QStringLiteral( "enableTime" ) ) )
610668
dsUri.setParam( QStringLiteral( "enableTime" ), parts.value( QStringLiteral( "enableTime" ) ).toString() );
611-
return dsUri.uri();
669+
return dsUri.uri( false );
612670
}
613671

614672
QgsPostgresRasterProvider *QgsPostgresRasterProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options )

‎tests/src/python/test_provider_postgres.py

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
QgsGeometry,
4747
QgsProviderRegistry,
4848
QgsVectorDataProvider,
49+
QgsDataSourceUri,
4950
)
5051
from qgis.gui import QgsGui, QgsAttributeForm
5152
from qgis.PyQt.QtCore import QDate, QTime, QDateTime, QVariant, QDir, QObject, QByteArray
@@ -1687,7 +1688,6 @@ def testEncodeDecodeUri(self):
16871688
'host': 'localhost',
16881689
'port': '5432',
16891690
'schema': 'public',
1690-
'selectatid': False,
16911691
'srid': '3067',
16921692
'sslmode': 1,
16931693
'table': 'basic_map_tiled',
@@ -1701,7 +1701,6 @@ def testEncodeDecodeUri(self):
17011701
'key': 'id',
17021702
'port': '5432',
17031703
'schema': 'public',
1704-
'selectatid': False,
17051704
'srid': '3763',
17061705
'sslmode': 1,
17071706
'table': 'copas1',
@@ -1715,24 +1714,62 @@ def testEncodeDecodeUri(self):
17151714
'key': 'id',
17161715
'port': '5432',
17171716
'schema': 'public',
1718-
'selectatid': False,
17191717
'srid': '3763',
17201718
'sslmode': 1,
17211719
'table': 'copas1',
17221720
'type': 6,
1723-
'username': 'myuser'}), "dbname='qgis_tests' user='myuser' srid=3763 estimatedmetadata='true' host='localhost' key='id' port='5432' selectatid='false' sslmode='disable' type='MultiPolygon' table=\"public\".\"copas1\" (geom)")
1721+
'username': 'myuser'}), "dbname='qgis_tests' user='myuser' srid=3763 estimatedmetadata='true' host='localhost' key='id' port='5432' sslmode='disable' type='MultiPolygon' table=\"public\".\"copas1\" (geom)")
17241722

17251723
self.assertEqual(md.encodeUri({'dbname': 'qgis_tests',
17261724
'estimatedmetadata': True,
17271725
'geometrycolumn': 'rast',
17281726
'host': 'localhost',
17291727
'port': '5432',
17301728
'schema': 'public',
1731-
'selectatid': False,
17321729
'srid': '3067',
17331730
'sslmode': 1,
17341731
'table': 'basic_map_tiled',
1735-
'username': 'myuser'}), "dbname='qgis_tests' user='myuser' srid=3067 estimatedmetadata='true' host='localhost' port='5432' selectatid='false' sslmode='disable' table=\"public\".\"basic_map_tiled\" (rast)")
1732+
'username': 'myuser'}), "dbname='qgis_tests' user='myuser' srid=3067 estimatedmetadata='true' host='localhost' port='5432' sslmode='disable' table=\"public\".\"basic_map_tiled\" (rast)")
1733+
1734+
def _round_trip(uri):
1735+
decoded = md.decodeUri(uri)
1736+
self.assertEqual(decoded, md.decodeUri(md.encodeUri(decoded)))
1737+
1738+
uri = self.dbconn + \
1739+
' sslmode=disable key=\'gid\' srid=3035 table="public"."my_pg_vector" sql='
1740+
decoded = md.decodeUri(uri)
1741+
self.assertEqual(decoded, {
1742+
'key': 'gid',
1743+
'schema': 'public',
1744+
'service': 'qgis_test',
1745+
'srid': '3035',
1746+
'sslmode': QgsDataSourceUri.SslDisable,
1747+
'table': 'my_pg_vector',
1748+
})
1749+
1750+
_round_trip(uri)
1751+
1752+
uri = self.dbconn + \
1753+
' sslmode=prefer key=\'gid\' srid=3035 temporalFieldIndex=2 ' + \
1754+
'authcfg=afebeff username=\'my username\' password=\'my secret password=\' ' + \
1755+
'table="public"."my_pg_vector" (the_geom) sql="a_field" != 1223223'
1756+
1757+
_round_trip(uri)
1758+
1759+
decoded = md.decodeUri(uri)
1760+
self.assertEqual(decoded, {
1761+
'authcfg': 'afebeff',
1762+
'geometrycolumn': 'the_geom',
1763+
'key': 'gid',
1764+
'password': 'my secret password=',
1765+
'schema': 'public',
1766+
'service': 'qgis_test',
1767+
'sql': '"a_field" != 1223223',
1768+
'srid': '3035',
1769+
'sslmode': QgsDataSourceUri.SslPrefer,
1770+
'table': 'my_pg_vector',
1771+
'username': 'my username',
1772+
})
17361773

17371774

17381775
class TestPyQgsPostgresProviderCompoundKey(unittest.TestCase, ProviderTestCase):

‎tests/src/python/test_provider_postgresraster.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
QgsRaster,
3535
QgsProviderRegistry,
3636
QgsRasterBandStats,
37+
QgsDataSourceUri,
3738
)
3839
from qgis.testing import start_app, unittest
3940
from utilities import unitTestDataPath, compareWkt
@@ -365,6 +366,54 @@ def _test_block(rl, expected_block, expected_single):
365366

366367
_test_block(rl, [136, 142, 161, 169], 169)
367368

369+
def testMetadataEncodeDecode(self):
370+
"""Round trip tests on URIs"""
371+
372+
def _round_trip(uri):
373+
decoded = md.decodeUri(uri)
374+
self.assertEqual(decoded, md.decodeUri(md.encodeUri(decoded)))
375+
376+
uri = self.dbconn + \
377+
' sslmode=disable key=\'rid\' srid=3035 table="public"."raster_tiled_3035" sql='
378+
md = QgsProviderRegistry.instance().providerMetadata('postgresraster')
379+
decoded = md.decodeUri(uri)
380+
self.assertEqual(decoded, {
381+
'key': 'rid',
382+
'schema': 'public',
383+
'service': 'qgis_test',
384+
'srid': '3035',
385+
'sslmode': QgsDataSourceUri.SslDisable,
386+
'table': 'raster_tiled_3035',
387+
})
388+
389+
_round_trip(uri)
390+
391+
uri = self.dbconn + \
392+
' sslmode=prefer key=\'rid\' srid=3035 temporalFieldIndex=2 temporalDefaultTime=2020-03-02 ' + \
393+
'authcfg=afebeff username=\'my username\' password=\'my secret password=\' ' + \
394+
'enableTime=true table="public"."raster_tiled_3035" (rast) sql="a_field" != 1223223'
395+
396+
_round_trip(uri)
397+
398+
decoded = md.decodeUri(uri)
399+
self.assertEqual(decoded, {
400+
'authcfg': 'afebeff',
401+
'enableTime': 'true',
402+
'geometrycolumn': 'rast',
403+
'key': 'rid',
404+
'password': 'my secret password=',
405+
'schema': 'public',
406+
'service': 'qgis_test',
407+
'sql': '"a_field" != 1223223',
408+
'srid': '3035',
409+
'sslmode': QgsDataSourceUri.SslPrefer,
410+
'table': 'raster_tiled_3035',
411+
'temporalDefaultTime':
412+
'2020-03-02',
413+
'temporalFieldIndex': '2',
414+
'username': 'my username',
415+
})
416+
368417

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

0 commit comments

Comments
 (0)
Please sign in to comment.