42 setEncoding( settings.
value( QStringLiteral(
"UI/encoding" ),
"System" ).toString() );
47 return QStringLiteral(
"Generic vector file" );
66 return QgsFeatureSource::FeatureAvailability::NoFeaturesAvailable;
68 return QgsFeatureSource::FeatureAvailability::FeaturesAvailable;
115 Q_UNUSED( attributes );
121 Q_UNUSED( attributes );
127 Q_UNUSED( renamedAttributes );
133 Q_UNUSED( attr_map );
145 Q_UNUSED( fieldIndex );
152 if ( fieldIndex < 0 || fieldIndex >= f.
count() )
165 Q_UNUSED( geometry_map );
200 mEncoding = QTextCodec::codecForName( e.toLocal8Bit().constData() );
202 if ( !mEncoding && e != QLatin1String(
"System" ) )
205 mEncoding = QTextCodec::codecForName(
"System" );
209 mEncoding = QTextCodec::codecForLocale();
211 Q_ASSERT( mEncoding );
218 return mEncoding->name();
226 QStringList abilitiesList;
232 abilitiesList += tr(
"Add Features" );
237 abilitiesList += tr(
"Delete Features" );
242 abilitiesList += tr(
"Change Attribute Values" );
247 abilitiesList += tr(
"Add Attributes" );
252 abilitiesList += tr(
"Delete Attributes" );
257 abilitiesList += tr(
"Rename Attributes" );
263 abilitiesList += tr(
"Create Spatial Index" );
268 abilitiesList += tr(
"Create Attribute Indexes" );
273 abilitiesList += tr(
"Fast Access to Features at ID" );
278 abilitiesList += tr(
"Change Geometries" );
283 abilitiesList += tr(
"Presimplify Geometries" );
288 abilitiesList += tr(
"Presimplify Geometries with Validity Check" );
293 abilitiesList += tr(
"Simultaneous Geometry and Attribute Updates" );
298 abilitiesList += tr(
"Transactions" );
303 abilitiesList += tr(
"Curved Geometries" );
306 return abilitiesList.join( QStringLiteral(
", " ) );
317 QMap<QString, int> resultMap;
320 for (
int i = 0; i < fieldsCopy.
count(); ++i )
322 resultMap.insert( fieldsCopy.
at( i ).
name(), i );
350 QgsDebugMsgLevel( QStringLiteral(
"field name = %1 type = %2 length = %3 precision = %4" )
352 QVariant::typeToName( field.
type() ) )
356 Q_FOREACH (
const NativeType &nativeType, mNativeTypes )
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 ) )
390 QgsDebugMsg( QStringLiteral(
"native type matches" ) );
394 QgsDebugMsg( QStringLiteral(
"no sufficient native type found" ) );
400 if ( index < 0 || index >=
fields().count() )
402 QgsDebugMsg(
"Warning: access requested to invalid field index: " + QString::number( index ) );
408 if ( !mCacheMinValues.contains( index ) )
411 return mCacheMinValues[index];
416 if ( index < 0 || index >=
fields().count() )
418 QgsDebugMsg(
"Warning: access requested to invalid field index: " + QString::number( index ) );
424 if ( !mCacheMaxValues.contains( index ) )
427 return mCacheMaxValues[index];
436 if ( index < 0 || index >=
fields().count() )
441 keys.append( index );
447 request.
setFilterExpression( QStringLiteral(
"\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
454 QString value = f.
attribute( index ).toString();
455 if ( !
set.contains( value ) )
457 results.append( value );
461 if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->
isCanceled() ) )
471 Q_UNUSED( aggregate );
473 Q_UNUSED( parameters );
482 mCacheMinMaxDirty =
true;
483 mCacheMinValues.clear();
484 mCacheMaxValues.clear();
489 if ( !mCacheMinMaxDirty )
493 for (
int i = 0; i < flds.
count(); ++i )
495 if ( flds.
at( i ).
type() == QVariant::Int )
497 mCacheMinValues[i] = QVariant( std::numeric_limits<int>::max() );
498 mCacheMaxValues[i] = QVariant( std::numeric_limits<int>::lowest() );
500 else if ( flds.
at( i ).
type() == QVariant::LongLong )
502 mCacheMinValues[i] = QVariant( std::numeric_limits<qlonglong>::max() );
503 mCacheMaxValues[i] = QVariant( std::numeric_limits<qlonglong>::lowest() );
505 else if ( flds.
at( i ).
type() == QVariant::Double )
507 mCacheMinValues[i] = QVariant( std::numeric_limits<double>::max() );
508 mCacheMaxValues[i] = QVariant( std::numeric_limits<double>::lowest() );
513 mCacheMinValues[i] = QVariant();
514 mCacheMaxValues[i] = QVariant();
526 for (
int attributeIndex : keys )
528 const QVariant &varValue = attrs.at( attributeIndex );
530 if ( varValue.isNull() )
533 switch ( flds.
at( attributeIndex ).
type() )
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;
544 case QVariant::LongLong:
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;
553 case QVariant::Double:
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;
564 QString value = varValue.toString();
565 if ( mCacheMinValues[ attributeIndex ].isNull() || value < mCacheMinValues[attributeIndex ].toString() )
567 mCacheMinValues[attributeIndex] = value;
569 if ( mCacheMaxValues[attributeIndex].isNull() || value > mCacheMaxValues[attributeIndex].toString() )
571 mCacheMaxValues[attributeIndex] = value;
579 mCacheMinMaxDirty =
false;
586 if ( !v.convert( type ) || value.isNull() )
587 v = QVariant( type );
602 static bool _compareEncodings(
const QString &s1,
const QString &s2 )
604 return s1.toLower() < s2.toLower();
609 static std::once_flag initialized;
610 std::call_once( initialized, [ = ]
612 Q_FOREACH (
const QString &codec, QTextCodec::availableCodecs() )
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";
665 std::sort( sEncodings.begin(), sEncodings.end(), _compareEncodings );
679 return !mErrors.isEmpty();
711 return QSet<QgsMapLayerDependency>();
730 if ( geometry->
wkbType() == providerGeomType )
735 std::unique_ptr< QgsAbstractGeometry > outputGeom;
743 if ( compoundCurve->
nCurves() == 1 )
746 if ( circularString )
748 outputGeom.reset( circularString->
clone() );
760 outputGeom.reset( curveGeom );
768 if ( segmentizedGeom )
770 outputGeom.reset( segmentizedGeom );
779 if ( geomCollection )
781 if ( geomCollection->
addGeometry( outputGeom ? outputGeom->clone() : geometry->
clone() ) )
783 outputGeom.reset( collGeom.release() );
793 outputGeom.reset( geometry->
clone() );
802 outputGeom.reset( geometry->
clone() );
804 outputGeom->addMValue();
830 QStringList QgsVectorDataProvider::sEncodings;
834 return QList<QgsRelation>();
Wrapper for iterator of features from vector data provider or vector layer.
bool isCanceled() const
Tells whether the operation has been canceled already.
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
static QVariant convertValue(QVariant::Type type, const QString &value)
A rectangle specified with double values.
QVariant maximumValue(int index) const override
Returns the maximum value of an attribute.
QSet< QgsFeatureId > QgsFeatureIds
static std::unique_ptr< QgsAbstractGeometry > geomFromWkbType(QgsWkbTypes::Type t)
Returns empty geometry from wkb type.
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.
QgsWkbTypes::Type wkbType() const override=0
Returns the geometry type which is returned by this layer.
virtual QgsAbstractGeometry * toCurveType() const =0
Returns the geometry converted to the more generic curve type.
void pushError(const QString &msg) const
Push a notification about errors that happened in this providers scope.
QVariant minimumValue(int index) const override
Returns the minimum value of an attribute.
virtual bool addAttributes(const QList< QgsField > &attributes)
Adds new attributes to the provider.
bool isNull() const
Returns true if the geometry is null (ie, contains no underlying geometry accessible via geometry() )...
This class is a composition of two QSettings instances:
virtual QgsAttributeList attributeIndexes() const
Returns list of indexes to fetch all attributes in nextFeature()
QTextCodec * textEncoding() const
Gets this providers encoding.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
QString capabilitiesString() const
Returns the above in friendly format.
FeatureAvailability
Possible return value for hasFeatures() to determine if a source is empty.
Constraint
Constraints which may be present on a field.
virtual QStringList uniqueStringsMatching(int index, const QString &substring, int limit=-1, QgsFeedback *feedback=nullptr) const
Returns unique string values of an attribute which contain a specified subset string.
bool addFeatures(QgsFeatureList &flist, QgsFeatureSink::Flags flags=nullptr) override
Adds a list of features to the sink.
QList< QgsFeature > QgsFeatureList
Supports simplification of geometries on provider side according to a distance tolerance.
virtual QList< QgsRelation > discoverRelations(const QgsVectorLayer *self, const QList< QgsVectorLayer * > &layers) const
Discover the available relations with the given layers.
virtual bool deleteFeatures(const QgsFeatureIds &id)
Deletes one or more features from the provider.
virtual void setEncoding(const QString &e)
Set encoding used for accessing data from layer.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
virtual bool renameAttributes(const QgsFieldNameMap &renamedAttributes)
Renames existing attributes.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Container of fields for a vector layer.
A geometry is the spatial representation of a feature.
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...
virtual QVariant aggregate(QgsAggregateCalculator::Aggregate aggregate, int index, const QgsAggregateCalculator::AggregateParameters ¶meters, QgsExpressionContext *context, bool &ok) const
Calculates an aggregated value from the layer's features.
int fieldNameIndex(const QString &fieldName) const
Returns the index of a field name or -1 if the field does not exist.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
QgsFieldConstraints::Constraints fieldConstraints(int fieldIndex) const
Returns any constraints which are present at the provider for a specified field index.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
const QgsCurve * curveAt(int i) const
Returns the curve at the specified index.
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
QgsGeometry convertToProviderType(const QgsGeometry &geom) const
Converts the geometry to the provider type if possible / necessary.
virtual bool createAttributeIndex(int field)
Create an attribute index on the datasource.
void dataChanged()
This is emitted whenever an asynchronous operation has finished and the data should be redrawn...
Base class for feedback objects to be used for cancellation of something running in a worker thread...
void setNativeTypes(const QList< QgsVectorDataProvider::NativeType > &nativeTypes)
Set the list of native types supported by this provider.
Allows creation of spatial index.
QString encoding() const
Gets encoding which is used for accessing data.
QSet< int > QgsAttributeIds
virtual bool createSpatialIndex()
Creates a spatial index on the datasource (if supported by the provider type).
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
Type
The WKB type describes the number of dimensions a geometry has.
bool supportedType(const QgsField &field) const
check if provider supports type of field
Can create indexes on provider's fields.
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
Allows addition of new attributes (fields)
#define QgsDebugMsgLevel(str, level)
void clearMinMaxCache()
Invalidates the min/max cache.
virtual QString dataComment() const
Returns a short comment for the data that this provider is providing access to (e.g.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
QgsFields fields() const override=0
Returns the fields associated with this data provider.
virtual bool changeAttributeValues(const QgsChangedAttributesMap &attr_map)
Changes attribute values of existing features.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
virtual bool changeFeatures(const QgsChangedAttributesMap &attr_map, const QgsGeometryMap &geometry_map)
Changes attribute values and geometries of existing features.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
int nCurves() const
Returns the number of curves in the geometry.
virtual bool isSaveAndLoadStyleToDatabaseSupported() const
It returns false by default.
virtual QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
bool hasErrors() const
Provider has errors to report.
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
void raiseError(const QString &msg) const
Signals an error in this provider.
QList< QgsVectorDataProvider::NativeType > nativeTypes() const
Returns the names of the supported types.
Allows modifications of geometries.
void clearErrors()
Clear recorded errors.
int count() const
Returns number of items.
Encapsulate a field in an attribute table or data source.
QgsCoordinateReferenceSystem sourceCrs() const override
Returns the coordinate reference system for features in the source.
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
Abstract base class for all geometries.
Fast access to features using their ID.
virtual bool changeGeometryValues(const QgsGeometryMap &geometry_map)
Changes geometries of existing features.
QMap< QString, int > fieldNameMap() const
Returns a map where the key is the name of the field and the value is its index.
virtual QSet< QgsMapLayerDependency > dependencies() const
Gets the list of layer ids on which this layer depends.
QMap< int, QString > QgsFieldNameMap
virtual QgsTransaction * transaction() const
Returns the transaction this data provider is included in, if any.
QgsVectorDataProvider(const QString &uri=QString(), const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Constructor for a vector data provider.
Supports circular geometry types (circularstring, compoundcurve, curvepolygon)
virtual void forceReload()
Forces a reload of the underlying datasource if the provider implements this method.
Supports topological simplification of geometries on provider side according to a distance tolerance...
Setting options for creating vector data providers.
QgsFieldConstraints constraints
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
void fillMinMaxCache() const
Populates the cache of minimum and maximum attribute values.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const override=0
Query the provider for features specified in request.
virtual QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
virtual bool cancelReload()
Cancels the current reloading of data.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
static bool isCurvedType(Type type)
Returns true if the WKB type is a curved type or can contain curved geometries.
QgsCircularString * clone() const override
Clones the geometry by performing a deep copy.
virtual bool skipConstraintCheck(int fieldIndex, QgsFieldConstraints::Constraint constraint, const QVariant &value=QVariant()) const
Returns true if a constraint check should be skipped for a specified field (e.g., if the value return...
virtual bool truncate()
Removes all features from the layer.
This class represents a coordinate reference system (CRS).
virtual QVariant defaultValue(int fieldIndex) const
Returns any literal default values which are present at the provider for a specified field index...
QgsFeatureSource::FeatureAvailability hasFeatures() const override
Will always return FeatureAvailability::FeaturesAvailable or FeatureAvailability::NoFeaturesAvailable...
QgsFeatureRequest & setLimit(long limit)
Set the maximum number of features to request.
QStringList errors() const
Gets recorded errors.
virtual bool deleteAttributes(const QgsAttributeIds &attributes)
Deletes existing attributes from the provider.
virtual bool empty() const
Returns true if the layer contains at least one feature.
virtual QgsAttrPalIndexNameHash palAttributeIndexNames() const
Returns list of indexes to names for QgsPalLabeling fix.
virtual QgsFeatureRenderer * createRenderer(const QVariantMap &configuration=QVariantMap()) const
Creates a new vector layer feature renderer, using provider backend specific information.
Allows deletion of features.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Compound curve geometry type.
Circular string geometry type.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
QList< int > QgsAttributeList
bool nextFeature(QgsFeature &f)
Provider has no capabilities.
Geometry is not required. It may still be returned if e.g. required for a filter condition.
virtual QString defaultValueClause(int fieldIndex) const
Returns any default value clauses which are present at the provider for a specified field index...
Represents a vector layer which manages a vector based data sets.
virtual bool isDeleteStyleFromDatabaseSupported() const
It returns false by default.
static Type flatType(Type type)
Returns the flat type for a WKB type.
QgsAttributeList allAttributesList() const
Utility function to get list of attribute indexes.
QHash< int, QString > QgsAttrPalIndexNameHash
Allows modification of attribute values.
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.