1 /***************************************************************************
2                              qgsprovidersublayertask.cpp
3                              ----------------------
4     begin                : June 2021
5     copyright            : (C) 2021 by Nyall Dawson
6     email                : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "qgsprovidersublayertask.h"
19 #include "qgsfeedback.h"
20 #include "qgsproviderregistry.h"
21 #include "qgsprovidersublayerdetails.h"
22 #include "qgsreadwritelocker.h"
23 
QgsProviderSublayerTask(const QString & uri,bool includeSystemTables)24 QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri, bool includeSystemTables )
25   : QgsTask( tr( "Retrieving layers" ), QgsTask::CanCancel | QgsTask::CancelWithoutPrompt )
26   , mUri( uri )
27   , mIncludeSystemTables( includeSystemTables )
28 {
29 }
30 
results() const31 QList<QgsProviderSublayerDetails> QgsProviderSublayerTask::results() const
32 {
33   const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Read );
34   return mResults;
35 }
36 
37 QgsProviderSublayerTask::~QgsProviderSublayerTask() = default;
38 
run()39 bool QgsProviderSublayerTask::run()
40 {
41   mFeedback = std::make_unique< QgsFeedback >();
42 
43   Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlag::ResolveGeometryType | Qgis::SublayerQueryFlag::CountFeatures;
44   if ( mIncludeSystemTables )
45     flags |= Qgis::SublayerQueryFlag::IncludeSystemTables;
46 
47   const QList<QgsProviderSublayerDetails> res = QgsProviderRegistry::instance()->querySublayers( mUri, flags, mFeedback.get() );
48 
49   const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Write );
50   mResults = res;
51 
52   return true;
53 }
54 
cancel()55 void QgsProviderSublayerTask::cancel()
56 {
57   if ( mFeedback )
58     mFeedback->cancel();
59 
60   QgsTask::cancel();
61 }
62