16#ifndef QGSCONNECTIONPOOL_H
17#define QGSCONNECTIONPOOL_H
25#include <QCoreApplication>
26#include <QElapsedTimer>
38using namespace Qt::StringLiterals;
40#define CONN_POOL_EXPIRATION_TIME 60
41#define CONN_POOL_SPARE_CONNECTIONS 2
87 for (
const Item &item : std::as_const(
conns ) )
89 qgsConnectionPool_ConnectionDestroy( item.c );
103 T
acquire(
int timeout,
bool requestMayBeNested )
106 const int requiredFreeConnectionCount = requestMayBeNested ? 1 : 3;
108 if ( !
sem.tryAcquire( requiredFreeConnectionCount, QDeadlineTimer( timeout ) ) )
114 sem.release( requiredFreeConnectionCount - 1 );
120 if ( !
conns.isEmpty() )
124 if ( !qgsConnectionPool_ConnectionIsValid( i.
c ) )
127 qgsConnectionPool_ConnectionDestroy( i.
c );
129 qgsConnectionPool_ConnectionCreate(
connInfo, i.
c );
134 if (
conns.isEmpty() )
137 QMetaObject::invokeMethod(
expirationTimer->parent(),
"stopExpirationTimer" );
149 qgsConnectionPool_ConnectionCreate(
connInfo,
c );
159 QgsDebugMsgLevel( u
"Acquired connection with name: %1"_s.arg( qgsConnectionPool_ConnectionToName(
c ) ), 2 );
170 if ( !qgsConnectionPool_ConnectionIsValid( conn ) )
173 qgsConnectionPool_ConnectionDestroy( conn );
185 QMetaObject::invokeMethod(
expirationTimer->parent(),
"startExpirationTimer" );
198 for (
const Item &i : std::as_const(
conns ) )
200 qgsConnectionPool_ConnectionDestroy( i.c );
204 qgsConnectionPool_InvalidateConnection(
c );
219 QObject::connect(
expirationTimer, &QTimer::timeout, parent, &U::handleConnectionExpired );
223 parent->moveToThread( qApp->thread() );
230 QTime now = QTime::currentTime();
234 for (
int i = 0; i <
conns.count(); ++i )
237 toDelete.append( i );
241 for (
int j = toDelete.count() - 1; j >= 0; --j )
243 int index = toDelete[j];
244 qgsConnectionPool_ConnectionDestroy(
conns[index].
c );
245 conns.remove( index );
248 if (
conns.isEmpty() )
290 for (
auto it =
mGroups.constBegin(); it !=
mGroups.constEnd(); ++it )
292 QgsDebugMsgLevel( u
"Destroying connection pool group with key %1"_s.arg( it.key() ), 2 );
312 QgsDebugMsgLevel( u
"Trying to acquire connection for %1"_s.arg( connInfo ), 2 );
314 typename T_Groups::iterator it =
mGroups.find( connInfo );
318 it =
mGroups.insert( connInfo,
new T_Group( connInfo ) );
324 T_Group *group = *it;
332 while ( !feedback->isCanceled() )
334 if ( T conn = group->acquire( 300, requestMayBeNested ) )
337 if ( timeout > 0 && timer.elapsed() >= timeout )
344 return group->acquire( timeout, requestMayBeNested );
352 const QString groupName = qgsConnectionPool_ConnectionToName( conn );
354 typename T_Groups::iterator it =
mGroups.find( groupName );
355 Q_ASSERT( it !=
mGroups.end() );
356 T_Group *group = *it;
360 group->release( conn );
372 QgsDebugMsgLevel( u
"Invalidating connections for %1"_s.arg( connInfo ), 2 );
375 auto it =
mGroups.constFind( connInfo );
376 if ( it !=
mGroups.constEnd() )
379 it.value()->invalidateConnections();
Extends QApplication to provide access to QGIS specific resources such as theme paths,...
void invalidateConnections()
QgsConnectionPoolGroup(const QgsConnectionPoolGroup &other)=delete
T acquire(int timeout, bool requestMayBeNested)
Try to acquire a connection for a maximum of timeout milliseconds.
void initTimer(U *parent)
Initializes the connection timeout handling.
QgsConnectionPoolGroup(const QString &ci)
Constructor for QgsConnectionPoolGroup, with the specified connection info.
QgsConnectionPoolGroup & operator=(const QgsConnectionPoolGroup &other)=delete
~QgsConnectionPoolGroup()
void onConnectionExpired()
Template class responsible for keeping a pool of open connections.
QMap< QString, T_Group * > T_Groups
void invalidateConnections(const QString &connInfo)
Invalidates all connections to the specified resource.
virtual ~QgsConnectionPool()
T acquireConnection(const QString &connInfo, int timeout=-1, bool requestMayBeNested=false, QgsFeedback *feedback=nullptr)
Try to acquire a connection for a maximum of timeout milliseconds.
void releaseConnection(T conn)
Release an existing connection so it will get back into the pool and can be reused.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define CONN_POOL_SPARE_CONNECTIONS
#define CONN_POOL_EXPIRATION_TIME
#define QgsDebugMsgLevel(str, level)