Skip to content

Commit 7347432

Browse files
committed
[mssql] Respect custom "timeout" parameter in data source URIs
When constructing a URI for a SQL server connection, you can now set a custom timeout for the connection using: ds = QgsDataSourceUri() # set host, etc ... # set connection timeout to 20 seconds ds.setParam('timeout', '20') vl = QgsVectorLayer(ds.uri(), 'my layer', 'mssql')
1 parent cab3c1a commit 7347432

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

src/providers/mssql/qgsmssqldatabase.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ std::shared_ptr<QgsMssqlDatabase> QgsMssqlDatabase::connectDb( const QgsDataSour
8181
if ( existingConnectionIt != sConnections.constEnd() && !existingConnectionIt->expired() )
8282
return existingConnectionIt->lock();
8383

84-
QSqlDatabase db = getDatabase( uri.service(), uri.host(), uri.database(), uri.username(), uri.password(), transaction );
84+
QSqlDatabase db = getDatabase( uri.service(), uri.host(), uri.database(), uri.username(), uri.password(), transaction, uri.hasParam( QStringLiteral( "timeout" ) ) ? uri.param( QStringLiteral( "timeout" ) ).toInt() : 0 );
8585

8686
std::shared_ptr<QgsMssqlDatabase> c( new QgsMssqlDatabase( db, uri, transaction ) );
8787

@@ -417,7 +417,7 @@ bool QgsMssqlDatabase::loadQueryFields( FieldDetails &details, const QString &qu
417417
// -------------------
418418

419419

420-
QSqlDatabase QgsMssqlDatabase::getDatabase( const QString &service, const QString &host, const QString &database, const QString &username, const QString &password, bool transaction )
420+
QSqlDatabase QgsMssqlDatabase::getDatabase( const QString &service, const QString &host, const QString &database, const QString &username, const QString &password, bool transaction, int timeout )
421421
{
422422
QSqlDatabase db;
423423

@@ -430,7 +430,11 @@ QSqlDatabase QgsMssqlDatabase::getDatabase( const QString &service, const QStrin
430430
if ( !QSqlDatabase::contains( threadSafeConnectionName ) )
431431
{
432432
db = QSqlDatabase::addDatabase( QStringLiteral( "QODBC" ), threadSafeConnectionName );
433-
db.setConnectOptions( QStringLiteral( "SQL_ATTR_CONNECTION_POOLING=SQL_CP_ONE_PER_HENV" ) );
433+
QString connectOptions = QStringLiteral( "SQL_ATTR_CONNECTION_POOLING=SQL_CP_ONE_PER_HENV" );
434+
if ( timeout != 0 )
435+
connectOptions += QStringLiteral( ";SQL_ATTR_LOGIN_TIMEOUT=%1;SQL_ATTR_CONNECTION_TIMEOUT=%1" ).arg( timeout );
436+
437+
db.setConnectOptions( connectOptions );
434438

435439
// for background threads, remove database when current thread finishes
436440
if ( QThread::currentThread() != QCoreApplication::instance()->thread() )

src/providers/mssql/qgsmssqldatabase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class QgsMssqlDatabase
124124
* The database may not be open -- openDatabase() should be called to
125125
* ensure that it is ready for use.
126126
*/
127-
static QSqlDatabase getDatabase( const QString &service, const QString &host, const QString &database, const QString &username, const QString &password, bool transaction = false );
127+
static QSqlDatabase getDatabase( const QString &service, const QString &host, const QString &database, const QString &username, const QString &password, bool transaction = false, int timeout = 0 );
128128

129129
static QMap<QString, std::weak_ptr<QgsMssqlDatabase>> sConnections;
130130

0 commit comments

Comments
 (0)