QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
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 }
42 
44 {
45  return QStringLiteral( "Generic vector file" );
46 }
47 
49 {
50  QgsFeature f;
51  QgsFeatureRequest request;
52  request.setNoAttributes();
54  request.setLimit( 1 );
55  if ( getFeatures( request ).nextFeature( f ) )
56  return false;
57  else
58  return true;
59 }
60 
62 {
63  if ( empty() )
64  return QgsFeatureSource::FeatureAvailability::NoFeaturesAvailable;
65  else
66  return QgsFeatureSource::FeatureAvailability::FeaturesAvailable;
67 }
68 
70 {
71  return crs();
72 }
73 
75 {
76  return extent();
77 }
78 
80 {
81  return QString();
82 }
83 
85 {
86  Q_UNUSED( flist )
87  Q_UNUSED( flags )
88  return false;
89 }
90 
92 {
93  Q_UNUSED( ids )
94  return false;
95 }
96 
98 {
99  if ( !( capabilities() & DeleteFeatures ) )
100  return false;
101 
102  QgsFeatureIds toDelete;
103  QgsFeatureIterator it = getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setNoAttributes() );
104  QgsFeature f;
105  while ( it.nextFeature( f ) )
106  toDelete << f.id();
107 
108  return deleteFeatures( toDelete );
109 }
110 
111 bool QgsVectorDataProvider::addAttributes( const QList<QgsField> &attributes )
112 {
113  Q_UNUSED( attributes )
114  return false;
115 }
116 
118 {
119  Q_UNUSED( attributes )
120  return false;
121 }
122 
124 {
125  Q_UNUSED( renamedAttributes )
126  return false;
127 }
128 
130 {
131  Q_UNUSED( attr_map )
132  return false;
133 }
134 
135 QVariant QgsVectorDataProvider::defaultValue( int fieldId ) const
136 {
137  Q_UNUSED( fieldId )
138  return QVariant();
139 }
140 
141 QString QgsVectorDataProvider::defaultValueClause( int fieldIndex ) const
142 {
143  Q_UNUSED( fieldIndex )
144  return QString();
145 }
146 
147 QgsFieldConstraints::Constraints QgsVectorDataProvider::fieldConstraints( int fieldIndex ) const
148 {
149  QgsFields f = fields();
150  if ( fieldIndex < 0 || fieldIndex >= f.count() )
151  return nullptr;
152 
153  return f.at( fieldIndex ).constraints().constraints();
154 }
155 
157 {
158  return false;
159 }
160 
162 {
163  Q_UNUSED( geometry_map )
164  return false;
165 }
166 
168  const QgsGeometryMap &geometry_map )
169 {
171  return false;
172 
173  bool result = true;
174  result = result && changeAttributeValues( attr_map );
175  result = result && changeGeometryValues( geometry_map );
176  return result;
177 }
178 
180 {
181  return false;
182 }
183 
185 {
186  Q_UNUSED( field )
187  return true;
188 }
189 
190 QgsVectorDataProvider::Capabilities QgsVectorDataProvider::capabilities() const
191 {
193 }
194 
195 
196 void QgsVectorDataProvider::setEncoding( const QString &e )
197 {
198  mEncoding = QTextCodec::codecForName( e.toLocal8Bit().constData() );
199 
200  if ( !mEncoding && e != QLatin1String( "System" ) )
201  {
202  QgsMessageLog::logMessage( tr( "Codec %1 not found. Falling back to system locale" ).arg( e ) );
203  mEncoding = QTextCodec::codecForName( "System" );
204  }
205 
206  if ( !mEncoding )
207  mEncoding = QTextCodec::codecForLocale();
208 
209  Q_ASSERT( mEncoding );
210 }
211 
213 {
214  if ( mEncoding )
215  {
216  return mEncoding->name();
217  }
218 
219  return QString();
220 }
221 
223 {
224  QStringList abilitiesList;
225 
226  int abilities = capabilities();
227 
228  if ( abilities & QgsVectorDataProvider::AddFeatures )
229  {
230  abilitiesList += tr( "Add Features" );
231  }
232 
233  if ( abilities & QgsVectorDataProvider::DeleteFeatures )
234  {
235  abilitiesList += tr( "Delete Features" );
236  }
237 
239  {
240  abilitiesList += tr( "Change Attribute Values" );
241  }
242 
243  if ( abilities & QgsVectorDataProvider::AddAttributes )
244  {
245  abilitiesList += tr( "Add Attributes" );
246  }
247 
248  if ( abilities & QgsVectorDataProvider::DeleteAttributes )
249  {
250  abilitiesList += tr( "Delete Attributes" );
251  }
252 
253  if ( abilities & QgsVectorDataProvider::RenameAttributes )
254  {
255  abilitiesList += tr( "Rename Attributes" );
256  }
257 
259  {
260  // TODO: Tighten up this test. See QgsOgrProvider for details.
261  abilitiesList += tr( "Create Spatial Index" );
262  }
263 
265  {
266  abilitiesList += tr( "Create Attribute Indexes" );
267  }
268 
269  if ( abilities & QgsVectorDataProvider::SelectAtId )
270  {
271  abilitiesList += tr( "Fast Access to Features at ID" );
272  }
273 
274  if ( abilities & QgsVectorDataProvider::ChangeGeometries )
275  {
276  abilitiesList += tr( "Change Geometries" );
277  }
278 
280  {
281  abilitiesList += tr( "Presimplify Geometries" );
282  }
283 
285  {
286  abilitiesList += tr( "Presimplify Geometries with Validity Check" );
287  }
288 
289  if ( abilities & QgsVectorDataProvider::ChangeFeatures )
290  {
291  abilitiesList += tr( "Simultaneous Geometry and Attribute Updates" );
292  }
293 
295  {
296  abilitiesList += tr( "Transactions" );
297  }
298 
300  {
301  abilitiesList += tr( "Curved Geometries" );
302  }
303 
304  return abilitiesList.join( QStringLiteral( ", " ) );
305 }
306 
307 
308 int QgsVectorDataProvider::fieldNameIndex( const QString &fieldName ) const
309 {
310  return fields().lookupField( fieldName );
311 }
312 
313 QMap<QString, int> QgsVectorDataProvider::fieldNameMap() const
314 {
315  QMap<QString, int> resultMap;
316 
317  QgsFields fieldsCopy = fields();
318  for ( int i = 0; i < fieldsCopy.count(); ++i )
319  {
320  resultMap.insert( fieldsCopy.at( i ).name(), i );
321  }
322 
323  return resultMap;
324 }
325 
327 {
328  return fields().allAttributesList();
329 }
330 
332 {
333  return QgsAttributeList();
334 }
335 
336 QList<QgsVectorDataProvider::NativeType> QgsVectorDataProvider::nativeTypes() const
337 {
338  return mNativeTypes;
339 }
340 
342 {
343  return QgsAttrPalIndexNameHash();
344 }
345 
347 {
348  QgsDebugMsgLevel( QStringLiteral( "field name = %1 type = %2 length = %3 precision = %4" )
349  .arg( field.name(),
350  QVariant::typeToName( field.type() ) )
351  .arg( field.length() )
352  .arg( field.precision() ), 2 );
353 
354  const auto constMNativeTypes = mNativeTypes;
355  for ( const NativeType &nativeType : constMNativeTypes )
356  {
357  QgsDebugMsgLevel( QStringLiteral( "native field type = %1 min length = %2 max length = %3 min precision = %4 max precision = %5" )
358  .arg( QVariant::typeToName( nativeType.mType ) )
359  .arg( nativeType.mMinLen )
360  .arg( nativeType.mMaxLen )
361  .arg( nativeType.mMinPrec )
362  .arg( nativeType.mMaxPrec ), 2 );
363 
364  if ( field.type() != nativeType.mType )
365  continue;
366 
367  if ( field.length() > 0 )
368  {
369  // source length limited
370  if ( ( nativeType.mMinLen > 0 && field.length() < nativeType.mMinLen ) ||
371  ( nativeType.mMaxLen > 0 && field.length() > nativeType.mMaxLen ) )
372  {
373  // source length exceeds destination limits
374  continue;
375  }
376  }
377 
378  if ( field.precision() > 0 )
379  {
380  // source precision limited
381  if ( ( nativeType.mMinPrec > 0 && field.precision() < nativeType.mMinPrec ) ||
382  ( nativeType.mMaxPrec > 0 && field.precision() > nativeType.mMaxPrec ) )
383  {
384  // source precision exceeds destination limits
385  continue;
386  }
387  }
388 
389  QgsDebugMsgLevel( QStringLiteral( "native type matches" ), 3 );
390  return true;
391  }
392 
393  QgsDebugMsg( QStringLiteral( "no sufficient native type found" ) );
394  return false;
395 }
396 
397 QVariant QgsVectorDataProvider::minimumValue( int index ) const
398 {
399  if ( index < 0 || index >= fields().count() )
400  {
401  QgsDebugMsg( "Warning: access requested to invalid field index: " + QString::number( index ) );
402  return QVariant();
403  }
404 
405  fillMinMaxCache();
406 
407  if ( !mCacheMinValues.contains( index ) )
408  return QVariant();
409 
410  return mCacheMinValues[index];
411 }
412 
413 QVariant QgsVectorDataProvider::maximumValue( int index ) const
414 {
415  if ( index < 0 || index >= fields().count() )
416  {
417  QgsDebugMsg( "Warning: access requested to invalid field index: " + QString::number( index ) );
418  return QVariant();
419  }
420 
421  fillMinMaxCache();
422 
423  if ( !mCacheMaxValues.contains( index ) )
424  return QVariant();
425 
426  return mCacheMaxValues[index];
427 }
428 
429 
430 QStringList QgsVectorDataProvider::uniqueStringsMatching( int index, const QString &substring, int limit, QgsFeedback *feedback ) const
431 {
432  QStringList results;
433 
434  // Safety belt
435  if ( index < 0 || index >= fields().count() )
436  return results;
437 
438  QgsFeature f;
439  QgsAttributeList keys;
440  keys.append( index );
441 
442  QgsFeatureRequest request;
443  request.setSubsetOfAttributes( keys );
445  QString fieldName = fields().at( index ).name();
446  request.setFilterExpression( QStringLiteral( "\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
447  QgsFeatureIterator fi = getFeatures( request );
448 
449  QSet<QString> set;
450 
451  while ( fi.nextFeature( f ) )
452  {
453  QString value = f.attribute( index ).toString();
454  if ( !set.contains( value ) )
455  {
456  results.append( value );
457  set.insert( value );
458  }
459 
460  if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->isCanceled() ) )
461  break;
462  }
463  return results;
464 }
465 
467  const QgsAggregateCalculator::AggregateParameters &parameters, QgsExpressionContext *context, bool &ok, QgsFeatureIds *fids ) const
468 {
469  //base implementation does nothing
470  Q_UNUSED( aggregate )
471  Q_UNUSED( index )
472  Q_UNUSED( parameters )
473  Q_UNUSED( context )
474  Q_UNUSED( fids )
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 
597 static bool _compareEncodings( const QString &s1, const QString &s2 )
598 {
599  return s1.toLower() < s2.toLower();
600 }
601 
603 {
604  static std::once_flag initialized;
605  std::call_once( initialized, [ = ]
606  {
607  const auto codecs { QTextCodec::availableCodecs() };
608  for ( const QString &codec : codecs )
609  {
610  sEncodings << codec;
611  }
612 #if 0
613  smEncodings << "BIG5";
614  smEncodings << "BIG5-HKSCS";
615  smEncodings << "EUCJP";
616  smEncodings << "EUCKR";
617  smEncodings << "GB2312";
618  smEncodings << "GBK";
619  smEncodings << "GB18030";
620  smEncodings << "JIS7";
621  smEncodings << "SHIFT-JIS";
622  smEncodings << "TSCII";
623  smEncodings << "UTF-8";
624  smEncodings << "UTF-16";
625  smEncodings << "KOI8-R";
626  smEncodings << "KOI8-U";
627  smEncodings << "ISO8859-1";
628  smEncodings << "ISO8859-2";
629  smEncodings << "ISO8859-3";
630  smEncodings << "ISO8859-4";
631  smEncodings << "ISO8859-5";
632  smEncodings << "ISO8859-6";
633  smEncodings << "ISO8859-7";
634  smEncodings << "ISO8859-8";
635  smEncodings << "ISO8859-8-I";
636  smEncodings << "ISO8859-9";
637  smEncodings << "ISO8859-10";
638  smEncodings << "ISO8859-11";
639  smEncodings << "ISO8859-12";
640  smEncodings << "ISO8859-13";
641  smEncodings << "ISO8859-14";
642  smEncodings << "ISO8859-15";
643  smEncodings << "IBM 850";
644  smEncodings << "IBM 866";
645  smEncodings << "CP874";
646  smEncodings << "CP1250";
647  smEncodings << "CP1251";
648  smEncodings << "CP1252";
649  smEncodings << "CP1253";
650  smEncodings << "CP1254";
651  smEncodings << "CP1255";
652  smEncodings << "CP1256";
653  smEncodings << "CP1257";
654  smEncodings << "CP1258";
655  smEncodings << "Apple Roman";
656  smEncodings << "TIS-620";
657  smEncodings << "System";
658 #endif
659 
660  // Do case-insensitive sorting of encodings
661  std::sort( sEncodings.begin(), sEncodings.end(), _compareEncodings );
662 
663  } );
664 
665  return sEncodings;
666 }
667 
669 {
670  mErrors.clear();
671 }
672 
674 {
675  return !mErrors.isEmpty();
676 }
677 
678 QStringList QgsVectorDataProvider::errors() const
679 {
680  return mErrors;
681 }
682 
684 {
685  return false;
686 }
687 
689 {
690  return false;
691 }
692 
694 {
695  return nullptr;
696 }
697 
699 {
700  return nullptr;
701 }
702 
703 void QgsVectorDataProvider::pushError( const QString &msg ) const
704 {
705  QgsDebugMsg( msg );
706  mErrors << msg;
707  emit raiseError( msg );
708 }
709 
710 QSet<QgsMapLayerDependency> QgsVectorDataProvider::dependencies() const
711 {
712  return QSet<QgsMapLayerDependency>();
713 }
714 
716 {
717  if ( geom.isNull() )
718  {
719  return QgsGeometry();
720  }
721 
722  const QgsAbstractGeometry *geometry = geom.constGet();
723  if ( !geometry )
724  {
725  return QgsGeometry();
726  }
727 
728  QgsWkbTypes::Type providerGeomType = wkbType();
729 
730  //geom is already in the provider geometry type
731  if ( geometry->wkbType() == providerGeomType )
732  {
733  return QgsGeometry();
734  }
735 
736  std::unique_ptr< QgsAbstractGeometry > outputGeom;
737 
738  //convert compoundcurve to circularstring (possible if compoundcurve consists of one circular string)
739  if ( QgsWkbTypes::flatType( providerGeomType ) == QgsWkbTypes::CircularString )
740  {
741  QgsCompoundCurve *compoundCurve = qgsgeometry_cast<QgsCompoundCurve *>( geometry );
742  if ( compoundCurve )
743  {
744  if ( compoundCurve->nCurves() == 1 )
745  {
746  const QgsCircularString *circularString = qgsgeometry_cast<const QgsCircularString *>( compoundCurve->curveAt( 0 ) );
747  if ( circularString )
748  {
749  outputGeom.reset( circularString->clone() );
750  }
751  }
752  }
753  }
754 
755  //convert to curved type if necessary
756  if ( !QgsWkbTypes::isCurvedType( geometry->wkbType() ) && QgsWkbTypes::isCurvedType( providerGeomType ) )
757  {
758  QgsAbstractGeometry *curveGeom = outputGeom ? outputGeom->toCurveType() : geometry->toCurveType();
759  if ( curveGeom )
760  {
761  outputGeom.reset( curveGeom );
762  }
763  }
764 
765  //convert to linear type from curved type
766  if ( QgsWkbTypes::isCurvedType( geometry->wkbType() ) && !QgsWkbTypes::isCurvedType( providerGeomType ) )
767  {
768  QgsAbstractGeometry *segmentizedGeom = outputGeom ? outputGeom->segmentize() : geometry->segmentize();
769  if ( segmentizedGeom )
770  {
771  outputGeom.reset( segmentizedGeom );
772  }
773  }
774 
775  //convert to multitype if necessary
776  if ( QgsWkbTypes::isMultiType( providerGeomType ) && !QgsWkbTypes::isMultiType( geometry->wkbType() ) )
777  {
778  std::unique_ptr< QgsAbstractGeometry > collGeom( QgsGeometryFactory::geomFromWkbType( providerGeomType ) );
779  QgsGeometryCollection *geomCollection = qgsgeometry_cast<QgsGeometryCollection *>( collGeom.get() );
780  if ( geomCollection )
781  {
782  if ( geomCollection->addGeometry( outputGeom ? outputGeom->clone() : geometry->clone() ) )
783  {
784  outputGeom.reset( collGeom.release() );
785  }
786  }
787  }
788 
789  //set z/m types
790  if ( QgsWkbTypes::hasZ( providerGeomType ) )
791  {
792  if ( !outputGeom )
793  {
794  outputGeom.reset( geometry->clone() );
795  }
796  outputGeom->addZValue();
797  }
798 
799  if ( QgsWkbTypes::hasM( providerGeomType ) )
800  {
801  if ( !outputGeom )
802  {
803  outputGeom.reset( geometry->clone() );
804  }
805  outputGeom->addMValue();
806  }
807 
808  if ( outputGeom )
809  {
810  return QgsGeometry( outputGeom.release() );
811  }
812 
813  return QgsGeometry();
814 }
815 
816 void QgsVectorDataProvider::setNativeTypes( const QList<NativeType> &nativeTypes )
817 {
818  mNativeTypes = nativeTypes;
819 }
820 
822 {
823  return mEncoding;
824 }
825 
827 {
828  return false;
829 }
830 
831 QStringList QgsVectorDataProvider::sEncodings;
832 
833 QList<QgsRelation> QgsVectorDataProvider::discoverRelations( const QgsVectorLayer *, const QList<QgsVectorLayer *> & ) const
834 {
835  return QList<QgsRelation>();
836 }
837 
839 {
840 
841 }
int lookupField(const QString &fieldName) const
Looks up field&#39;s index from the field name.
Definition: qgsfields.cpp:324
QgsFeatureId id
Definition: qgsfeature.h:64
QString encoding() const
Returns the encoding which is used for accessing data.
Wrapper for iterator of features from vector data provider or vector layer.
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:41
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.
virtual QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
QgsWkbTypes::Type wkbType() const override=0
Returns the geometry type which is returned by this layer.
QMap< QString, int > fieldNameMap() const
Returns a map where the key is the name of the field and the value is its index.
virtual QgsAbstractGeometry * toCurveType() const =0
Returns the geometry converted to the more generic curve type.
QString name
Definition: qgsfield.h:59
QVariant minimumValue(int index) const override
Returns the minimum value of an attribute.
int precision
Definition: qgsfield.h:56
virtual bool addAttributes(const QList< QgsField > &attributes)
Adds new attributes to the provider.
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
Definition: qgswkbtypes.h:706
FeatureAvailability
Possible return value for hasFeatures() to determine if a source is empty.
Constraint
Constraints which may be present on a field.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
QgsFieldConstraints::Constraints fieldConstraints(int fieldIndex) const
Returns any constraints which are present at the provider for a specified field index.
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 QSet< QgsMapLayerDependency > dependencies() const
Gets the list of layer ids on which this layer depends.
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.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
virtual bool renameAttributes(const QgsFieldNameMap &renamedAttributes)
Renames existing attributes.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
void pushError(const QString &msg) const
Push a notification about errors that happened in this providers scope.
void raiseError(const QString &msg) const
Signals an error in this provider.
Container of fields for a vector layer.
Definition: qgsfields.h:42
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:122
virtual QgsFeatureRenderer * createRenderer(const QVariantMap &configuration=QVariantMap()) const
Creates a new vector layer feature renderer, using provider backend specific information.
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
QList< QgsVectorDataProvider::NativeType > nativeTypes() const
Returns the names of the supported types.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
int count() const
Returns number of items.
Definition: qgsfields.cpp:133
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:917
QgsVectorDataProvider(const QString &uri=QString(), const QgsDataProvider::ProviderOptions &providerOptions=QgsDataProvider::ProviderOptions())
Constructor for a vector data provider.
virtual bool createAttributeIndex(int field)
Create an attribute index on the datasource.
bool supportedType(const QgsField &field) const
check if provider supports type of field
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
Definition: qgsfields.cpp:163
int length
Definition: qgsfield.h:55
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:45
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...
void setNativeTypes(const QList< QgsVectorDataProvider::NativeType > &nativeTypes)
Set the list of native types supported by this provider.
Allows creation of spatial index.
QSet< int > QgsAttributeIds
virtual bool createSpatialIndex()
Creates a spatial index on the datasource (if supported by the provider type).
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
Can create indexes on provider&#39;s fields.
QgsAttributeList allAttributesList() const
Utility function to get list of attribute indexes.
Definition: qgsfields.cpp:351
void fillMinMaxCache() const
Populates the cache of minimum and maximum attribute values.
Allows addition of new attributes (fields)
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
void clearMinMaxCache()
Invalidates the min/max cache.
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).
QStringList errors() const
Gets recorded errors.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
virtual QString defaultValueClause(int fieldIndex) const
Returns any default value clauses which are present at the provider for a specified field index...
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
int fieldNameIndex(const QString &fieldName) const
Returns the index of a field name or -1 if the field does not exist.
virtual QVariant aggregate(QgsAggregateCalculator::Aggregate aggregate, int index, const QgsAggregateCalculator::AggregateParameters &parameters, QgsExpressionContext *context, bool &ok, QgsFeatureIds *fids=nullptr) const
Calculates an aggregated value from the layer&#39;s features.
Allows modifications of geometries.
void clearErrors()
Clear recorded errors.
QgsGeometry convertToProviderType(const QgsGeometry &geom) const
Converts the geometry to the provider type if possible / necessary.
virtual bool isDeleteStyleFromDatabaseSupported() const
It returns false by default.
virtual QgsTransaction * transaction() const
Returns the transaction this data provider is included in, if any.
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:49
QgsCoordinateReferenceSystem sourceCrs() const override
Returns the coordinate reference system for features in the source.
virtual bool isSaveAndLoadStyleToDatabaseSupported() const
It returns false by default.
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.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
QMap< int, QString > QgsFieldNameMap
Definition: qgsattributes.h:44
virtual QgsAbstractVectorLayerLabeling * createLabeling(const QVariantMap &configuration=QVariantMap()) const
Creates labeling settings, using provider backend specific information.
Supports circular geometry types (circularstring, compoundcurve, curvepolygon)
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
int nCurves() const
Returns the number of curves in the geometry.
Supports topological simplification of geometries on provider side according to a distance tolerance...
QString capabilitiesString() const
Returns the above in friendly format.
Setting options for creating vector data providers.
QgsFieldConstraints constraints
Definition: qgsfield.h:62
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:55
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
Definition: qgsfeature.h:557
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const override=0
Query the provider for features specified in request.
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:755
QgsCircularString * clone() const override
Clones the geometry by performing a deep copy.
bool hasErrors() const
Provider has errors to report.
virtual bool truncate()
Removes all features from the layer.
virtual QString dataComment() const
Returns a short comment for the data that this provider is providing access to (e.g.
This class represents a coordinate reference system (CRS).
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.
const QgsCurve * curveAt(int i) const
Returns the curve at the specified index.
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
virtual QgsAttributeList attributeIndexes() const
Returns list of indexes to fetch all attributes in nextFeature()
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.
virtual bool deleteAttributes(const QgsAttributeIds &attributes)
Deletes existing attributes from the provider.
virtual void handlePostCloneOperations(QgsVectorDataProvider *source)
Handles any post-clone operations required after this vector data provider was cloned from the source...
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:967
Compound curve geometry type.
Circular string geometry type.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
virtual QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
QList< int > QgsAttributeList
Definition: qgsfield.h:26
bool nextFeature(QgsFeature &f)
Provider has no capabilities.
This is the base class for vector data providers.
virtual QgsAttrPalIndexNameHash palAttributeIndexNames() const
Returns list of indexes to names for QgsPalLabeling fix.
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 bool empty() const
Returns true if the layer does not contain any feature.
Represents a vector layer which manages a vector based data sets.
QTextCodec * textEncoding() const
Gets this providers encoding.
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
Definition: qgsfeature.cpp:262
static Type flatType(Type type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:576
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
QHash< int, QString > QgsAttrPalIndexNameHash
Allows modification of attribute values.
QVariant::Type type
Definition: qgsfield.h:57
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.
virtual QVariant defaultValue(int fieldIndex) const
Returns any literal default values which are present at the provider for a specified field index...
virtual QList< QgsRelation > discoverRelations(const QgsVectorLayer *self, const QList< QgsVectorLayer *> &layers) const
Discover the available relations with the given layers.