QGIS API Documentation  3.6.0-Noosa (5873452)
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 
703 {
704  return nullptr;
705 }
706 
707 void QgsVectorDataProvider::pushError( const QString &msg ) const
708 {
709  QgsDebugMsg( msg );
710  mErrors << msg;
711  emit raiseError( msg );
712 }
713 
714 QSet<QgsMapLayerDependency> QgsVectorDataProvider::dependencies() const
715 {
716  return QSet<QgsMapLayerDependency>();
717 }
718 
720 {
721  if ( geom.isNull() )
722  {
723  return QgsGeometry();
724  }
725 
726  const QgsAbstractGeometry *geometry = geom.constGet();
727  if ( !geometry )
728  {
729  return QgsGeometry();
730  }
731 
732  QgsWkbTypes::Type providerGeomType = wkbType();
733 
734  //geom is already in the provider geometry type
735  if ( geometry->wkbType() == providerGeomType )
736  {
737  return QgsGeometry();
738  }
739 
740  std::unique_ptr< QgsAbstractGeometry > outputGeom;
741 
742  //convert compoundcurve to circularstring (possible if compoundcurve consists of one circular string)
743  if ( QgsWkbTypes::flatType( providerGeomType ) == QgsWkbTypes::CircularString )
744  {
745  QgsCompoundCurve *compoundCurve = qgsgeometry_cast<QgsCompoundCurve *>( geometry );
746  if ( compoundCurve )
747  {
748  if ( compoundCurve->nCurves() == 1 )
749  {
750  const QgsCircularString *circularString = qgsgeometry_cast<const QgsCircularString *>( compoundCurve->curveAt( 0 ) );
751  if ( circularString )
752  {
753  outputGeom.reset( circularString->clone() );
754  }
755  }
756  }
757  }
758 
759  //convert to curved type if necessary
760  if ( !QgsWkbTypes::isCurvedType( geometry->wkbType() ) && QgsWkbTypes::isCurvedType( providerGeomType ) )
761  {
762  QgsAbstractGeometry *curveGeom = outputGeom ? outputGeom->toCurveType() : geometry->toCurveType();
763  if ( curveGeom )
764  {
765  outputGeom.reset( curveGeom );
766  }
767  }
768 
769  //convert to linear type from curved type
770  if ( QgsWkbTypes::isCurvedType( geometry->wkbType() ) && !QgsWkbTypes::isCurvedType( providerGeomType ) )
771  {
772  QgsAbstractGeometry *segmentizedGeom = outputGeom ? outputGeom->segmentize() : geometry->segmentize();
773  if ( segmentizedGeom )
774  {
775  outputGeom.reset( segmentizedGeom );
776  }
777  }
778 
779  //convert to multitype if necessary
780  if ( QgsWkbTypes::isMultiType( providerGeomType ) && !QgsWkbTypes::isMultiType( geometry->wkbType() ) )
781  {
782  std::unique_ptr< QgsAbstractGeometry > collGeom( QgsGeometryFactory::geomFromWkbType( providerGeomType ) );
783  QgsGeometryCollection *geomCollection = qgsgeometry_cast<QgsGeometryCollection *>( collGeom.get() );
784  if ( geomCollection )
785  {
786  if ( geomCollection->addGeometry( outputGeom ? outputGeom->clone() : geometry->clone() ) )
787  {
788  outputGeom.reset( collGeom.release() );
789  }
790  }
791  }
792 
793  //set z/m types
794  if ( QgsWkbTypes::hasZ( providerGeomType ) )
795  {
796  if ( !outputGeom )
797  {
798  outputGeom.reset( geometry->clone() );
799  }
800  outputGeom->addZValue();
801  }
802 
803  if ( QgsWkbTypes::hasM( providerGeomType ) )
804  {
805  if ( !outputGeom )
806  {
807  outputGeom.reset( geometry->clone() );
808  }
809  outputGeom->addMValue();
810  }
811 
812  if ( outputGeom )
813  {
814  return QgsGeometry( outputGeom.release() );
815  }
816 
817  return QgsGeometry();
818 }
819 
820 void QgsVectorDataProvider::setNativeTypes( const QList<NativeType> &nativeTypes )
821 {
822  mNativeTypes = nativeTypes;
823 }
824 
826 {
827  return mEncoding;
828 }
829 
831 {
832  return false;
833 }
834 
835 QStringList QgsVectorDataProvider::sEncodings;
836 
837 QList<QgsRelation> QgsVectorDataProvider::discoverRelations( const QgsVectorLayer *, const QList<QgsVectorLayer *> & ) const
838 {
839  return QList<QgsRelation>();
840 }
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
Gets 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:58
QVariant minimumValue(int index) const override
Returns the minimum value of an attribute.
int precision
Definition: qgsfield.h:55
virtual bool addAttributes(const QList< QgsField > &attributes)
Adds new attributes to the provider.
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.
This class is a composition of two QSettings instances:
Definition: qgssettings.h:58
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
Definition: qgswkbtypes.h:559
FeatureAvailability
Possible return value for hasFeatures() to determine if a source is empty.
Constraint
Constraints which may be present on a field.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
#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:106
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:770
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:54
void dataChanged()
Emitted whenever a change is made to the data provider which may have caused changes in the provider&#39;...
Base class for feedback objects to be used for cancelation of something running in a worker thread...
Definition: qgsfeedback.h:44
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.
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:48
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
QgsVectorDataProvider(const QString &uri=QString(), const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Constructor for a vector data provider.
virtual QgsAbstractVectorLayerLabeling * createLabeling(const QVariantMap &configuration=QVariantMap()) const
Creates labeling settings, using provider backend specific information.
Supports circular geometry types (circularstring, compoundcurve, curvepolygon)
virtual void forceReload()
Forces a reload of the underlying datasource if the provider implements this method.
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:61
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
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:608
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.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:820
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:27
bool nextFeature(QgsFeature &f)
Provider has no capabilities.
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 contains at least one 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:429
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:56
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.