Skip to content

Commit

Permalink
Fix configuration/uri parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
troopa81 authored and nyalldawson committed Jan 29, 2021
1 parent e4b96c6 commit 26cf674
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 62 deletions.
46 changes: 38 additions & 8 deletions src/providers/oracle/qgsoracleproviderconnection.cpp
Expand Up @@ -24,6 +24,7 @@
#include <QSqlRecord>
#include <QSqlField>

// read from QSettings and used in the provider connection
const QStringList CONFIGURATION_PARAMETERS
{
QStringLiteral( "geometryColumnsOnly" ),
Expand All @@ -34,13 +35,18 @@ const QStringList CONFIGURATION_PARAMETERS
QStringLiteral( "savePassword" ),
};

// read from uri and used in the provider connection
const QStringList EXTRA_CONNECTION_PARAMETERS
{
QStringLiteral( "dboptions" ),
QStringLiteral( "dbworkspace" )
};

QgsOracleProviderConnection::QgsOracleProviderConnection( const QString &name )
: QgsAbstractDatabaseProviderConnection( name )
{
mProviderKey = QStringLiteral( "oracle" );
// Remove the sql and table empty parts
const QRegularExpression removePartsRe { R"raw(\s*sql=\s*|\s*table=""\s*)raw" };
setUri( QgsOracleConn::connUri( name ).uri().replace( removePartsRe, QString() ) );
setUri( QgsOracleConn::connUri( name ).uri() );
setDefaultCapabilities();

// load existing configuration
Expand All @@ -62,6 +68,26 @@ QgsOracleProviderConnection::QgsOracleProviderConnection( const QString &uri, co
{
mProviderKey = QStringLiteral( "oracle" );
setDefaultCapabilities();

// Additional connection information
const QgsDataSourceUri inputUri( uri );
QgsDataSourceUri currentUri { QgsDataSourceUri( uri ).connectionInfo( false ) };

if ( inputUri.hasParam( QStringLiteral( "estimatedMetadata" ) ) )
{
currentUri.setUseEstimatedMetadata( inputUri.param( QStringLiteral( "estimatedMetadata" ) ) == QStringLiteral( "true" )
|| inputUri.param( QStringLiteral( "estimatedMetadata" ) ) == '1' );
}

for ( const auto &param : EXTRA_CONNECTION_PARAMETERS )
{
if ( inputUri.hasParam( param ) )
{
currentUri.setParam( param, inputUri.param( param ) );
}
}

setUri( currentUri.uri() );
}

void QgsOracleProviderConnection::setDefaultCapabilities()
Expand Down Expand Up @@ -114,13 +140,17 @@ void QgsOracleProviderConnection::store( const QString &name ) const
settings.setValue( "database", dsUri.database() );
settings.setValue( "username", dsUri.username() );
settings.setValue( "password", dsUri.password() );
settings.setValue( "dbworkspace", dsUri.param( "dbworkspace" ) );
settings.setValue( "estimatedMetadata", dsUri.useEstimatedMetadata() );
settings.setValue( "host", dsUri.host() );
settings.setValue( "includeGeoAttributes", dsUri.param( "includegeoattributes" ) );
settings.setValue( "port", dsUri.port() );
settings.setValue( "schema", dsUri.schema() );
settings.setValue( "dboptions", dsUri.param( "dboptions" ) );
settings.setValue( "estimatedMetadata", dsUri.useEstimatedMetadata() );

for ( const auto &param : EXTRA_CONNECTION_PARAMETERS )
{
if ( dsUri.hasParam( param ) )
{
settings.setValue( param, dsUri.param( param ) );
}
}

// From configuration
for ( const auto &p : CONFIGURATION_PARAMETERS )
Expand Down
84 changes: 30 additions & 54 deletions tests/src/python/test_qgsproviderconnection_oracle.py
Expand Up @@ -128,60 +128,36 @@ def get_tables(schema, configuration, flags=QgsAbstractDatabaseProviderConnectio
self.assertEqual(get_tables('', {"userTablesOnly": False}, QgsAbstractDatabaseProviderConnection.Vector),
['LINE_DATA', 'OTHER_TABLE', 'POINT_DATA', 'POINT_DATA_IDENTITY', 'POLY_DATA', 'SOME_DATA', 'SOME_POLY_DATA'])

# def test_configuration(self):
# """Test storage and retrieval for configuration parameters"""

# uri = 'dbname=\'qgis_test\' service=\'driver={SQL Server};server=localhost;port=1433;database=qgis_test\' user=\'sa\' password=\'<YourStrong!Passw0rd>\' srid=4326 type=Point estimatedMetadata=\'true\' disableInvalidGeometryHandling=\'1\' table="qgis_test"."someData" (geom)'
# md = QgsProviderRegistry.instance().providerMetadata('mssql')
# conn = md.createConnection(uri, {})
# ds_uri = QgsDataSourceUri(conn.uri())
# self.assertEqual(ds_uri.username(), 'sa')
# self.assertEqual(ds_uri.database(), 'qgis_test')
# self.assertEqual(ds_uri.table(), '')
# self.assertEqual(ds_uri.schema(), '')
# self.assertEqual(ds_uri.geometryColumn(), '')
# self.assertTrue(ds_uri.useEstimatedMetadata())
# self.assertEqual(ds_uri.srid(), '')
# self.assertEqual(ds_uri.password(), '<YourStrong!Passw0rd>')
# self.assertEqual(ds_uri.param('disableInvalidGeometryHandling'), '1')

# conn.store('coronavirus')
# conn = md.findConnection('coronavirus', False)
# ds_uri = QgsDataSourceUri(conn.uri())
# self.assertEqual(ds_uri.username(), 'sa')
# self.assertEqual(ds_uri.database(), 'qgis_test')
# self.assertEqual(ds_uri.table(), '')
# self.assertEqual(ds_uri.schema(), '')
# self.assertTrue(ds_uri.useEstimatedMetadata())
# self.assertEqual(ds_uri.geometryColumn(), '')
# self.assertEqual(ds_uri.srid(), '')
# self.assertEqual(ds_uri.password(), '<YourStrong!Passw0rd>')
# self.assertEqual(ds_uri.param('disableInvalidGeometryHandling'), 'true')
# conn.remove('coronavirus')

# def test_mssql_connections_from_uri(self):
# """Create a connection from a layer uri and retrieve it"""

# md = QgsProviderRegistry.instance().providerMetadata('mssql')

# def test_table_uri(self):
# """Create a connection from a layer uri and create a table URI"""

# md = QgsProviderRegistry.instance().providerMetadata('mssql')
# conn = md.createConnection(self.uri, {})
# vl = QgsVectorLayer(conn.tableUri('qgis_test', 'someData'), 'my', 'mssql')
# self.assertTrue(vl.isValid())

# def test_gpkg_fields(self):
# """Test fields"""

# md = QgsProviderRegistry.instance().providerMetadata('mssql')
# conn = md.createConnection(self.uri, {})
# fields = conn.fields('qgis_test', 'someData')
# self.assertEqual(fields.names(), ['pk', 'cnt', 'name', 'name2', 'num_char', 'dt', 'date', 'time'])

# def treat_date_as_string(self):
# return True
def test_configuration(self):
"""Test storage and retrieval for configuration parameters"""

uri = ("authcfg='test_cfg' dbname='qgis_test' username='QGIS' password='qgis' dbworkspace='workspace' "
"estimatedMetadata='true' host='localhost' port='1521' dboptions='test_opts' ")

md = QgsProviderRegistry.instance().providerMetadata('oracle')
conn = md.createConnection(uri, {"saveUsername": True, "savePassword": True})
ds_uri = QgsDataSourceUri(conn.uri())
self.assertEqual(ds_uri.username(), 'QGIS')
self.assertEqual(ds_uri.host(), 'localhost')
self.assertEqual(ds_uri.port(), '1521')
self.assertEqual(ds_uri.database(), 'qgis_test')
self.assertTrue(ds_uri.useEstimatedMetadata())
self.assertEqual(ds_uri.password(), 'qgis')
self.assertEqual(ds_uri.param('dboptions'), 'test_opts')
self.assertEqual(ds_uri.param('dbworkspace'), 'workspace')

conn.store('myconf')
conn = md.findConnection('myconf', False)
ds_uri = QgsDataSourceUri(conn.uri())
self.assertEqual(ds_uri.username(), 'QGIS')
self.assertEqual(ds_uri.host(), 'localhost')
self.assertEqual(ds_uri.port(), '1521')
self.assertEqual(ds_uri.database(), 'qgis_test')
self.assertTrue(ds_uri.useEstimatedMetadata())
self.assertEqual(ds_uri.password(), 'qgis')
self.assertEqual(ds_uri.param('dboptions'), 'test_opts')
self.assertEqual(ds_uri.param('dbworkspace'), 'workspace')
conn.remove('myconf')


if __name__ == '__main__':
Expand Down

0 comments on commit 26cf674

Please sign in to comment.