Skip to content

Commit 2a7ccca

Browse files
committedJul 13, 2015
Merge pull request #2197 from manisandro/dropconnections
Add QgsConnectionPool::dropConnections, delete connection groups when pool is destroyed
2 parents 48e4fb8 + 42137e4 commit 2a7ccca

File tree

5 files changed

+55
-1
lines changed

5 files changed

+55
-1
lines changed
 

‎src/core/qgsconnectionpool.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,17 @@ class QgsConnectionPool
228228

229229
typedef QMap<QString, T_Group*> T_Groups;
230230

231+
virtual ~QgsConnectionPool()
232+
{
233+
mMutex.lock();
234+
foreach ( T_Group* group, mGroups )
235+
{
236+
delete group;
237+
}
238+
mGroups.clear();
239+
mMutex.unlock();
240+
}
241+
231242
//! Try to acquire a connection: if no connections are available, the thread will get blocked.
232243
//! @return initialized connection or null on error
233244
T acquireConnection( const QString& connInfo )

‎src/providers/ogr/qgsogrconnpool.h

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,13 @@ class QgsOgrConnPoolGroup : public QObject, public QgsConnectionPoolGroup<QgsOgr
6161
Q_OBJECT
6262

6363
public:
64-
QgsOgrConnPoolGroup( QString name ) : QgsConnectionPoolGroup<QgsOgrConn*>( name ) { initTimer( this ); }
64+
QgsOgrConnPoolGroup( QString name ) : QgsConnectionPoolGroup<QgsOgrConn*>( name ), mRefCount( 0 ) { initTimer( this ); }
65+
void ref() { ++mRefCount; }
66+
bool unref()
67+
{
68+
Q_ASSERT( mRefCount > 0 );
69+
return --mRefCount == 0;
70+
}
6571

6672
protected slots:
6773
void handleConnectionExpired() { onConnectionExpired(); }
@@ -71,6 +77,9 @@ class QgsOgrConnPoolGroup : public QObject, public QgsConnectionPoolGroup<QgsOgr
7177
protected:
7278
Q_DISABLE_COPY( QgsOgrConnPoolGroup )
7379

80+
private:
81+
int mRefCount;
82+
7483
};
7584

7685
/** Ogr connection pool - singleton */
@@ -79,6 +88,29 @@ class QgsOgrConnPool : public QgsConnectionPool<QgsOgrConn*, QgsOgrConnPoolGroup
7988
public:
8089
static QgsOgrConnPool* instance();
8190

91+
void ref( const QString& connInfo )
92+
{
93+
mMutex.lock();
94+
T_Groups::iterator it = mGroups.find( connInfo );
95+
if ( it == mGroups.end() )
96+
it = mGroups.insert( connInfo, new QgsOgrConnPoolGroup( connInfo ) );
97+
it.value()->ref();
98+
mMutex.unlock();
99+
}
100+
101+
void unref( const QString& connInfo )
102+
{
103+
mMutex.lock();
104+
T_Groups::iterator it = mGroups.find( connInfo );
105+
Q_ASSERT( it != mGroups.end() );
106+
if ( it.value()->unref() )
107+
{
108+
delete it.value();
109+
mGroups.erase( it );
110+
}
111+
mMutex.unlock();
112+
}
113+
82114
protected:
83115
Q_DISABLE_COPY( QgsOgrConnPool )
84116

‎src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,12 @@ QgsOgrFeatureSource::QgsOgrFeatureSource( const QgsOgrProvider* p )
342342
mFields = p->mAttributeFields;
343343
mDriverName = p->ogrDriverName;
344344
mOgrGeometryTypeFilter = wkbFlatten( p->mOgrGeometryTypeFilter );
345+
QgsOgrConnPool::instance()->ref( mFilePath );
346+
}
347+
348+
QgsOgrFeatureSource::~QgsOgrFeatureSource()
349+
{
350+
QgsOgrConnPool::instance()->unref( mFilePath );
345351
}
346352

347353
QgsFeatureIterator QgsOgrFeatureSource::getFeatures( const QgsFeatureRequest& request )

‎src/providers/ogr/qgsogrfeatureiterator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class QgsOgrFeatureSource : public QgsAbstractFeatureSource
2828
{
2929
public:
3030
QgsOgrFeatureSource( const QgsOgrProvider* p );
31+
~QgsOgrFeatureSource();
3132

3233
virtual QgsFeatureIterator getFeatures( const QgsFeatureRequest& request ) override;
3334

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ QgsOgrProvider::QgsOgrProvider( QString const & uri )
450450
mNativeTypes
451451
<< QgsVectorDataProvider::NativeType( tr( "Date & Time" ), "datetime", QVariant::DateTime );
452452
}
453+
454+
QgsOgrConnPool::instance()->ref( mFilePath );
453455
}
454456

455457
QgsOgrProvider::~QgsOgrProvider()
@@ -470,6 +472,8 @@ QgsOgrProvider::~QgsOgrProvider()
470472
free( extent_ );
471473
extent_ = 0;
472474
}
475+
476+
QgsOgrConnPool::instance()->unref( mFilePath );
473477
}
474478

475479
QgsAbstractFeatureSource* QgsOgrProvider::featureSource() const

0 commit comments

Comments
 (0)
Please sign in to comment.