QGIS API Documentation  3.4.15-Madeira (e83d02e274)
qgsvectordataprovider.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectordataprovider.cpp - DataProvider Interface for vector layers
3  --------------------------------------
4  Date : 26-Oct-2004
5  Copyright : (C) 2004 by Marco Hugentobler
6  email : [email protected]
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include <QTextCodec>
17 
18 #include <cfloat>
19 #include <climits>
20 #include <limits>
21 
22 #include "qgsvectordataprovider.h"
23 #include "qgscircularstring.h"
24 #include "qgscompoundcurve.h"
25 #include "qgsfeature.h"
26 #include "qgsfeatureiterator.h"
27 #include "qgsfeaturerequest.h"
28 #include "qgsfeedback.h"
29 #include "qgsfields.h"
30 #include "qgsgeometry.h"
31 #include "qgsgeometrycollection.h"
32 #include "qgsgeometryfactory.h"
33 #include "qgslogger.h"
34 #include "qgsmessagelog.h"
35 #include "qgssettings.h"
36 #include <mutex>
37 
39  : QgsDataProvider( uri, options )
40 {
41  QgsSettings settings;
42  setEncoding( settings.value( QStringLiteral( "UI/encoding" ), "System" ).toString() );
43 }
44 
46 {
47  return QStringLiteral( "Generic vector file" );
48 }
49 
51 {
52  QgsFeature f;
53  QgsFeatureRequest request;
54  request.setNoAttributes();
56  request.setLimit( 1 );
57  if ( getFeatures( request ).nextFeature( f ) )
58  return false;
59  else
60  return true;
61 }
62 
64 {
65  if ( empty() )
66  return QgsFeatureSource::FeatureAvailability::NoFeaturesAvailable;
67  else
68  return QgsFeatureSource::FeatureAvailability::FeaturesAvailable;
69 }
70 
72 {
73  return crs();
74 }
75 
77 {
78  return extent();
79 }
80 
82 {
83  return QString();
84 }
85 
87 {
88  Q_UNUSED( flist );
89  Q_UNUSED( flags );
90  return false;
91 }
92 
94 {
95  Q_UNUSED( ids );
96  return false;
97 }
98 
100 {
101  if ( !( capabilities() & DeleteFeatures ) )
102  return false;
103 
104  QgsFeatureIds toDelete;
105  QgsFeatureIterator it = getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setNoAttributes() );
106  QgsFeature f;
107  while ( it.nextFeature( f ) )
108  toDelete << f.id();
109 
110  return deleteFeatures( toDelete );
111 }
112 
113 bool QgsVectorDataProvider::addAttributes( const QList<QgsField> &attributes )
114 {
115  Q_UNUSED( attributes );
116  return false;
117 }
118 
120 {
121  Q_UNUSED( attributes );
122  return false;
123 }
124 
126 {
127  Q_UNUSED( renamedAttributes );
128  return false;
129 }
130 
132 {
133  Q_UNUSED( attr_map );
134  return false;
135 }
136 
137 QVariant QgsVectorDataProvider::defaultValue( int fieldId ) const
138 {
139  Q_UNUSED( fieldId );
140  return QVariant();
141 }
142 
143 QString QgsVectorDataProvider::defaultValueClause( int fieldIndex ) const
144 {
145  Q_UNUSED( fieldIndex );
146  return QString();
147 }
148 
149 QgsFieldConstraints::Constraints QgsVectorDataProvider::fieldConstraints( int fieldIndex ) const
150 {
151  QgsFields f = fields();
152  if ( fieldIndex < 0 || fieldIndex >= f.count() )
153  return nullptr;
154 
155  return f.at( fieldIndex ).constraints().constraints();
156 }
157 
159 {
160  return false;
161 }
162 
164 {
165  Q_UNUSED( geometry_map );
166  return false;
167 }
168 
170  const QgsGeometryMap &geometry_map )
171 {
173  return false;
174 
175  bool result = true;
176  result = result && changeAttributeValues( attr_map );
177  result = result && changeGeometryValues( geometry_map );
178  return result;
179 }
180 
182 {
183  return false;
184 }
185 
187 {
188  Q_UNUSED( field );
189  return true;
190 }
191 
192 QgsVectorDataProvider::Capabilities QgsVectorDataProvider::capabilities() const
193 {
195 }
196 
197 
198 void QgsVectorDataProvider::setEncoding( const QString &e )
199 {
200  mEncoding = QTextCodec::codecForName( e.toLocal8Bit().constData() );
201 
202  if ( !mEncoding && e != QLatin1String( "System" ) )
203  {
204  QgsMessageLog::logMessage( tr( "Codec %1 not found. Falling back to system locale" ).arg( e ) );
205  mEncoding = QTextCodec::codecForName( "System" );
206  }
207 
208  if ( !mEncoding )
209  mEncoding = QTextCodec::codecForLocale();
210 
211  Q_ASSERT( mEncoding );
212 }
213 
215 {
216  if ( mEncoding )
217  {
218  return mEncoding->name();
219  }
220 
221  return QString();
222 }
223 
225 {
226  QStringList abilitiesList;
227 
228  int abilities = capabilities();
229 
230  if ( abilities & QgsVectorDataProvider::AddFeatures )
231  {
232  abilitiesList += tr( "Add Features" );
233  }
234 
235  if ( abilities & QgsVectorDataProvider::DeleteFeatures )
236  {
237  abilitiesList += tr( "Delete Features" );
238  }
239 
241  {
242  abilitiesList += tr( "Change Attribute Values" );
243  }
244 
245  if ( abilities & QgsVectorDataProvider::AddAttributes )
246  {
247  abilitiesList += tr( "Add Attributes" );
248  }
249 
250  if ( abilities & QgsVectorDataProvider::DeleteAttributes )
251  {
252  abilitiesList += tr( "Delete Attributes" );
253  }
254 
255  if ( abilities & QgsVectorDataProvider::RenameAttributes )
256  {
257  abilitiesList += tr( "Rename Attributes" );
258  }
259 
261  {
262  // TODO: Tighten up this test. See QgsOgrProvider for details.
263  abilitiesList += tr( "Create Spatial Index" );
264  }
265 
267  {
268  abilitiesList += tr( "Create Attribute Indexes" );
269  }
270 
271  if ( abilities & QgsVectorDataProvider::SelectAtId )
272  {
273  abilitiesList += tr( "Fast Access to Features at ID" );
274  }
275 
276  if ( abilities & QgsVectorDataProvider::ChangeGeometries )
277  {
278  abilitiesList += tr( "Change Geometries" );
279  }
280 
282  {
283  abilitiesList += tr( "Presimplify Geometries" );
284  }
285 
287  {
288  abilitiesList += tr( "Presimplify Geometries with Validity Check" );
289  }
290 
291  if ( abilities & QgsVectorDataProvider::ChangeFeatures )
292  {
293  abilitiesList += tr( "Simultaneous Geometry and Attribute Updates" );
294  }
295 
297  {
298  abilitiesList += tr( "Transactions" );
299  }
300 
302  {
303  abilitiesList += tr( "Curved Geometries" );
304  }
305 
306  return abilitiesList.join( QStringLiteral( ", " ) );
307 }
308 
309 
310 int QgsVectorDataProvider::fieldNameIndex( const QString &fieldName ) const
311 {
312  return fields().lookupField( fieldName );
313 }
314 
315 QMap<QString, int> QgsVectorDataProvider::fieldNameMap() const
316 {
317  QMap<QString, int> resultMap;
318 
319  QgsFields fieldsCopy = fields();
320  for ( int i = 0; i < fieldsCopy.count(); ++i )
321  {
322  resultMap.insert( fieldsCopy.at( i ).name(), i );
323  }
324 
325  return resultMap;
326 }
327 
329 {
330  return fields().allAttributesList();
331 }
332 
334 {
335  return QgsAttributeList();
336 }
337 
338 QList<QgsVectorDataProvider::NativeType> QgsVectorDataProvider::nativeTypes() const
339 {
340  return mNativeTypes;
341 }
342 
344 {
345  return QgsAttrPalIndexNameHash();
346 }
347 
349 {
350  QgsDebugMsgLevel( QStringLiteral( "field name = %1 type = %2 length = %3 precision = %4" )
351  .arg( field.name(),
352  QVariant::typeToName( field.type() ) )
353  .arg( field.length() )
354  .arg( field.precision() ), 2 );
355 
356  Q_FOREACH ( const NativeType &nativeType, mNativeTypes )
357  {
358  QgsDebugMsgLevel( QStringLiteral( "native field type = %1 min length = %2 max length = %3 min precision = %4 max precision = %5" )
359  .arg( QVariant::typeToName( nativeType.mType ) )
360  .arg( nativeType.mMinLen )
361  .arg( nativeType.mMaxLen )
362  .arg( nativeType.mMinPrec )
363  .arg( nativeType.mMaxPrec ), 2 );
364 
365  if ( field.type() != nativeType.mType )
366  continue;
367 
368  if ( field.length() > 0 )
369  {
370  // source length limited
371  if ( ( nativeType.mMinLen > 0 && field.length() < nativeType.mMinLen ) ||
372  ( nativeType.mMaxLen > 0 && field.length() > nativeType.mMaxLen ) )
373  {
374  // source length exceeds destination limits
375  continue;
376  }
377  }
378 
379  if ( field.precision() > 0 )
380  {
381  // source precision limited
382  if ( ( nativeType.mMinPrec > 0 && field.precision() < nativeType.mMinPrec ) ||
383  ( nativeType.mMaxPrec > 0 && field.precision() > nativeType.mMaxPrec ) )
384  {
385  // source precision exceeds destination limits
386  continue;
387  }
388  }
389 
390  QgsDebugMsg( QStringLiteral( "native type matches" ) );
391  return true;
392  }
393 
394  QgsDebugMsg( QStringLiteral( "no sufficient native type found" ) );
395  return false;
396 }
397 
398 QVariant QgsVectorDataProvider::minimumValue( int index ) const
399 {
400  if ( index < 0 || index >= fields().count() )
401  {
402  QgsDebugMsg( "Warning: access requested to invalid field index: " + QString::number( index ) );
403  return QVariant();
404  }
405 
406  fillMinMaxCache();
407 
408  if ( !mCacheMinValues.contains( index ) )
409  return QVariant();
410 
411  return mCacheMinValues[index];
412 }
413 
414 QVariant QgsVectorDataProvider::maximumValue( int index ) const
415 {
416  if ( index < 0 || index >= fields().count() )
417  {
418  QgsDebugMsg( "Warning: access requested to invalid field index: " + QString::number( index ) );
419  return QVariant();
420  }
421 
422  fillMinMaxCache();
423 
424  if ( !mCacheMaxValues.contains( index ) )
425  return QVariant();
426 
427  return mCacheMaxValues[index];
428 }
429 
430 
431 QStringList QgsVectorDataProvider::uniqueStringsMatching( int index, const QString &substring, int limit, QgsFeedback *feedback ) const
432 {
433  QStringList results;
434 
435  // Safety belt
436  if ( index < 0 || index >= fields().count() )
437  return results;
438 
439  QgsFeature f;
440  QgsAttributeList keys;
441  keys.append( index );
442 
443  QgsFeatureRequest request;
444  request.setSubsetOfAttributes( keys );
446  QString fieldName = fields().at( index ).name();
447  request.setFilterExpression( QStringLiteral( "\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
448  QgsFeatureIterator fi = getFeatures( request );
449 
450  QSet<QString> set;
451 
452  while ( fi.nextFeature( f ) )
453  {
454  QString value = f.attribute( index ).toString();
455  if ( !set.contains( value ) )
456  {
457  results.append( value );
458  set.insert( value );
459  }
460 
461  if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->isCanceled() ) )
462  break;
463  }
464  return results;
465 }
466 
468  const QgsAggregateCalculator::AggregateParameters &parameters, QgsExpressionContext *context, bool &ok ) const
469 {
470  //base implementation does nothing
471  Q_UNUSED( aggregate );
472  Q_UNUSED( index );
473  Q_UNUSED( parameters );
474  Q_UNUSED( context );
475 
476  ok = false;
477  return QVariant();
478 }
479 
481 {
482  mCacheMinMaxDirty = true;
483  mCacheMinValues.clear();
484  mCacheMaxValues.clear();
485 }
486 
488 {
489  if ( !mCacheMinMaxDirty )
490  return;
491 
492  QgsFields flds = fields();
493  for ( int i = 0; i < flds.count(); ++i )
494  {
495  if ( flds.at( i ).type() == QVariant::Int )
496  {
497  mCacheMinValues[i] = QVariant( std::numeric_limits<int>::max() );
498  mCacheMaxValues[i] = QVariant( std::numeric_limits<int>::lowest() );
499  }
500  else if ( flds.at( i ).type() == QVariant::LongLong )
501  {
502  mCacheMinValues[i] = QVariant( std::numeric_limits<qlonglong>::max() );
503  mCacheMaxValues[i] = QVariant( std::numeric_limits<qlonglong>::lowest() );
504  }
505  else if ( flds.at( i ).type() == QVariant::Double )
506  {
507  mCacheMinValues[i] = QVariant( std::numeric_limits<double>::max() );
508  mCacheMaxValues[i] = QVariant( std::numeric_limits<double>::lowest() );
509 
510  }
511  else
512  {
513  mCacheMinValues[i] = QVariant();
514  mCacheMaxValues[i] = QVariant();
515  }
516  }
517 
518  QgsFeature f;
519  const QgsAttributeList keys = mCacheMinValues.keys();
520  QgsFeatureIterator fi = getFeatures( QgsFeatureRequest().setSubsetOfAttributes( keys )
521  .setFlags( QgsFeatureRequest::NoGeometry ) );
522 
523  while ( fi.nextFeature( f ) )
524  {
525  QgsAttributes attrs = f.attributes();
526  for ( int attributeIndex : keys )
527  {
528  const QVariant &varValue = attrs.at( attributeIndex );
529 
530  if ( varValue.isNull() )
531  continue;
532 
533  switch ( flds.at( attributeIndex ).type() )
534  {
535  case QVariant::Int:
536  {
537  int value = varValue.toInt();
538  if ( value < mCacheMinValues[ attributeIndex ].toInt() )
539  mCacheMinValues[ attributeIndex ] = value;
540  if ( value > mCacheMaxValues[ attributeIndex ].toInt() )
541  mCacheMaxValues[ attributeIndex ] = value;
542  break;
543  }
544  case QVariant::LongLong:
545  {
546  qlonglong value = varValue.toLongLong();
547  if ( value < mCacheMinValues[ attributeIndex ].toLongLong() )
548  mCacheMinValues[ attributeIndex ] = value;
549  if ( value > mCacheMaxValues[ attributeIndex ].toLongLong() )
550  mCacheMaxValues[ attributeIndex ] = value;
551  break;
552  }
553  case QVariant::Double:
554  {
555  double value = varValue.toDouble();
556  if ( value < mCacheMinValues[ attributeIndex ].toDouble() )
557  mCacheMinValues[attributeIndex ] = value;
558  if ( value > mCacheMaxValues[ attributeIndex ].toDouble() )
559  mCacheMaxValues[ attributeIndex ] = value;
560  break;
561  }
562  default:
563  {
564  QString value = varValue.toString();
565  if ( mCacheMinValues[ attributeIndex ].isNull() || value < mCacheMinValues[attributeIndex ].toString() )
566  {
567  mCacheMinValues[attributeIndex] = value;
568  }
569  if ( mCacheMaxValues[attributeIndex].isNull() || value > mCacheMaxValues[attributeIndex].toString() )
570  {
571  mCacheMaxValues[attributeIndex] = value;
572  }
573  break;
574  }
575  }
576  }
577  }
578 
579  mCacheMinMaxDirty = false;
580 }
581 
582 QVariant QgsVectorDataProvider::convertValue( QVariant::Type type, const QString &value )
583 {
584  QVariant v( value );
585 
586  if ( !v.convert( type ) || value.isNull() )
587  v = QVariant( type );
588 
589  return v;
590 }
591 
593 {
594  return nullptr;
595 }
596 
598 {
599  emit dataChanged();
600 }
601 
602 static bool _compareEncodings( const QString &s1, const QString &s2 )
603 {
604  return s1.toLower() < s2.toLower();
605 }
606 
608 {
609  static std::once_flag initialized;
610  std::call_once( initialized, [ = ]
611  {
612  Q_FOREACH ( const QString &codec, QTextCodec::availableCodecs() )
613  {
614  sEncodings << codec;
615  }
616 #if 0
617  smEncodings << "BIG5";
618  smEncodings << "BIG5-HKSCS";
619  smEncodings << "EUCJP";
620  smEncodings << "EUCKR";
621  smEncodings << "GB2312";
622  smEncodings << "GBK";
623  smEncodings << "GB18030";
624  smEncodings << "JIS7";
625  smEncodings << "SHIFT-JIS";
626  smEncodings << "TSCII";
627  smEncodings << "UTF-8";
628  smEncodings << "UTF-16";
629  smEncodings << "KOI8-R";
630  smEncodings << "KOI8-U";
631  smEncodings << "ISO8859-1";
632  smEncodings << "ISO8859-2";
633  smEncodings << "ISO8859-3";
634  smEncodings << "ISO8859-4";
635  smEncodings << "ISO8859-5";
636  smEncodings << "ISO8859-6";
637  smEncodings << "ISO8859-7";
638  smEncodings << "ISO8859-8";
639  smEncodings << "ISO8859-8-I";
640  smEncodings << "ISO8859-9";
641  smEncodings << "ISO8859-10";
642  smEncodings << "ISO8859-11";
643  smEncodings << "ISO8859-12";
644  smEncodings << "ISO8859-13";
645  smEncodings << "ISO8859-14";
646  smEncodings << "ISO8859-15";
647  smEncodings << "IBM 850";
648  smEncodings << "IBM 866";
649  smEncodings << "CP874";
650  smEncodings << "CP1250";
651  smEncodings << "CP1251";
652  smEncodings << "CP1252";
653  smEncodings << "CP1253";
654  smEncodings << "CP1254";
655  smEncodings << "CP1255";
656  smEncodings << "CP1256";
657  smEncodings << "CP1257";
658  smEncodings << "CP1258";
659  smEncodings << "Apple Roman";
660  smEncodings << "TIS-620";
661  smEncodings << "System";
662 #endif
663 
664  // Do case-insensitive sorting of encodings
665  std::sort( sEncodings.begin(), sEncodings.end(), _compareEncodings );
666 
667  } );
668 
669  return sEncodings;
670 }
671 
673 {
674  mErrors.clear();
675 }
676 
678 {
679  return !mErrors.isEmpty();
680 }
681 
682 QStringList QgsVectorDataProvider::errors() const
683 {
684  return mErrors;
685 }
686 
688 {
689  return false;
690 }
691 
693 {
694  return false;
695 }
696 
698 {
699  return nullptr;
700 }
701 
702 void QgsVectorDataProvider::pushError( const QString &msg ) const
703 {
704  QgsDebugMsg( msg );
705  mErrors << msg;
706  emit raiseError( msg );
707 }
708 
709 QSet<QgsMapLayerDependency> QgsVectorDataProvider::dependencies() const
710 {
711  return QSet<QgsMapLayerDependency>();
712 }
713 
715 {
716  if ( geom.isNull() )
717  {
718  return QgsGeometry();
719  }
720 
721  const QgsAbstractGeometry *geometry = geom.constGet();
722  if ( !geometry )
723  {
724  return QgsGeometry();
725  }
726 
727  QgsWkbTypes::Type providerGeomType = wkbType();
728 
729  //geom is already in the provider geometry type
730  if ( geometry->wkbType() == providerGeomType )
731  {
732  return QgsGeometry();
733  }
734 
735  std::unique_ptr< QgsAbstractGeometry > outputGeom;
736 
737  //convert compoundcurve to circularstring (possible if compoundcurve consists of one circular string)
738  if ( QgsWkbTypes::flatType( providerGeomType ) == QgsWkbTypes::CircularString )
739  {
740  QgsCompoundCurve *compoundCurve = qgsgeometry_cast<QgsCompoundCurve *>( geometry );
741  if ( compoundCurve )
742  {
743  if ( compoundCurve->nCurves() == 1 )
744  {
745  const QgsCircularString *circularString = qgsgeometry_cast<const QgsCircularString *>( compoundCurve->curveAt( 0 ) );
746  if ( circularString )
747  {
748  outputGeom.reset( circularString->clone() );
749  }
750  }
751  }
752  }
753 
754  //convert to curved type if necessary
755  if ( !QgsWkbTypes::isCurvedType( geometry->wkbType() ) && QgsWkbTypes::isCurvedType( providerGeomType ) )
756  {
757  QgsAbstractGeometry *curveGeom = outputGeom ? outputGeom->toCurveType() : geometry->toCurveType();
758  if ( curveGeom )
759  {
760  outputGeom.reset( curveGeom );
761  }
762  }
763 
764  //convert to linear type from curved type
765  if ( QgsWkbTypes::isCurvedType( geometry->wkbType() ) && !QgsWkbTypes::isCurvedType( providerGeomType ) )
766  {
767  QgsAbstractGeometry *segmentizedGeom = outputGeom ? outputGeom->segmentize() : geometry->segmentize();
768  if ( segmentizedGeom )
769  {
770  outputGeom.reset( segmentizedGeom );
771  }
772  }
773 
774  //convert to multitype if necessary
775  if ( QgsWkbTypes::isMultiType( providerGeomType ) && !QgsWkbTypes::isMultiType( geometry->wkbType() ) )
776  {
777  std::unique_ptr< QgsAbstractGeometry > collGeom( QgsGeometryFactory::geomFromWkbType( providerGeomType ) );
778  QgsGeometryCollection *geomCollection = qgsgeometry_cast<QgsGeometryCollection *>( collGeom.get() );
779  if ( geomCollection )
780  {
781  if ( geomCollection->addGeometry( outputGeom ? outputGeom->clone() : geometry->clone() ) )
782  {
783  outputGeom.reset( collGeom.release() );
784  }
785  }
786  }
787 
788  //set z/m types
789  if ( QgsWkbTypes::hasZ( providerGeomType ) )
790  {
791  if ( !outputGeom )
792  {
793  outputGeom.reset( geometry->clone() );
794  }
795  outputGeom->addZValue();
796  }
797 
798  if ( QgsWkbTypes::hasM( providerGeomType ) )
799  {
800  if ( !outputGeom )
801  {
802  outputGeom.reset( geometry->clone() );
803  }
804  outputGeom->addMValue();
805  }
806 
807  if ( outputGeom )
808  {
809  return QgsGeometry( outputGeom.release() );
810  }
811 
812  return QgsGeometry();
813 }
814 
815 void QgsVectorDataProvider::setNativeTypes( const QList<NativeType> &nativeTypes )
816 {
817  mNativeTypes = nativeTypes;
818 }
819 
821 {
822  return mEncoding;
823 }
824 
826 {
827  return false;
828 }
829 
830 QStringList QgsVectorDataProvider::sEncodings;
831 
832 QList<QgsRelation> QgsVectorDataProvider::discoverRelations( const QgsVectorLayer *, const QList<QgsVectorLayer *> & ) const
833 {
834  return QList<QgsRelation>();
835 }
QgsFeatureId id
Definition: qgsfeature.h:64
Wrapper for iterator of features from vector data provider or vector layer.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
Definition: qgsfeature.h:566
static QVariant convertValue(QVariant::Type type, const QString &value)
A rectangle specified with double values.
Definition: qgsrectangle.h:40
QVariant maximumValue(int index) const override
Returns the maximum value of an attribute.
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:34
static std::unique_ptr< QgsAbstractGeometry > geomFromWkbType(QgsWkbTypes::Type t)
Returns empty geometry from wkb type.
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.
QgsWkbTypes::Type wkbType() const override=0
Returns the geometry type which is returned by this layer.
virtual QgsAbstractGeometry * toCurveType() const =0
Returns the geometry converted to the more generic curve type.
QString name
Definition: qgsfield.h:57
void pushError(const QString &msg) const
Push a notification about errors that happened in this providers scope.
QVariant minimumValue(int index) const override
Returns the minimum value of an attribute.
int precision
Definition: qgsfield.h:54
virtual bool addAttributes(const QList< QgsField > &attributes)
Adds new attributes to the provider.
bool isNull() const
Returns true if the geometry is null (ie, contains no underlying geometry accessible via geometry() )...
This class is a composition of two QSettings instances:
Definition: qgssettings.h:58
virtual QgsAttributeList attributeIndexes() const
Returns list of indexes to fetch all attributes in nextFeature()
QTextCodec * textEncoding() const
Gets this providers encoding.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
Definition: qgswkbtypes.h:695
QString capabilitiesString() const
Returns the above in friendly format.
FeatureAvailability
Possible return value for hasFeatures() to determine if a source is empty.
Constraint
Constraints which may be present on a field.
virtual QStringList uniqueStringsMatching(int index, const QString &substring, int limit=-1, QgsFeedback *feedback=nullptr) const
Returns unique string values of an attribute which contain a specified subset string.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
bool addFeatures(QgsFeatureList &flist, QgsFeatureSink::Flags flags=nullptr) override
Adds a list of features to the sink.
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:571
Supports simplification of geometries on provider side according to a distance tolerance.
virtual QList< QgsRelation > discoverRelations(const QgsVectorLayer *self, const QList< QgsVectorLayer * > &layers) const
Discover the available relations with the given layers.
virtual bool deleteFeatures(const QgsFeatureIds &id)
Deletes one or more features from the provider.
virtual void setEncoding(const QString &e)
Set encoding used for accessing data from layer.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
virtual bool renameAttributes(const QgsFieldNameMap &renamedAttributes)
Renames existing attributes.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Container of fields for a vector layer.
Definition: qgsfields.h:42
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:106
Abstract base class for spatial data provider implementations.
Allows deletion of attributes (fields)
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
virtual QVariant aggregate(QgsAggregateCalculator::Aggregate aggregate, int index, const QgsAggregateCalculator::AggregateParameters &parameters, QgsExpressionContext *context, bool &ok) const
Calculates an aggregated value from the layer&#39;s features.
int fieldNameIndex(const QString &fieldName) const
Returns the index of a field name or -1 if the field does not exist.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
Definition: qgsfields.cpp:163
QgsFieldConstraints::Constraints fieldConstraints(int fieldIndex) const
Returns any constraints which are present at the provider for a specified field index.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
const QgsCurve * curveAt(int i) const
Returns the curve at the specified index.
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:906
QgsGeometry convertToProviderType(const QgsGeometry &geom) const
Converts the geometry to the provider type if possible / necessary.
virtual bool createAttributeIndex(int field)
Create an attribute index on the datasource.
int length
Definition: qgsfield.h:53
void dataChanged()
This is emitted whenever an asynchronous operation has finished and the data should be redrawn...
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:44
void setNativeTypes(const QList< QgsVectorDataProvider::NativeType > &nativeTypes)
Set the list of native types supported by this provider.
Allows creation of spatial index.
QString encoding() const
Gets encoding which is used for accessing data.
QSet< int > QgsAttributeIds
virtual bool createSpatialIndex()
Creates a spatial index on the datasource (if supported by the provider type).
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
bool supportedType(const QgsField &field) const
check if provider supports type of field
Can create indexes on provider&#39;s fields.
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
Allows addition of new attributes (fields)
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
void clearMinMaxCache()
Invalidates the min/max cache.
virtual QString dataComment() const
Returns a short comment for the data that this provider is providing access to (e.g.
Geometry collection.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
QgsFields fields() const override=0
Returns the fields associated with this data provider.
virtual bool changeAttributeValues(const QgsChangedAttributesMap &attr_map)
Changes attribute values of existing features.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
virtual bool changeFeatures(const QgsChangedAttributesMap &attr_map, const QgsGeometryMap &geometry_map)
Changes attribute values and geometries of existing features.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
int nCurves() const
Returns the number of curves in the geometry.
virtual bool isSaveAndLoadStyleToDatabaseSupported() const
It returns false by default.
virtual QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
bool hasErrors() const
Provider has errors to report.
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
void raiseError(const QString &msg) const
Signals an error in this provider.
QList< QgsVectorDataProvider::NativeType > nativeTypes() const
Returns the names of the supported types.
Allows modifications of geometries.
void clearErrors()
Clear recorded errors.
int count() const
Returns number of items.
Definition: qgsfields.cpp:133
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:48
QgsCoordinateReferenceSystem sourceCrs() const override
Returns the coordinate reference system for features in the source.
int lookupField(const QString &fieldName) const
Looks up field&#39;s index from the field name.
Definition: qgsfields.cpp:320
Abstract base class for all geometries.
Fast access to features using their ID.
virtual bool changeGeometryValues(const QgsGeometryMap &geometry_map)
Changes geometries of existing features.
QMap< QString, int > fieldNameMap() const
Returns a map where the key is the name of the field and the value is its index.
virtual QSet< QgsMapLayerDependency > dependencies() const
Gets the list of layer ids on which this layer depends.
QMap< int, QString > QgsFieldNameMap
Definition: qgsattributes.h:44
virtual QgsTransaction * transaction() const
Returns the transaction this data provider is included in, if any.
QgsVectorDataProvider(const QString &uri=QString(), const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Constructor for a vector data provider.
Supports circular geometry types (circularstring, compoundcurve, curvepolygon)
virtual void forceReload()
Forces a reload of the underlying datasource if the provider implements this method.
Supports topological simplification of geometries on provider side according to a distance tolerance...
Setting options for creating vector data providers.
QgsFieldConstraints constraints
Definition: qgsfield.h:60
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
Definition: qgsfeature.cpp:262
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
Definition: qgsfeature.h:557
void fillMinMaxCache() const
Populates the cache of minimum and maximum attribute values.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const override=0
Query the provider for features specified in request.
virtual QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
virtual bool cancelReload()
Cancels the current reloading of data.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
static bool isCurvedType(Type type)
Returns true if the WKB type is a curved type or can contain curved geometries.
Definition: qgswkbtypes.h:744
QgsCircularString * clone() const override
Clones the geometry by performing a deep copy.
virtual bool skipConstraintCheck(int fieldIndex, QgsFieldConstraints::Constraint constraint, const QVariant &value=QVariant()) const
Returns true if a constraint check should be skipped for a specified field (e.g., if the value return...
virtual bool truncate()
Removes all features from the layer.
This class represents a coordinate reference system (CRS).
virtual QVariant defaultValue(int fieldIndex) const
Returns any literal default values which are present at the provider for a specified field index...
QgsFeatureSource::FeatureAvailability hasFeatures() const override
Will always return FeatureAvailability::FeaturesAvailable or FeatureAvailability::NoFeaturesAvailable...
QgsFeatureRequest & setLimit(long limit)
Set the maximum number of features to request.
QStringList errors() const
Gets recorded errors.
virtual bool deleteAttributes(const QgsAttributeIds &attributes)
Deletes existing attributes from the provider.
virtual bool empty() const
Returns true if the layer contains at least one feature.
virtual QgsAttrPalIndexNameHash palAttributeIndexNames() const
Returns list of indexes to names for QgsPalLabeling fix.
virtual QgsFeatureRenderer * createRenderer(const QVariantMap &configuration=QVariantMap()) const
Creates a new vector layer feature renderer, using provider backend specific information.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:956
Compound curve geometry type.
Circular string geometry type.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
QList< int > QgsAttributeList
Definition: qgsfield.h:27
bool nextFeature(QgsFeature &f)
Provider has no capabilities.
Geometry is not required. It may still be returned if e.g. required for a filter condition.
A vector of attributes.
Definition: qgsattributes.h:57
virtual QString defaultValueClause(int fieldIndex) const
Returns any default value clauses which are present at the provider for a specified field index...
Represents a vector layer which manages a vector based data sets.
virtual bool isDeleteStyleFromDatabaseSupported() const
It returns false by default.
static Type flatType(Type type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:565
QgsAttributeList allAttributesList() const
Utility function to get list of attribute indexes.
Definition: qgsfields.cpp:347
QHash< int, QString > QgsAttrPalIndexNameHash
Allows modification of attribute values.
QVariant::Type type
Definition: qgsfield.h:55
QgsAttributes attributes
Definition: qgsfeature.h:65
static QStringList availableEncodings()
Returns a list of available encodings.
Aggregate
Available aggregates to calculate.
virtual bool addGeometry(QgsAbstractGeometry *g)
Adds a geometry and takes ownership. Returns true in case of success.
Supports joint updates for attributes and geometry Providers supporting this should still define Chan...
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
QgsRectangle sourceExtent() const override
Returns the extent of all geometries from the source.
A bundle of parameters controlling aggregate calculation.