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;
110 if ( !
sem.tryAcquire( requiredFreeConnectionCount, timeout ) )
122 sem.acquire( requiredFreeConnectionCount );
124 sem.release( requiredFreeConnectionCount - 1 );
130 if ( !
conns.isEmpty() )
134 if ( !qgsConnectionPool_ConnectionIsValid( i.
c ) )
137 qgsConnectionPool_ConnectionDestroy( i.
c );
139 qgsConnectionPool_ConnectionCreate(
connInfo, i.
c );
144 if (
conns.isEmpty() )
147 QMetaObject::invokeMethod(
expirationTimer->parent(),
"stopExpirationTimer" );
159 qgsConnectionPool_ConnectionCreate(
connInfo,
c );
169 QgsDebugMsgLevel( u
"Acquired connection with name: %1"_s.arg( qgsConnectionPool_ConnectionToName(
c ) ), 2 );
180 if ( !qgsConnectionPool_ConnectionIsValid( conn ) )
183 qgsConnectionPool_ConnectionDestroy( conn );
195 QMetaObject::invokeMethod(
expirationTimer->parent(),
"startExpirationTimer" );
208 for (
const Item &i : std::as_const(
conns ) )
210 qgsConnectionPool_ConnectionDestroy( i.c );
214 qgsConnectionPool_InvalidateConnection(
c );
229 QObject::connect(
expirationTimer, &QTimer::timeout, parent, &U::handleConnectionExpired );
233 parent->moveToThread( qApp->thread() );
240 QTime now = QTime::currentTime();
244 for (
int i = 0; i <
conns.count(); ++i )
247 toDelete.append( i );
251 for (
int j = toDelete.count() - 1; j >= 0; --j )
253 int index = toDelete[j];
254 qgsConnectionPool_ConnectionDestroy(
conns[index].
c );
255 conns.remove( index );
258 if (
conns.isEmpty() )
300 for (
auto it =
mGroups.constBegin(); it !=
mGroups.constEnd(); ++it )
302 QgsDebugMsgLevel( u
"Destroying connection pool group with key %1"_s.arg( it.key() ), 2 );
322 QgsDebugMsgLevel( u
"Trying to acquire connection for %1"_s.arg( connInfo ), 2 );
324 typename T_Groups::iterator it =
mGroups.find( connInfo );
328 it =
mGroups.insert( connInfo,
new T_Group( connInfo ) );
334 T_Group *group = *it;
342 while ( !feedback->isCanceled() )
344 if ( T conn = group->acquire( 300, requestMayBeNested ) )
347 if ( timeout > 0 && timer.elapsed() >= timeout )
354 return group->acquire( timeout, requestMayBeNested );
362 const QString groupName = qgsConnectionPool_ConnectionToName( conn );
364 typename T_Groups::iterator it =
mGroups.find( groupName );
365 Q_ASSERT( it !=
mGroups.end() );
366 T_Group *group = *it;
370 group->release( conn );
382 QgsDebugMsgLevel( u
"Invalidating connections for %1"_s.arg( connInfo ), 2 );
385 auto it =
mGroups.constFind( connInfo );
386 if ( it !=
mGroups.constEnd() )
389 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)