QGIS API Documentation  3.2.0-Bonn (bc43194)
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 
38  : QgsDataProvider( uri, options )
39 {
40  QgsSettings settings;
41  setEncoding( settings.value( QStringLiteral( "UI/encoding" ), "System" ).toString() );
42 }
43 
45 {
46  return QStringLiteral( "Generic vector file" );
47 }
48 
50 {
51  return crs();
52 }
53 
55 {
56  return extent();
57 }
58 
60 {
61  return QString();
62 }
63 
65 {
66  Q_UNUSED( flist );
67  Q_UNUSED( flags );
68  return false;
69 }
70 
72 {
73  Q_UNUSED( ids );
74  return false;
75 }
76 
78 {
79  if ( !( capabilities() & DeleteFeatures ) )
80  return false;
81 
82  QgsFeatureIds toDelete;
84  QgsFeature f;
85  while ( it.nextFeature( f ) )
86  toDelete << f.id();
87 
88  return deleteFeatures( toDelete );
89 }
90 
91 bool QgsVectorDataProvider::addAttributes( const QList<QgsField> &attributes )
92 {
93  Q_UNUSED( attributes );
94  return false;
95 }
96 
98 {
99  Q_UNUSED( attributes );
100  return false;
101 }
102 
104 {
105  Q_UNUSED( renamedAttributes );
106  return false;
107 }
108 
110 {
111  Q_UNUSED( attr_map );
112  return false;
113 }
114 
115 QVariant QgsVectorDataProvider::defaultValue( int fieldId ) const
116 {
117  Q_UNUSED( fieldId );
118  return QVariant();
119 }
120 
121 QString QgsVectorDataProvider::defaultValueClause( int fieldIndex ) const
122 {
123  Q_UNUSED( fieldIndex );
124  return QString();
125 }
126 
127 QgsFieldConstraints::Constraints QgsVectorDataProvider::fieldConstraints( int fieldIndex ) const
128 {
129  QgsFields f = fields();
130  if ( fieldIndex < 0 || fieldIndex >= f.count() )
131  return nullptr;
132 
133  return f.at( fieldIndex ).constraints().constraints();
134 }
135 
137 {
138  return false;
139 }
140 
142 {
143  Q_UNUSED( geometry_map );
144  return false;
145 }
146 
148  const QgsGeometryMap &geometry_map )
149 {
151  return false;
152 
153  bool result = true;
154  result = result && changeAttributeValues( attr_map );
155  result = result && changeGeometryValues( geometry_map );
156  return result;
157 }
158 
160 {
161  return false;
162 }
163 
165 {
166  Q_UNUSED( field );
167  return true;
168 }
169 
170 QgsVectorDataProvider::Capabilities QgsVectorDataProvider::capabilities() const
171 {
173 }
174 
175 
176 void QgsVectorDataProvider::setEncoding( const QString &e )
177 {
178  mEncoding = QTextCodec::codecForName( e.toLocal8Bit().constData() );
179 
180  if ( !mEncoding && e != QLatin1String( "System" ) )
181  {
182  QgsMessageLog::logMessage( tr( "Codec %1 not found. Falling back to system locale" ).arg( e ) );
183  mEncoding = QTextCodec::codecForName( "System" );
184  }
185 
186  if ( !mEncoding )
187  mEncoding = QTextCodec::codecForLocale();
188 
189  Q_ASSERT( mEncoding );
190 }
191 
193 {
194  if ( mEncoding )
195  {
196  return mEncoding->name();
197  }
198 
199  return QLatin1String( "" );
200 }
201 
203 {
204  QStringList abilitiesList;
205 
206  int abilities = capabilities();
207 
208  if ( abilities & QgsVectorDataProvider::AddFeatures )
209  {
210  abilitiesList += tr( "Add Features" );
211  }
212 
213  if ( abilities & QgsVectorDataProvider::DeleteFeatures )
214  {
215  abilitiesList += tr( "Delete Features" );
216  }
217 
219  {
220  abilitiesList += tr( "Change Attribute Values" );
221  }
222 
223  if ( abilities & QgsVectorDataProvider::AddAttributes )
224  {
225  abilitiesList += tr( "Add Attributes" );
226  }
227 
228  if ( abilities & QgsVectorDataProvider::DeleteAttributes )
229  {
230  abilitiesList += tr( "Delete Attributes" );
231  }
232 
233  if ( abilities & QgsVectorDataProvider::RenameAttributes )
234  {
235  abilitiesList += tr( "Rename Attributes" );
236  }
237 
239  {
240  // TODO: Tighten up this test. See QgsOgrProvider for details.
241  abilitiesList += tr( "Create Spatial Index" );
242  }
243 
245  {
246  abilitiesList += tr( "Create Attribute Indexes" );
247  }
248 
249  if ( abilities & QgsVectorDataProvider::SelectAtId )
250  {
251  abilitiesList += tr( "Fast Access to Features at ID" );
252  }
253 
254  if ( abilities & QgsVectorDataProvider::ChangeGeometries )
255  {
256  abilitiesList += tr( "Change Geometries" );
257  }
258 
260  {
261  abilitiesList += tr( "Presimplify Geometries" );
262  }
263 
265  {
266  abilitiesList += tr( "Presimplify Geometries with Validity Check" );
267  }
268 
269  if ( abilities & QgsVectorDataProvider::ChangeFeatures )
270  {
271  abilitiesList += tr( "Simultaneous Geometry and Attribute Updates" );
272  }
273 
275  {
276  abilitiesList += tr( "Transactions" );
277  }
278 
280  {
281  abilitiesList += tr( "Curved Geometries" );
282  }
283 
284  return abilitiesList.join( QStringLiteral( ", " ) );
285 }
286 
287 
288 int QgsVectorDataProvider::fieldNameIndex( const QString &fieldName ) const
289 {
290  return fields().lookupField( fieldName );
291 }
292 
293 QMap<QString, int> QgsVectorDataProvider::fieldNameMap() const
294 {
295  QMap<QString, int> resultMap;
296 
297  QgsFields fieldsCopy = fields();
298  for ( int i = 0; i < fieldsCopy.count(); ++i )
299  {
300  resultMap.insert( fieldsCopy.at( i ).name(), i );
301  }
302 
303  return resultMap;
304 }
305 
307 {
308  return fields().allAttributesList();
309 }
310 
312 {
313  return QgsAttributeList();
314 }
315 
316 QList<QgsVectorDataProvider::NativeType> QgsVectorDataProvider::nativeTypes() const
317 {
318  return mNativeTypes;
319 }
320 
322 {
323  return QgsAttrPalIndexNameHash();
324 }
325 
327 {
328  QgsDebugMsgLevel( QString( "field name = %1 type = %2 length = %3 precision = %4" )
329  .arg( field.name(),
330  QVariant::typeToName( field.type() ) )
331  .arg( field.length() )
332  .arg( field.precision() ), 2 );
333 
334  Q_FOREACH ( const NativeType &nativeType, mNativeTypes )
335  {
336  QgsDebugMsgLevel( QString( "native field type = %1 min length = %2 max length = %3 min precision = %4 max precision = %5" )
337  .arg( QVariant::typeToName( nativeType.mType ) )
338  .arg( nativeType.mMinLen )
339  .arg( nativeType.mMaxLen )
340  .arg( nativeType.mMinPrec )
341  .arg( nativeType.mMaxPrec ), 2 );
342 
343  if ( field.type() != nativeType.mType )
344  continue;
345 
346  if ( field.length() > 0 )
347  {
348  // source length limited
349  if ( ( nativeType.mMinLen > 0 && field.length() < nativeType.mMinLen ) ||
350  ( nativeType.mMaxLen > 0 && field.length() > nativeType.mMaxLen ) )
351  {
352  // source length exceeds destination limits
353  continue;
354  }
355  }
356 
357  if ( field.precision() > 0 )
358  {
359  // source precision limited
360  if ( ( nativeType.mMinPrec > 0 && field.precision() < nativeType.mMinPrec ) ||
361  ( nativeType.mMaxPrec > 0 && field.precision() > nativeType.mMaxPrec ) )
362  {
363  // source precision exceeds destination limits
364  continue;
365  }
366  }
367 
368  QgsDebugMsg( "native type matches" );
369  return true;
370  }
371 
372  QgsDebugMsg( "no sufficient native type found" );
373  return false;
374 }
375 
376 QVariant QgsVectorDataProvider::minimumValue( int index ) const
377 {
378  if ( index < 0 || index >= fields().count() )
379  {
380  QgsDebugMsg( "Warning: access requested to invalid field index: " + QString::number( index ) );
381  return QVariant();
382  }
383 
384  fillMinMaxCache();
385 
386  if ( !mCacheMinValues.contains( index ) )
387  return QVariant();
388 
389  return mCacheMinValues[index];
390 }
391 
392 QVariant QgsVectorDataProvider::maximumValue( int index ) const
393 {
394  if ( index < 0 || index >= fields().count() )
395  {
396  QgsDebugMsg( "Warning: access requested to invalid field index: " + QString::number( index ) );
397  return QVariant();
398  }
399 
400  fillMinMaxCache();
401 
402  if ( !mCacheMaxValues.contains( index ) )
403  return QVariant();
404 
405  return mCacheMaxValues[index];
406 }
407 
408 
409 QStringList QgsVectorDataProvider::uniqueStringsMatching( int index, const QString &substring, int limit, QgsFeedback *feedback ) const
410 {
411  QStringList results;
412 
413  // Safety belt
414  if ( index < 0 || index >= fields().count() )
415  return results;
416 
417  QgsFeature f;
418  QgsAttributeList keys;
419  keys.append( index );
420 
421  QgsFeatureRequest request;
422  request.setSubsetOfAttributes( keys );
424  QString fieldName = fields().at( index ).name();
425  request.setFilterExpression( QStringLiteral( "\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
426  QgsFeatureIterator fi = getFeatures( request );
427 
428  QSet<QString> set;
429 
430  while ( fi.nextFeature( f ) )
431  {
432  QString value = f.attribute( index ).toString();
433  if ( !set.contains( value ) )
434  {
435  results.append( value );
436  set.insert( value );
437  }
438 
439  if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->isCanceled() ) )
440  break;
441  }
442  return results;
443 }
444 
446  const QgsAggregateCalculator::AggregateParameters &parameters, QgsExpressionContext *context, bool &ok ) const
447 {
448  //base implementation does nothing
449  Q_UNUSED( aggregate );
450  Q_UNUSED( index );
451  Q_UNUSED( parameters );
452  Q_UNUSED( context );
453 
454  ok = false;
455  return QVariant();
456 }
457 
459 {
460  mCacheMinMaxDirty = true;
461  mCacheMinValues.clear();
462  mCacheMaxValues.clear();
463 }
464 
466 {
467  if ( !mCacheMinMaxDirty )
468  return;
469 
470  QgsFields flds = fields();
471  for ( int i = 0; i < flds.count(); ++i )
472  {
473  if ( flds.at( i ).type() == QVariant::Int )
474  {
475  mCacheMinValues[i] = QVariant( std::numeric_limits<int>::max() );
476  mCacheMaxValues[i] = QVariant( std::numeric_limits<int>::lowest() );
477  }
478  else if ( flds.at( i ).type() == QVariant::LongLong )
479  {
480  mCacheMinValues[i] = QVariant( std::numeric_limits<qlonglong>::max() );
481  mCacheMaxValues[i] = QVariant( std::numeric_limits<qlonglong>::lowest() );
482  }
483  else if ( flds.at( i ).type() == QVariant::Double )
484  {
485  mCacheMinValues[i] = QVariant( std::numeric_limits<double>::max() );
486  mCacheMaxValues[i] = QVariant( std::numeric_limits<double>::lowest() );
487 
488  }
489  else
490  {
491  mCacheMinValues[i] = QVariant();
492  mCacheMaxValues[i] = QVariant();
493  }
494  }
495 
496  QgsFeature f;
497  const QgsAttributeList keys = mCacheMinValues.keys();
498  QgsFeatureIterator fi = getFeatures( QgsFeatureRequest().setSubsetOfAttributes( keys )
499  .setFlags( QgsFeatureRequest::NoGeometry ) );
500 
501  while ( fi.nextFeature( f ) )
502  {
503  QgsAttributes attrs = f.attributes();
504  for ( int attributeIndex : keys )
505  {
506  const QVariant &varValue = attrs.at( attributeIndex );
507 
508  if ( varValue.isNull() )
509  continue;
510 
511  switch ( flds.at( attributeIndex ).type() )
512  {
513  case QVariant::Int:
514  {
515  int value = varValue.toInt();
516  if ( value < mCacheMinValues[ attributeIndex ].toInt() )
517  mCacheMinValues[ attributeIndex ] = value;
518  if ( value > mCacheMaxValues[ attributeIndex ].toInt() )
519  mCacheMaxValues[ attributeIndex ] = value;
520  break;
521  }
522  case QVariant::LongLong:
523  {
524  qlonglong value = varValue.toLongLong();
525  if ( value < mCacheMinValues[ attributeIndex ].toLongLong() )
526  mCacheMinValues[ attributeIndex ] = value;
527  if ( value > mCacheMaxValues[ attributeIndex ].toLongLong() )
528  mCacheMaxValues[ attributeIndex ] = value;
529  break;
530  }
531  case QVariant::Double:
532  {
533  double value = varValue.toDouble();
534  if ( value < mCacheMinValues[ attributeIndex ].toDouble() )
535  mCacheMinValues[attributeIndex ] = value;
536  if ( value > mCacheMaxValues[ attributeIndex ].toDouble() )
537  mCacheMaxValues[ attributeIndex ] = value;
538  break;
539  }
540  default:
541  {
542  QString value = varValue.toString();
543  if ( mCacheMinValues[ attributeIndex ].isNull() || value < mCacheMinValues[attributeIndex ].toString() )
544  {
545  mCacheMinValues[attributeIndex] = value;
546  }
547  if ( mCacheMaxValues[attributeIndex].isNull() || value > mCacheMaxValues[attributeIndex].toString() )
548  {
549  mCacheMaxValues[attributeIndex] = value;
550  }
551  break;
552  }
553  }
554  }
555  }
556 
557  mCacheMinMaxDirty = false;
558 }
559 
560 QVariant QgsVectorDataProvider::convertValue( QVariant::Type type, const QString &value )
561 {
562  QVariant v( value );
563 
564  if ( !v.convert( type ) || value.isNull() )
565  v = QVariant( type );
566 
567  return v;
568 }
569 
571 {
572  return nullptr;
573 }
574 
576 {
577  emit dataChanged();
578 }
579 
580 static bool _compareEncodings( const QString &s1, const QString &s2 )
581 {
582  return s1.toLower() < s2.toLower();
583 }
584 
586 {
587  if ( sEncodings.isEmpty() )
588  {
589  Q_FOREACH ( const QString &codec, QTextCodec::availableCodecs() )
590  {
591  sEncodings << codec;
592  }
593 #if 0
594  smEncodings << "BIG5";
595  smEncodings << "BIG5-HKSCS";
596  smEncodings << "EUCJP";
597  smEncodings << "EUCKR";
598  smEncodings << "GB2312";
599  smEncodings << "GBK";
600  smEncodings << "GB18030";
601  smEncodings << "JIS7";
602  smEncodings << "SHIFT-JIS";
603  smEncodings << "TSCII";
604  smEncodings << "UTF-8";
605  smEncodings << "UTF-16";
606  smEncodings << "KOI8-R";
607  smEncodings << "KOI8-U";
608  smEncodings << "ISO8859-1";
609  smEncodings << "ISO8859-2";
610  smEncodings << "ISO8859-3";
611  smEncodings << "ISO8859-4";
612  smEncodings << "ISO8859-5";
613  smEncodings << "ISO8859-6";
614  smEncodings << "ISO8859-7";
615  smEncodings << "ISO8859-8";
616  smEncodings << "ISO8859-8-I";
617  smEncodings << "ISO8859-9";
618  smEncodings << "ISO8859-10";
619  smEncodings << "ISO8859-11";
620  smEncodings << "ISO8859-12";
621  smEncodings << "ISO8859-13";
622  smEncodings << "ISO8859-14";
623  smEncodings << "ISO8859-15";
624  smEncodings << "IBM 850";
625  smEncodings << "IBM 866";
626  smEncodings << "CP874";
627  smEncodings << "CP1250";
628  smEncodings << "CP1251";
629  smEncodings << "CP1252";
630  smEncodings << "CP1253";
631  smEncodings << "CP1254";
632  smEncodings << "CP1255";
633  smEncodings << "CP1256";
634  smEncodings << "CP1257";
635  smEncodings << "CP1258";
636  smEncodings << "Apple Roman";
637  smEncodings << "TIS-620";
638  smEncodings << "System";
639 #endif
640  }
641 
642  // Do case-insensitive sorting of encodings
643  std::sort( sEncodings.begin(), sEncodings.end(), _compareEncodings );
644 
645  return sEncodings;
646 }
647 
649 {
650  mErrors.clear();
651 }
652 
654 {
655  return !mErrors.isEmpty();
656 }
657 
658 QStringList QgsVectorDataProvider::errors() const
659 {
660  return mErrors;
661 }
662 
664 {
665  return false;
666 }
667 
669 {
670  return false;
671 }
672 
674 {
675  return nullptr;
676 }
677 
678 void QgsVectorDataProvider::pushError( const QString &msg ) const
679 {
680  QgsDebugMsg( msg );
681  mErrors << msg;
682  emit raiseError( msg );
683 }
684 
685 QSet<QgsMapLayerDependency> QgsVectorDataProvider::dependencies() const
686 {
687  return QSet<QgsMapLayerDependency>();
688 }
689 
691 {
692  if ( geom.isNull() )
693  {
694  return QgsGeometry();
695  }
696 
697  const QgsAbstractGeometry *geometry = geom.constGet();
698  if ( !geometry )
699  {
700  return QgsGeometry();
701  }
702 
703  QgsWkbTypes::Type providerGeomType = wkbType();
704 
705  //geom is already in the provider geometry type
706  if ( geometry->wkbType() == providerGeomType )
707  {
708  return QgsGeometry();
709  }
710 
711  std::unique_ptr< QgsAbstractGeometry > outputGeom;
712 
713  //convert compoundcurve to circularstring (possible if compoundcurve consists of one circular string)
714  if ( QgsWkbTypes::flatType( providerGeomType ) == QgsWkbTypes::CircularString )
715  {
716  QgsCompoundCurve *compoundCurve = qgsgeometry_cast<QgsCompoundCurve *>( geometry );
717  if ( compoundCurve )
718  {
719  if ( compoundCurve->nCurves() == 1 )
720  {
721  const QgsCircularString *circularString = qgsgeometry_cast<const QgsCircularString *>( compoundCurve->curveAt( 0 ) );
722  if ( circularString )
723  {
724  outputGeom.reset( circularString->clone() );
725  }
726  }
727  }
728  }
729 
730  //convert to curved type if necessary
731  if ( !QgsWkbTypes::isCurvedType( geometry->wkbType() ) && QgsWkbTypes::isCurvedType( providerGeomType ) )
732  {
733  QgsAbstractGeometry *curveGeom = outputGeom ? outputGeom->toCurveType() : geometry->toCurveType();
734  if ( curveGeom )
735  {
736  outputGeom.reset( curveGeom );
737  }
738  }
739 
740  //convert to linear type from curved type
741  if ( QgsWkbTypes::isCurvedType( geometry->wkbType() ) && !QgsWkbTypes::isCurvedType( providerGeomType ) )
742  {
743  QgsAbstractGeometry *segmentizedGeom = outputGeom ? outputGeom->segmentize() : geometry->segmentize();
744  if ( segmentizedGeom )
745  {
746  outputGeom.reset( segmentizedGeom );
747  }
748  }
749 
750  //convert to multitype if necessary
751  if ( QgsWkbTypes::isMultiType( providerGeomType ) && !QgsWkbTypes::isMultiType( geometry->wkbType() ) )
752  {
753  std::unique_ptr< QgsAbstractGeometry > collGeom( QgsGeometryFactory::geomFromWkbType( providerGeomType ) );
754  QgsGeometryCollection *geomCollection = qgsgeometry_cast<QgsGeometryCollection *>( collGeom.get() );
755  if ( geomCollection )
756  {
757  if ( geomCollection->addGeometry( outputGeom ? outputGeom->clone() : geometry->clone() ) )
758  {
759  outputGeom.reset( collGeom.release() );
760  }
761  }
762  }
763 
764  //set z/m types
765  if ( QgsWkbTypes::hasZ( providerGeomType ) )
766  {
767  if ( !outputGeom )
768  {
769  outputGeom.reset( geometry->clone() );
770  }
771  outputGeom->addZValue();
772  }
773 
774  if ( QgsWkbTypes::hasM( providerGeomType ) )
775  {
776  if ( !outputGeom )
777  {
778  outputGeom.reset( geometry->clone() );
779  }
780  outputGeom->addMValue();
781  }
782 
783  if ( outputGeom )
784  {
785  return QgsGeometry( outputGeom.release() );
786  }
787 
788  return QgsGeometry();
789 }
790 
791 void QgsVectorDataProvider::setNativeTypes( const QList<NativeType> &nativeTypes )
792 {
793  mNativeTypes = nativeTypes;
794 }
795 
797 {
798  return mEncoding;
799 }
800 
802 {
803  return false;
804 }
805 
806 QStringList QgsVectorDataProvider::sEncodings;
807 
808 QList<QgsRelation> QgsVectorDataProvider::discoverRelations( const QgsVectorLayer *, const QList<QgsVectorLayer *> & ) const
809 {
810  return QList<QgsRelation>();
811 }
int lookupField(const QString &fieldName) const
Look up field&#39;s index from the field name.
Definition: qgsfields.cpp:299
QgsFeatureId id
Definition: qgsfeature.h:71
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:537
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.
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:57
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() )...
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:557
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
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeature.h:544
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:549
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:104
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:62
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:115
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:768
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:145
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 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:67
Can create indexes on provider&#39;s fields.
QgsAttributeList allAttributesList() const
Utility function to get list of attribute indexes.
Definition: qgsfields.cpp:326
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.
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.
#define SIP_FACTORY
Definition: qgis_sip.h:69
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:45
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.
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:60
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
Definition: qgsfeature.h:528
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:606
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.
virtual QgsAttributeList attributeIndexes() const
Returns list of indexes to fetch all attributes in nextFeature()
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:818
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:58
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:255
static Type flatType(Type type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:427
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:55
QgsAttributes attributes
Definition: qgsfeature.h:72
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.