Skip to content

Commit 84eed01

Browse files
committedNov 21, 2018
[ogr] Use table name as base layer name when adding ogr database layers
Fixes #20579 - Improve layer name rendering for MySQL connections
1 parent fee3935 commit 84eed01

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4587,15 +4587,15 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
45874587
Q_FOREACH ( QString src, layerQStringList )
45884588
{
45894589
src = src.trimmed();
4590-
QString base;
4590+
QString baseName;
45914591
if ( dataSourceType == QLatin1String( "file" ) )
45924592
{
45934593
QString srcWithoutLayername( src );
45944594
int posPipe = srcWithoutLayername.indexOf( '|' );
45954595
if ( posPipe >= 0 )
45964596
srcWithoutLayername.resize( posPipe );
45974597
QFileInfo fi( srcWithoutLayername );
4598-
base = fi.completeBaseName();
4598+
baseName = fi.completeBaseName();
45994599

46004600
// if needed prompt for zipitem layers
46014601
QString vsiPrefix = QgsZipItem::vsiPrefix( src );
@@ -4608,25 +4608,31 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
46084608
}
46094609
else if ( dataSourceType == QLatin1String( "database" ) )
46104610
{
4611-
base = src;
4611+
// Try to extract the database name and use it as base name
4612+
// sublayers names (if any) will be appended to the layer name
4613+
auto parts( QgsProviderRegistry::instance()->decodeUri( QStringLiteral( "ogr" ), src ) );
4614+
if ( ! parts.value( QStringLiteral( "layerName" ) ).isNull() )
4615+
baseName = parts.value( QStringLiteral( "layerName" ) ).toString();
4616+
else
4617+
baseName = src;
46124618
}
46134619
else //directory //protocol
46144620
{
46154621
QFileInfo fi( src );
4616-
base = fi.completeBaseName();
4622+
baseName = fi.completeBaseName();
46174623
}
46184624
if ( settings.value( QStringLiteral( "qgis/formatLayerName" ), false ).toBool() )
46194625
{
4620-
base = QgsMapLayer::formatLayerName( base );
4626+
baseName = QgsMapLayer::formatLayerName( baseName );
46214627
}
46224628

4623-
QgsDebugMsg( "completeBaseName: " + base );
4629+
QgsDebugMsgLevel( "completeBaseName: " + baseName, 2 );
46244630

46254631
// create the layer
46264632

46274633
QgsVectorLayer::LayerOptions options;
46284634
options.loadDefaultStyle = false;
4629-
QgsVectorLayer *layer = new QgsVectorLayer( src, base, QStringLiteral( "ogr" ), options );
4635+
QgsVectorLayer *layer = new QgsVectorLayer( src, baseName, QStringLiteral( "ogr" ), options );
46304636
Q_CHECK_PTR( layer );
46314637

46324638
if ( ! layer )

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3098,6 +3098,28 @@ QGISEXTERN QVariantMap decodeUri( const QString &uri )
30983098
path = path.left( pipeIndex );
30993099
}
31003100

3101+
// Handles DB connections extracting database name if possible
3102+
// Example: MySQL:database_name,host=localhost,port=3306 authcfg='f8wwfx8'
3103+
if ( uri.startsWith( QStringLiteral( "MySQL" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3104+
uri.startsWith( QStringLiteral( "PostgreSQL" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3105+
uri.startsWith( QStringLiteral( "MSSQL" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3106+
uri.startsWith( QStringLiteral( "ODBC" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3107+
uri.startsWith( QStringLiteral( "PGeo" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3108+
uri.startsWith( QStringLiteral( "SDE" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3109+
uri.startsWith( QStringLiteral( "OGDI" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3110+
uri.startsWith( QStringLiteral( "Ingres" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3111+
uri.startsWith( QStringLiteral( "IDB" ), Qt::CaseSensitivity::CaseInsensitive ) ||
3112+
uri.startsWith( QStringLiteral( "OCI" ), Qt::CaseSensitivity::CaseInsensitive ) )
3113+
{
3114+
auto parts( uri.split( ':' ) );
3115+
if ( parts.count( ) > 1 )
3116+
{
3117+
auto dataParts( parts.at( 1 ).split( ',' ) );
3118+
if ( dataParts.count() > 0 )
3119+
layerName = dataParts.at( 0 );
3120+
}
3121+
}
3122+
31013123
QString vsiPrefix = qgsVsiPrefix( path );
31023124
if ( !vsiPrefix.isEmpty() )
31033125
path = path.mid( vsiPrefix.count() );

‎tests/src/providers/testqgsogrprovider.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class TestQgsOgrProvider : public QObject
4545
void cleanup() {}// will be called after every testfunction.
4646

4747
void setupProxy();
48+
void decodeUri();
4849

4950
private:
5051
QString mTestDataDir;
@@ -119,6 +120,14 @@ void TestQgsOgrProvider::setupProxy()
119120

120121
}
121122

123+
void TestQgsOgrProvider::decodeUri()
124+
{
125+
auto parts( QgsProviderRegistry::instance()->decodeUri( QStringLiteral( "ogr" ), QStringLiteral( "MySQL:database_name,host=localhost,port=3306 authcfg='f8wwfx8'" ) ) );
126+
QCOMPARE( parts.value( QStringLiteral( "layerName" ) ).toString(), QString( "database_name" ) );
127+
parts = QgsProviderRegistry::instance()->decodeUri( QStringLiteral( "ogr" ), QStringLiteral( "MYSQL:westholland,user=root,password=psv9570,port=3306,tables=bedrijven" ) );
128+
QCOMPARE( parts.value( QStringLiteral( "layerName" ) ).toString(), QString( "westholland" ) );
129+
}
130+
122131

123132
QGSTEST_MAIN( TestQgsOgrProvider )
124133
#include "testqgsogrprovider.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.