QGIS API Documentation  3.25.0-Master (dec16ba68b)
qgsprovidermetadata.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsprovidermetadata.cpp - Metadata class for
3  describing a data provider.
4  -------------------
5  begin : Sat Jan 10 2004
6  copyright : (C) 2004 by Gary E.Sherman
7  email : sherman at mrcc.com
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 
19 #include "qgsprovidermetadata.h"
20 #include "qgsdataprovider.h"
21 #include "qgsmaplayer.h"
22 #include "qgsexception.h"
25 
27  QString const &description,
28  QString const &library )
29  : mKey( key )
30  , mDescription( description )
31  , mLibrary( library )
32 {}
33 
34 QgsProviderMetadata::QgsProviderMetadata( const QString &key, const QString &description, const CreateDataProviderFunction &createFunc )
35  : mKey( key )
36  , mDescription( description )
37  , mCreateFunction( createFunc )
38 {}
39 
41 {
42  qDeleteAll( mProviderConnections );
43 }
44 
45 QString QgsProviderMetadata::key() const
46 {
47  return mKey;
48 }
49 
51 {
52  return mDescription;
53 }
54 
55 QgsProviderMetadata::ProviderMetadataCapabilities QgsProviderMetadata::capabilities() const
56 {
57  return QgsProviderMetadata::ProviderMetadataCapabilities();
58 }
59 
60 QgsProviderMetadata::ProviderCapabilities QgsProviderMetadata::providerCapabilities() const
61 {
62  return QgsProviderMetadata::ProviderCapabilities();
63 }
64 
66 {
67  return mLibrary;
68 }
69 
71 {
72  return mCreateFunction;
73 }
74 
76 {
77 
78 }
79 
81 {
82 
83 }
84 
86 {
87  return QString();
88 }
89 
90 QList<QgsMeshDriverMetadata> QgsProviderMetadata::meshDriversMetadata()
91 {
92  return QList<QgsMeshDriverMetadata>();
93 }
94 
95 int QgsProviderMetadata::priorityForUri( const QString & ) const
96 {
97  return 0;
98 }
99 
100 QList<QgsMapLayerType> QgsProviderMetadata::validLayerTypesForUri( const QString & ) const
101 {
102  return QList<QgsMapLayerType>();
103 }
104 
105 bool QgsProviderMetadata::uriIsBlocklisted( const QString & ) const
106 {
107  return false;
108 }
109 
110 QStringList QgsProviderMetadata::sidecarFilesForUri( const QString & ) const
111 {
112  return QStringList();
113 }
114 
115 QList<QgsProviderSublayerDetails> QgsProviderMetadata::querySublayers( const QString &, Qgis::SublayerQueryFlags, QgsFeedback * ) const
116 {
117  return QList<QgsProviderSublayerDetails>();
118 }
119 
121  const QgsDataProvider::ProviderOptions &options,
122  QgsDataProvider::ReadFlags flags )
123 {
124  if ( mCreateFunction )
125  {
126  return mCreateFunction( uri, options, flags );
127  }
128  return nullptr;
129 }
130 
131 void QgsProviderMetadata::setBoolParameter( QVariantMap &uri, const QString &parameter, const QVariant &value )
132 {
133  if ( value.toString().compare( QStringLiteral( "yes" ), Qt::CaseInsensitive ) == 0 ||
134  value.toString().compare( QStringLiteral( "1" ), Qt::CaseInsensitive ) == 0 ||
135  value.toString().compare( QStringLiteral( "true" ), Qt::CaseInsensitive ) == 0 )
136  {
137  uri[ parameter ] = true;
138  }
139  else if ( value.toString().compare( QStringLiteral( "no" ), Qt::CaseInsensitive ) == 0 ||
140  value.toString().compare( QStringLiteral( "0" ), Qt::CaseInsensitive ) == 0 ||
141  value.toString().compare( QStringLiteral( "false" ), Qt::CaseInsensitive ) == 0 )
142  {
143  uri[ parameter ] = false;
144  }
145 }
146 
147 bool QgsProviderMetadata::boolParameter( const QVariantMap &uri, const QString &parameter, bool defaultValue )
148 {
149  if ( uri.value( parameter, QString() ).toString().compare( QStringLiteral( "yes" ), Qt::CaseInsensitive ) == 0 ||
150  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "1" ), Qt::CaseInsensitive ) == 0 ||
151  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "true" ), Qt::CaseInsensitive ) == 0 )
152  {
153  return true;
154  }
155  else if ( uri.value( parameter, QString() ).toString().compare( QStringLiteral( "no" ), Qt::CaseInsensitive ) == 0 ||
156  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "0" ), Qt::CaseInsensitive ) == 0 ||
157  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "false" ), Qt::CaseInsensitive ) == 0 )
158  {
159  return false;
160  }
161 
162  return defaultValue;
163 }
164 
165 QVariantMap QgsProviderMetadata::decodeUri( const QString & ) const
166 {
167  return QVariantMap();
168 }
169 
170 QString QgsProviderMetadata::encodeUri( const QVariantMap & ) const
171 {
172  return QString();
173 }
174 
176  const QString &, const QgsFields &,
178  bool, QMap<int, int> &,
179  QString &errorMessage, const QMap<QString, QVariant> * )
180 {
181  errorMessage = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "createEmptyLayer" ) );
182  return Qgis::VectorExportResult::ErrorProviderUnsupportedFeature;
183 }
184 
186  const QString &, const QString &,
187  int, Qgis::DataType, int,
188  int, double *,
190  const QStringList & )
191 {
192  return nullptr;
193 }
194 
196  const QString &,
197  const QString &,
198  const QgsCoordinateReferenceSystem & ) const
199 {
200  return false;
201 }
202 
204  const QString &,
205  const QgsCoordinateReferenceSystem & ) const
206 {
207  return false;
208 }
209 
210 QList<QPair<QString, QString> > QgsProviderMetadata::pyramidResamplingMethods()
211 {
212  return QList<QPair<QString, QString> >();
213 }
214 
215 QList<QgsDataItemProvider *> QgsProviderMetadata::dataItemProviders() const
216 {
217  return QList<QgsDataItemProvider *>();
218 }
219 
220 int QgsProviderMetadata::listStyles( const QString &, QStringList &, QStringList &,
221  QStringList &, QString &errCause )
222 {
223  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "listStyles" ) );
224  return -1;
225 }
226 
227 bool QgsProviderMetadata::styleExists( const QString &, const QString &, QString &errorCause )
228 {
229  errorCause.clear();
230  return false;
231 }
232 
233 QString QgsProviderMetadata::getStyleById( const QString &, const QString &, QString &errCause )
234 {
235  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "getStyleById" ) );
236  return QString();
237 }
238 
239 bool QgsProviderMetadata::deleteStyleById( const QString &, const QString &, QString &errCause )
240 {
241  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "deleteStyleById" ) );
242  return false;
243 }
244 
245 bool QgsProviderMetadata::saveStyle( const QString &, const QString &, const QString &, const QString &,
246  const QString &, const QString &, bool, QString &errCause )
247 {
248  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "saveStyle" ) );
249  return false;
250 }
251 
252 QString QgsProviderMetadata::loadStyle( const QString &, QString &errCause )
253 {
254  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "loadStyle" ) );
255  return QString();
256 }
257 
258 bool QgsProviderMetadata::saveLayerMetadata( const QString &, const QgsLayerMetadata &, QString & )
259 {
260  throw QgsNotSupportedException( QObject::tr( "Provider %1 does not support writing layer metadata" ).arg( key() ) );
261 }
262 
263 bool QgsProviderMetadata::createDb( const QString &, QString &errCause )
264 {
265  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "createDb" ) );
266  return false;
267 }
268 
270 {
271  return nullptr;
272 }
273 
274 QMap<QString, QgsAbstractProviderConnection *> QgsProviderMetadata::connections( bool cached )
275 {
276  Q_UNUSED( cached );
277  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connections" ) ) );
278 }
279 
280 QMap<QString, QgsAbstractDatabaseProviderConnection *> QgsProviderMetadata::dbConnections( bool cached )
281 {
282  return connections<QgsAbstractDatabaseProviderConnection>( cached ) ;
283 }
284 
286 {
287  const QMap<QString, QgsAbstractProviderConnection *> constConns { connections( cached ) };
288  const QStringList constKeys { constConns.keys( ) };
289  for ( const QString &key : constKeys )
290  {
291  if ( key == name )
292  {
293  return constConns.value( key );
294  }
295  }
296  return nullptr;
297 }
298 
300 {
301  Q_UNUSED( name );
302  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connection" ) ) );
303 }
304 
305 
306 QgsAbstractProviderConnection *QgsProviderMetadata::createConnection( const QString &uri, const QVariantMap &configuration )
307 {
308  Q_UNUSED( configuration );
309  Q_UNUSED( uri );
310  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connection" ) ) );
311 }
312 
313 void QgsProviderMetadata::deleteConnection( const QString &name )
314 {
315  Q_UNUSED( name );
316  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "deleteConnection" ) ) );
317 }
318 
319 void QgsProviderMetadata::saveConnection( const QgsAbstractProviderConnection *connection, const QString &name )
320 {
321  Q_UNUSED( connection )
322  Q_UNUSED( name )
323  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "saveConnection" ) ) );
324 }
325 
327 void QgsProviderMetadata::saveConnectionProtected( const QgsAbstractProviderConnection *conn, const QString &name )
328 {
329  const bool isNewConnection = !connections().contains( name );
330  conn->store( name );
331  mProviderConnections.clear();
332 
333  if ( !isNewConnection )
334  emit connectionChanged( name );
335  else
336  emit connectionCreated( name );
337 }
339 
340 template<typename T>
341 QMap<QString, T *> QgsProviderMetadata::connections( bool cached )
342 {
343  QMap<QString, T *> result;
344  const auto constConns { connections( cached ) };
345  const QStringList constConnKeys { constConns.keys() };
346  for ( const auto &c : constConnKeys )
347  {
348  T *casted { static_cast<T *>( constConns.value( c ) ) };
349  if ( casted )
350  {
351  result.insert( c, casted );
352  }
353  }
354  return result;
355 }
356 
358 
360  const QString &description,
361  const MeshDriverCapabilities &capabilities,
362  const QString &writeDatasetOnfileSuffix )
363  : mName( name )
364  , mDescription( description )
365  , mCapabilities( capabilities )
366  , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
367 {
368 }
369 
371  const QString &description,
372  const MeshDriverCapabilities &capabilities,
373  const QString &writeDatasetOnfileSuffix,
374  const QString &writeMeshFrameOnFileSuffix,
375  int maxVerticesPerface )
376  : mName( name )
377  , mDescription( description )
378  , mCapabilities( capabilities )
379  , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
380  , mWriteMeshFrameOnFileSuffix( ( writeMeshFrameOnFileSuffix ) )
381  , mMaxVerticesPerFace( maxVerticesPerface )
382 {
383 }
384 
385 QgsMeshDriverMetadata::MeshDriverCapabilities QgsMeshDriverMetadata::capabilities() const
386 {
387  return mCapabilities;
388 }
389 
391 {
392  return mName;
393 }
394 
396 {
397  return mDescription;
398 }
399 
401 {
402  return mWriteDatasetOnFileSuffix;
403 }
404 
406 {
407  return mWriteMeshFrameOnFileSuffix;
408 }
409 
411 {
412  return mMaxVerticesPerFace;
413 }
VectorExportResult
Vector layer export result codes.
Definition: qgis.h:445
DataType
Raster data types.
Definition: qgis.h:129
The QgsAbstractProviderConnection provides an interface for data provider connections.
virtual void store(const QString &name) const =0
Stores the connection in the settings.
This class represents a coordinate reference system (CRS).
Abstract base class for spatial data provider implementations.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
Container of fields for a vector layer.
Definition: qgsfields.h:45
A structured metadata store for a map layer.
int maximumVerticesCountPerFace() const
Returns the maximum number of vertices per face supported by the driver.
QString writeDatasetOnFileSuffix() const
Returns the suffix used to write datasets on file.
MeshDriverCapabilities capabilities() const
Returns the capabilities for this driver.
QString writeMeshFrameOnFileSuffix() const
Returns the suffix used to write mesh on file.
QString description() const
Returns the description for this driver.
QgsMeshDriverMetadata()
Constructs default metadata without any capabilities.
QString name() const
Returns the name (key) for this driver.
Custom exception class which is raised when an operation is not supported.
Definition: qgsexception.h:118
Custom exception class for provider connection related exceptions.
Definition: qgsexception.h:101
virtual bool uriIsBlocklisted(const QString &uri) const
Returns true if the specified uri is known by this provider to be something which should be blocklist...
virtual QgsProviderMetadata::ProviderCapabilities providerCapabilities() const
Returns the provider's capabilities.
static void setBoolParameter(QVariantMap &uri, const QString &parameter, const QVariant &value)
Sets the value into the uri parameter as a bool.
virtual QgsRasterDataProvider * createRasterDataProvider(const QString &uri, const QString &format, int nBands, Qgis::DataType type, int width, int height, double *geoTransform, const QgsCoordinateReferenceSystem &crs, const QStringList &createOptions=QStringList())
Creates a new instance of the raster data provider.
Q_DECL_DEPRECATED CreateDataProviderFunction createFunction() const
Returns a pointer to the direct provider creation function, if supported by the provider.
QgsAbstractProviderConnection * findConnection(const QString &name, bool cached=true) SIP_THROW(QgsProviderConnectionException)
Searches and returns a (possibly NULL) connection from the stored provider connections.
virtual int priorityForUri(const QString &uri) const
Returns an integer representing the priority which this provider should have when opening a dataset w...
FilterType
Type of file filters.
static bool boolParameter(const QVariantMap &uri, const QString &parameter, bool defaultValue=false)
Returns the parameter value in the uri as a bool.
std::function< QgsDataProvider *(const QString &, const QgsDataProvider::ProviderOptions &, QgsDataProvider::ReadFlags &) > CreateDataProviderFunction
Typedef for data provider creation function.
virtual bool deleteStyleById(const QString &uri, const QString &styleId, QString &errCause)
Deletes a layer style defined by styleId.
virtual ~QgsProviderMetadata()
dtor
virtual bool saveStyle(const QString &uri, const QString &qmlStyle, const QString &sldStyle, const QString &styleName, const QString &styleDescription, const QString &uiFileContent, bool useAsDefault, QString &errCause)
Saves a layer style to provider.
virtual QgsDataProvider * createProvider(const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags=QgsDataProvider::ReadFlags())
Class factory to return a pointer to a newly created QgsDataProvider object.
virtual QString filters(FilterType type)
Builds the list of file filter strings (supported formats)
virtual bool saveLayerMetadata(const QString &uri, const QgsLayerMetadata &metadata, QString &errorMessage) SIP_THROW(QgsNotSupportedException)
Saves metadata to the layer corresponding to the specified uri.
virtual QString encodeUri(const QVariantMap &parts) const
Reassembles a provider data source URI from its component paths (e.g.
QMap< QString, QgsAbstractDatabaseProviderConnection * > dbConnections(bool cached=true) SIP_THROW(QgsProviderConnectionException)
Returns a dictionary of database provider connections, the dictionary key is the connection identifie...
QString description() const
This returns descriptive text for the provider.
virtual bool createMeshData(const QgsMesh &mesh, const QString &fileName, const QString &driverName, const QgsCoordinateReferenceSystem &crs) const
Creates mesh data source from a file name fileName and a driver driverName, that is the mesh frame st...
virtual bool styleExists(const QString &uri, const QString &styleId, QString &errorCause)
Returns true if a layer style with the specified styleId exists in the provider defined by uri.
void connectionChanged(const QString &name)
Emitted when the connection with the specified name is changed, e.g.
virtual QStringList sidecarFilesForUri(const QString &uri) const
Given a uri, returns any sidecar files which are associated with the URI and this provider.
void connectionCreated(const QString &name)
Emitted when a connection with the specified name is created.
virtual void saveConnection(const QgsAbstractProviderConnection *connection, const QString &name) SIP_THROW(QgsProviderConnectionException)
Stores the connection in the settings.
virtual QgsAbstractProviderConnection * createConnection(const QString &uri, const QVariantMap &configuration) SIP_THROW(QgsProviderConnectionException)
Creates a new connection from uri and configuration, the newly created connection is not automaticall...
virtual Qgis::VectorExportResult createEmptyLayer(const QString &uri, const QgsFields &fields, QgsWkbTypes::Type wkbType, const QgsCoordinateReferenceSystem &srs, bool overwrite, QMap< int, int > &oldToNewAttrIdxMap, QString &errorMessage, const QMap< QString, QVariant > *options)
Creates new empty vector layer.
virtual void deleteConnection(const QString &name) SIP_THROW(QgsProviderConnectionException)
Removes the connection with the given name from the settings.
QString key() const
This returns the unique key associated with the provider.
virtual QgsTransaction * createTransaction(const QString &connString)
Returns new instance of transaction.
virtual void initProvider()
Initialize the provider.
virtual QString getStyleById(const QString &uri, const QString &styleId, QString &errCause)
Gets a layer style defined by uri.
QgsProviderMetadata(const QString &key, const QString &description, const QString &library=QString())
Constructor for provider metadata.
virtual QList< QgsProviderSublayerDetails > querySublayers(const QString &uri, Qgis::SublayerQueryFlags flags=Qgis::SublayerQueryFlags(), QgsFeedback *feedback=nullptr) const
Queries the specified uri and returns a list of any valid sublayers found in the dataset which can be...
virtual QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const
Returns the provider metadata capabilities.
virtual void cleanupProvider()
Cleanup the provider.
virtual QString loadStyle(const QString &uri, QString &errCause)
Loads a layer style defined by uri.
virtual int listStyles(const QString &uri, QStringList &ids, QStringList &names, QStringList &descriptions, QString &errCause)
Lists stored layer styles in the provider defined by uri.
virtual QList< QPair< QString, QString > > pyramidResamplingMethods()
Returns pyramid resampling methods available for provider.
virtual QList< QgsMapLayerType > validLayerTypesForUri(const QString &uri) const
Returns a list of valid layer types which the provider can be used with when opening the specified ur...
virtual QList< QgsDataItemProvider * > dataItemProviders() const
Returns data item providers.
virtual QMap< QString, QgsAbstractProviderConnection * > connections(bool cached=true) SIP_THROW(QgsProviderConnectionException)
Returns a dictionary of stored provider connections, the dictionary key is the connection identifier.
virtual QList< QgsMeshDriverMetadata > meshDriversMetadata()
Builds the list of available mesh drivers metadata.
virtual QVariantMap decodeUri(const QString &uri) const
Breaks a provider data source URI into its component paths (e.g.
Q_DECL_DEPRECATED QString library() const
This returns the library file name.
virtual bool createDb(const QString &dbPath, QString &errCause)
Creates database by the provider on the path.
Base class for raster data providers.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:70
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
Setting options for creating vector data providers.
Mesh - vertices, edges and faces.