Skip to content

Commit 6392fa9

Browse files
committed
mssql provider: cleanup driver and service usage and copy password in feature iterator (fixes #10428)
1 parent 85ce676 commit 6392fa9

7 files changed

+36
-103
lines changed

src/providers/mssql/qgsmssqldataitems.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ QVector<QgsDataItem*> QgsMssqlConnectionItem::createChildren()
100100
QVector<QgsDataItem*> children;
101101

102102
readConnectionSettings();
103-
QSqlDatabase db = QgsMssqlProvider::GetDatabase( mService,
104-
mHost, mDatabase, mUsername, mPassword );
103+
104+
QSqlDatabase db = QgsMssqlProvider::GetDatabase( mService, mHost, mDatabase, mUsername, mPassword );
105105

106106
if ( !QgsMssqlProvider::OpenDatabase( db ) )
107107
{

src/providers/mssql/qgsmssqlfeatureiterator.cpp

+5-76
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ QgsMssqlFeatureIterator::QgsMssqlFeatureIterator( QgsMssqlFeatureSource* source,
3535
BuildStatement( request );
3636

3737
// connect to the database
38-
mDatabase = GetDatabase( mSource->mDriver, mSource->mHost, mSource->mDatabaseName, mSource->mUserName, mSource->mPassword );
38+
mDatabase = QgsMssqlProvider::GetDatabase( mSource->mService, mSource->mHost, mSource->mDatabaseName, mSource->mUserName, mSource->mPassword );
3939

4040
if ( !mDatabase.open() )
4141
{
@@ -63,7 +63,7 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
6363
// build sql statement
6464
mStatement = QString( "SELECT " );
6565

66-
mStatement += QString("[%1]").arg( mSource->mFidColName );
66+
mStatement += QString( "[%1]" ).arg( mSource->mFidColName );
6767
mFidCol = mSource->mFields.indexFromName( mSource->mFidColName );
6868
mAttributesToFetch.append( mFidCol );
6969

@@ -74,15 +74,15 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
7474
if ( mSource->mFidColName == fieldname )
7575
continue;
7676

77-
mStatement += QString(",[%1]").arg( fieldname );
77+
mStatement += QString( ",[%1]" ).arg( fieldname );
7878

7979
mAttributesToFetch.append( i );
8080
}
8181

8282
// get geometry col
8383
if ( !( request.flags() & QgsFeatureRequest::NoGeometry ) && mSource->isSpatial() )
8484
{
85-
mStatement += QString(",[%1]").arg( mSource->mGeometryColName );
85+
mStatement += QString( ",[%1]" ).arg( mSource->mGeometryColName );
8686
}
8787

8888
mStatement += QString( "FROM [%1].[%2]" ).arg( mSource->mSchemaName, mSource->mTableName );
@@ -235,78 +235,6 @@ bool QgsMssqlFeatureIterator::close()
235235
return true;
236236
}
237237

238-
QSqlDatabase QgsMssqlFeatureIterator::GetDatabase( QString driver, QString host, QString database, QString username, QString password )
239-
{
240-
QSqlDatabase db;
241-
QString connectionName;
242-
243-
// create a separate database connection for each feature source
244-
QgsDebugMsg( "Creating a separate database connection" );
245-
QString id;
246-
247-
// QString::sprintf adds 0x prefix
248-
id.sprintf( "%p", this );
249-
250-
if ( driver.isEmpty() )
251-
{
252-
if ( host.isEmpty() )
253-
{
254-
QgsDebugMsg( "QgsMssqlProvider host name not specified" );
255-
return db;
256-
}
257-
258-
if ( database.isEmpty() )
259-
{
260-
QgsDebugMsg( "QgsMssqlProvider database name not specified" );
261-
return db;
262-
}
263-
connectionName = host + "." + database + "." + id;
264-
}
265-
else
266-
connectionName = driver;
267-
268-
if ( !QSqlDatabase::contains( connectionName ) )
269-
db = QSqlDatabase::addDatabase( "QODBC", connectionName );
270-
else
271-
db = QSqlDatabase::database( connectionName );
272-
273-
db.setHostName( host );
274-
QString connectionString = "";
275-
if ( !driver.isEmpty() )
276-
{
277-
// driver was specified explicitly
278-
connectionString = driver;
279-
}
280-
else
281-
{
282-
#ifdef WIN32
283-
connectionString = "driver={SQL Server}";
284-
#else
285-
connectionString = "driver={FreeTDS};port=1433";
286-
#endif
287-
}
288-
289-
if ( !host.isEmpty() )
290-
connectionString += ";server=" + host;
291-
292-
if ( !database.isEmpty() )
293-
connectionString += ";database=" + database;
294-
295-
if ( password.isEmpty() )
296-
connectionString += ";trusted_connection=yes";
297-
else
298-
connectionString += ";uid=" + username + ";pwd=" + password;
299-
300-
if ( !username.isEmpty() )
301-
db.setUserName( username );
302-
303-
if ( !password.isEmpty() )
304-
db.setPassword( password );
305-
306-
db.setDatabaseName( connectionString );
307-
return db;
308-
}
309-
310238
///////////////
311239

312240
QgsMssqlFeatureSource::QgsMssqlFeatureSource( const QgsMssqlProvider* p )
@@ -317,6 +245,7 @@ QgsMssqlFeatureSource::QgsMssqlFeatureSource( const QgsMssqlProvider* p )
317245
, mSchemaName( p->mSchemaName )
318246
, mTableName( p->mTableName )
319247
, mUserName( p->mUserName )
248+
, mPassword( p->mPassword )
320249
, mService( p->mService )
321250
, mDatabaseName( p->mDatabaseName )
322251
, mHost( p->mHost )

src/providers/mssql/qgsmssqlfeatureiterator.h

-4
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ class QgsMssqlFeatureSource : public QgsAbstractFeatureSource
5555

5656
// server access
5757
QString mService;
58-
QString mDriver;
5958
QString mDatabaseName;
6059
QString mHost;
6160

@@ -82,11 +81,8 @@ class QgsMssqlFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsM
8281
virtual bool close();
8382

8483
protected:
85-
8684
void BuildStatement( const QgsFeatureRequest& request );
8785

88-
QSqlDatabase GetDatabase( QString driver, QString host, QString database, QString username, QString password );
89-
9086
private:
9187
//! fetch next feature, return true on success
9288
virtual bool fetchFeature( QgsFeature& feature );

src/providers/mssql/qgsmssqlnewconnection.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,10 @@ void QgsMssqlNewConnection::testConnection()
173173
}
174174

175175
QSqlDatabase db = QgsMssqlProvider::GetDatabase( txtService->text().trimmed(),
176-
txtHost->text().trimmed(), txtDatabase->text().trimmed(),
177-
txtUsername->text().trimmed(), txtPassword->text().trimmed() );
176+
txtHost->text().trimmed(),
177+
txtDatabase->text().trimmed(),
178+
txtUsername->text().trimmed(),
179+
txtPassword->text().trimmed() );
178180

179181
if ( db.isOpen() )
180182
db.close();

src/providers/mssql/qgsmssqlprovider.cpp

+12-14
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151

5252
static const QString TEXT_PROVIDER_KEY = "mssql";
5353
static const QString TEXT_PROVIDER_DESCRIPTION = "MSSQL spatial data provider";
54+
int QgsMssqlProvider::sConnectionId = 0;
5455

5556
QgsMssqlProvider::QgsMssqlProvider( QString uri )
5657
: QgsVectorDataProvider( uri )
@@ -81,7 +82,7 @@ QgsMssqlProvider::QgsMssqlProvider( QString uri )
8182

8283
mSqlWhereClause = anUri.sql();
8384

84-
mDatabase = QgsMssqlProvider::GetDatabase( mDriver, mHost, mDatabaseName, mUserName, mPassword );
85+
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
8586

8687
if ( !OpenDatabase( mDatabase ) )
8788
{
@@ -199,31 +200,29 @@ bool QgsMssqlProvider::OpenDatabase( QSqlDatabase db )
199200
return true;
200201
}
201202

202-
QSqlDatabase QgsMssqlProvider::GetDatabase( QString driver, QString host, QString database, QString username, QString password )
203+
QSqlDatabase QgsMssqlProvider::GetDatabase( QString service, QString host, QString database, QString username, QString password )
203204
{
204205
QSqlDatabase db;
205206
QString connectionName;
206207

207208
// create a separate database connection for each feature source
208209
QgsDebugMsg( "Creating a separate database connection" );
209210

210-
if ( driver.isEmpty() )
211+
if ( service.isEmpty() )
211212
{
212-
if ( host.isEmpty() )
213-
{
214-
QgsDebugMsg( "QgsMssqlProvider host name not specified" );
215-
return db;
216-
}
213+
if ( !host.isEmpty() )
214+
connectionName = host + ".";
217215

218216
if ( database.isEmpty() )
219217
{
220218
QgsDebugMsg( "QgsMssqlProvider database name not specified" );
221219
return db;
222220
}
223-
connectionName = host + "." + database;
221+
222+
connectionName += QString( "%1.%2" ).arg( database ).arg( sConnectionId++ );
224223
}
225224
else
226-
connectionName = driver;
225+
connectionName = service;
227226

228227
if ( !QSqlDatabase::contains( connectionName ) )
229228
db = QSqlDatabase::addDatabase( "QODBC", connectionName );
@@ -232,10 +231,10 @@ QSqlDatabase QgsMssqlProvider::GetDatabase( QString driver, QString host, QStrin
232231

233232
db.setHostName( host );
234233
QString connectionString = "";
235-
if ( !driver.isEmpty() )
234+
if ( !service.isEmpty() )
236235
{
237236
// driver was specified explicitly
238-
connectionString = driver;
237+
connectionString = service;
239238
}
240239
else
241240
{
@@ -1505,8 +1504,7 @@ QgsVectorLayerImport::ImportError QgsMssqlProvider::createEmptyLayer(
15051504
QgsDataSourceURI dsUri( uri );
15061505

15071506
// connect to database
1508-
QSqlDatabase db = QgsMssqlProvider::GetDatabase( dsUri.service(),
1509-
dsUri.host(), dsUri.database(), dsUri.username(), dsUri.password() );
1507+
QSqlDatabase db = QgsMssqlProvider::GetDatabase( dsUri.service(), dsUri.host(), dsUri.database(), dsUri.username(), dsUri.password() );
15101508

15111509
if ( !QgsMssqlProvider::OpenDatabase( db ) )
15121510
{

src/providers/mssql/qgsmssqlprovider.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class QgsMssqlProvider : public QgsVectorDataProvider
5454

5555
virtual ~QgsMssqlProvider();
5656

57-
static QSqlDatabase GetDatabase( QString driver, QString host, QString database, QString username, QString password );
57+
static QSqlDatabase GetDatabase( QString service, QString host, QString database, QString username, QString password );
5858

5959
virtual QgsAbstractFeatureSource* featureSource() const;
6060

@@ -300,7 +300,6 @@ class QgsMssqlProvider : public QgsVectorDataProvider
300300

301301
// server access
302302
QString mService;
303-
QString mDriver;
304303
QString mDatabaseName;
305304
QString mHost;
306305

@@ -320,6 +319,8 @@ class QgsMssqlProvider : public QgsVectorDataProvider
320319
static QGis::WkbType getWkbType( QString geometryType, int dim );
321320

322321
friend class QgsMssqlFeatureSource;
322+
323+
static int sConnectionId;
323324
};
324325

325326
#endif // QGSMSSQLPROVIDER_H

src/providers/mssql/qgsmssqlsourceselect.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ void QgsMssqlSourceSelect::populateConnectionList()
429429
// Slot for performing action when the Add button is clicked
430430
void QgsMssqlSourceSelect::addTables()
431431
{
432+
QgsDebugMsg( QString( "mConnInfo:%1" ).arg( mConnInfo ) );
432433
mSelectedTables.clear();
433434

434435
foreach ( QModelIndex idx, mTablesTreeView->selectionModel()->selection().indexes() )
@@ -494,12 +495,18 @@ void QgsMssqlSourceSelect::on_btnConnect_clicked()
494495

495496
bool estimateMetadata = settings.value( key + "/estimatedMetadata", true ).toBool();
496497

497-
mConnInfo = "dbname='" + database + "' host=" + host + " user='" + username + "' password='" + password + "'";
498+
mConnInfo = "dbname='" + database + "'";
499+
if ( !host.isEmpty() )
500+
mConnInfo += " host=" + host + "'";
501+
if ( !username.isEmpty() )
502+
mConnInfo += " user='" + username + "'";
503+
if ( !password.isEmpty() )
504+
mConnInfo += " password='" + password + "'";
498505
if ( !service.isEmpty() )
499506
mConnInfo += " service='" + service + "'";
500507

501-
QSqlDatabase db = QgsMssqlProvider::GetDatabase( service,
502-
host, database, username, password );
508+
QgsDebugMsg( "GetDatabase" );
509+
QSqlDatabase db = QgsMssqlProvider::GetDatabase( service, host, database, username, password );
503510

504511
if ( !QgsMssqlProvider::OpenDatabase( db ) )
505512
{

0 commit comments

Comments
 (0)