30 #define AS_JOINFIELD QStringLiteral( "ASPK" )
 
   31 #define AS_EXTENSION QStringLiteral( "qgd" )
 
   32 #define AS_JOINPREFIX QStringLiteral( "auxiliary_storage_" )
 
   68   : 
QgsVectorLayer( QStringLiteral( "%1|layername=%2" ).arg( filename, table ),
 
   69                     QStringLiteral( "%1_auxiliarystorage" ).arg( table ), QStringLiteral( "ogr" ) )
 
   70   , mFileName( filename )
 
   76   mJoinInfo.setJoinLayer( 
this );
 
   78   mJoinInfo.setTargetFieldName( pkField );
 
   79   mJoinInfo.setEditable( 
true );
 
   80   mJoinInfo.setUpsertOnEdit( 
true );
 
   81   mJoinInfo.setCascadedDelete( 
true );
 
   82   mJoinInfo.setJoinFieldNamesBlockList( QStringList() << QStringLiteral( 
"rowid" ) ); 
 
  142   if ( ( definition.
name().isEmpty() && definition.
comment().isEmpty() ) || 
exists( definition ) )
 
  155     if ( index >= 0 && auxIndex >= 0 )
 
  166         QVector<QgsAttributeTableConfig::ColumnConfig> columns = attrCfg.
columns();
 
  167         QVector<QgsAttributeTableConfig::ColumnConfig>::iterator it;
 
  169         for ( it = columns.begin(); it != columns.end(); ++it )
 
  239       for ( 
const QString &providerId : subProviderIds )
 
  246         const QgsProperty existingProperty = 
c.property( property );
 
  250           c.setProperty( property, prop );
 
  257           c.setProperty( property, prop );
 
  287       const QgsProperty existingProperty = 
c.property( property );
 
  291         c.setProperty( property, prop );
 
  298         c.setProperty( property, prop );
 
  325       for ( 
const QString &providerId : subProviderIds )
 
  332           const QgsProperty existingProperty = 
c.property( property );
 
  336             c.setProperty( property, prop );
 
  343             c.setProperty( property, prop );
 
  362   if ( def.
origin().compare( QLatin1String( 
"labeling" ) ) == 0 )
 
  368       if ( propName.compare( def.
name() ) == 0 )
 
  384   if ( aDef.
origin().compare( QLatin1String( 
"labeling" ) ) == 0 )
 
  387     QgsPropertiesDefinition::const_iterator it = defs.constBegin();
 
  388     for ( ; it != defs.constEnd(); ++it )
 
  390       if ( it->name().compare( aDef.
name(), Qt::CaseInsensitive ) == 0 )
 
  397   else if ( aDef.
origin().compare( QLatin1String( 
"symbol" ) ) == 0 )
 
  400     QgsPropertiesDefinition::const_iterator it = defs.constBegin();
 
  401     for ( ; it != defs.constEnd(); ++it )
 
  403       if ( it->name().compare( aDef.
name(), Qt::CaseInsensitive ) == 0 )
 
  410   else if ( aDef.
origin().compare( QLatin1String( 
"diagram" ) ) == 0 )
 
  413     QgsPropertiesDefinition::const_iterator it = defs.constBegin();
 
  414     for ( ; it != defs.constEnd(); ++it )
 
  416       if ( it->name().compare( aDef.
name(), Qt::CaseInsensitive ) == 0 )
 
  439   QString fieldName = def.
origin();
 
  441   if ( !def.
name().isEmpty() )
 
  442     fieldName =  QStringLiteral( 
"%1_%2" ).arg( fieldName, def.
name().toLower() );
 
  444   if ( !def.
comment().isEmpty() )
 
  445     fieldName = QStringLiteral( 
"%1_%2" ).arg( fieldName, def.
comment() );
 
  448     fieldName = QStringLiteral( 
"%1%2" ).arg( 
AS_JOINPREFIX, fieldName );
 
  457   if ( !def.
name().isEmpty() || !def.
comment().isEmpty() )
 
  459     QVariant::Type 
type = QVariant::Invalid;
 
  465         type = QVariant::String;
 
  467         typeName = QStringLiteral( 
"String" );
 
  470         type = QVariant::Double;
 
  473         typeName = QStringLiteral( 
"Real" );
 
  476         type = QVariant::Int; 
 
  477         typeName = QStringLiteral( 
"Integer" );
 
  494   const QStringList parts = f.
name().split( 
'_' );
 
  496   if ( parts.size() <= 1 )
 
  499   const QString origin = parts[0];
 
  500   const QString propertyName = parts[1];
 
  502   if ( origin.compare( QLatin1String( 
"labeling" ), Qt::CaseInsensitive ) == 0 )
 
  505     for ( 
auto it = props.constBegin(); it != props.constEnd(); ++it )
 
  507       if ( it.value().name().compare( propertyName, Qt::CaseInsensitive ) == 0 )
 
  510         if ( parts.size() >= 3 )
 
  516   else if ( origin.compare( QLatin1String( 
"symbol" ), Qt::CaseInsensitive ) == 0 )
 
  519     for ( 
auto it = props.constBegin(); it != props.constEnd(); ++it )
 
  521       if ( it.value().name().compare( propertyName, Qt::CaseInsensitive ) == 0 )
 
  524         if ( parts.size() >= 3 )
 
  530   else if ( origin.compare( QLatin1String( 
"diagram" ), Qt::CaseInsensitive ) == 0 )
 
  533     for ( 
auto it = props.constBegin(); it != props.constEnd(); ++it )
 
  535       if ( it.value().name().compare( propertyName, Qt::CaseInsensitive ) == 0 )
 
  538         if ( parts.size() >= 3 )
 
  550       case QVariant::Double:
 
  558       case QVariant::String:
 
  564     if ( parts.size() >= 3 )
 
  576   if ( !def.
name().isEmpty() || !def.
comment().isEmpty() )
 
  596     mFileName = filenameForProject( project );
 
  603   : mFileName( filename )
 
  613   QFile::remove( mTmpFileName );
 
  628   if ( mFileName.isEmpty() )
 
  635     if ( QFile::exists( mFileName ) )
 
  636       QFile::remove( mFileName );
 
  638     return QFile::copy( mTmpFileName, mFileName );
 
  653   if ( mValid && layer )
 
  655     const QString table( layer->
id() );
 
  659     if ( !tableExists( table, database.get() ) )
 
  661       if ( !createTable( 
field.
typeName(), table, database.get(), mErrorString ) )
 
  682     database = openDB( uri.
database() );
 
  686       QString sql = QStringLiteral( 
"DROP TABLE %1" ).arg( uri.
table() );
 
  687       rc = exec( sql, database.get() );
 
  689       sql = QStringLiteral( 
"VACUUM" );
 
  690       rc = exec( sql, database.get() );
 
  705     database = openDB( uri.
database() );
 
  709       const QString sql = QStringLiteral( 
"CREATE TABLE %1 AS SELECT * FROM %2" ).arg( newTable, uri.
table() );
 
  710       rc = exec( sql, database.get() );
 
  724   mErrorString.clear();
 
  726   QFile dest( filename );
 
  727   if ( dest.exists() && !dest.remove() )
 
  729     mErrorString = dest.errorString();
 
  734   if ( !origin.copy( filename ) )
 
  736     mErrorString = origin.errorString();
 
  745   return saveAs( filenameForProject( project ) );
 
  755   const QFileInfo fileinfo( filenameForProject( project ) );
 
  756   return fileinfo.exists() && fileinfo.isFile();
 
  759 bool QgsAuxiliaryStorage::exec( 
const QString &sql, 
sqlite3 *handler )
 
  765     const int err = sqlite3_exec( handler, sql.toStdString().c_str(), 
nullptr, 
nullptr, 
nullptr );
 
  767     if ( err == SQLITE_OK )
 
  770       debugMsg( sql, handler );
 
  776 QString QgsAuxiliaryStorage::debugMsg( 
const QString &sql, 
sqlite3 *handler )
 
  778   const QString err = QString::fromUtf8( sqlite3_errmsg( handler ) );
 
  779   const QString msg = QObject::tr( 
"Unable to execute" );
 
  780   const QString errMsg = QObject::tr( 
"%1 '%2': %3" ).arg( msg, sql, err );
 
  785 bool QgsAuxiliaryStorage::createTable( 
const QString &type, 
const QString &table, 
sqlite3 *handler, QString &errorMsg )
 
  787   const QString sql = QStringLiteral( 
"CREATE TABLE IF NOT EXISTS '%1' ( '%2' %3  )" ).arg( table, 
AS_JOINFIELD, type );
 
  789   if ( !exec( sql, handler ) )
 
  791     errorMsg = QgsAuxiliaryStorage::debugMsg( sql, handler );
 
  803   rc = database.
open_v2( filename, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 
nullptr );
 
  806     debugMsg( QStringLiteral( 
"sqlite3_open_v2" ), database.get() );
 
  810     exec( QStringLiteral( 
"PRAGMA foreign_keys = 1" ), database.get() );
 
  818   const int rc = database.
open_v2( filename, SQLITE_OPEN_READWRITE, 
nullptr );
 
  822     debugMsg( QStringLiteral( 
"sqlite3_open_v2" ), database.get() );
 
  828 bool QgsAuxiliaryStorage::tableExists( 
const QString &table, 
sqlite3 *handler )
 
  830   const QString sql = QStringLiteral( 
"SELECT 1 FROM sqlite_master WHERE type='table' AND name='%1'" ).arg( table );
 
  833   char **results = 
nullptr;
 
  834   const int rc = sqlite3_get_table( handler, sql.toStdString().c_str(), &results, &rows, &columns, 
nullptr );
 
  835   if ( rc != SQLITE_OK )
 
  837     debugMsg( sql, handler );
 
  841   sqlite3_free_table( results );
 
  852   if ( filename.isEmpty() )
 
  857   else if ( QFile::exists( filename ) )
 
  860       QFile::copy( filename, mTmpFileName );
 
  876   return open( filenameForProject( project ) );
 
  879 QString QgsAuxiliaryStorage::filenameForProject( 
const QgsProject &project )
 
  882   const QString path = info.path() + QDir::separator() + info.baseName();
 
  886 void QgsAuxiliaryStorage::initTmpFileName()
 
  888   QTemporaryFile tmpFile;
 
  891   mTmpFileName = tmpFile.fileName();
 
  896   if ( mCopy || mFileName.isEmpty() )
 
  908   QStringList uriParts = uri.
uri().split( 
'|' );
 
  909   if ( uriParts.count() < 2 )
 
  912   const QString databasePath = uriParts[0].replace( 
' ', QString() );
 
  914   const QString table = uriParts[1];
 
  915   QStringList tableParts = table.split( 
' ' );
 
  917   if ( tableParts.count() < 1 )
 
  920   const QString tableName = tableParts[0].replace( QLatin1String( 
"layername=" ), QString() );
 
virtual QStringList subProviders() const
Gets list of sub-providers within the layer's labeling.
virtual void setSettings(QgsPalLayerSettings *settings, const QString &providerId=QString())=0
Set pal settings for a specific provider (takes ownership).
virtual QgsPalLayerSettings settings(const QString &providerId=QString()) const =0
Gets associated label settings.
This is a container for configuration of the attribute table.
QVector< QgsAttributeTableConfig::ColumnConfig > columns() const
Gets the list with all columns and their configuration.
void update(const QgsFields &fields)
Update the configuration with the given fields.
void setColumns(const QVector< QgsAttributeTableConfig::ColumnConfig > &columns)
Set the list of columns visible in the attribute table.
Class allowing to manage the auxiliary storage for a vector layer.
static QgsPropertyDefinition propertyDefinitionFromField(const QgsField &field)
Returns the property definition from an auxiliary field.
bool clear()
Deletes all features from the layer.
bool addAuxiliaryField(const QgsPropertyDefinition &definition)
Adds an auxiliary field for the given property.
bool isHiddenProperty(int index) const
Returns true if the underlying field has to be hidden from editing tools like attribute table,...
QgsVectorLayer * toSpatialLayer() const
An auxiliary layer is not spatial.
bool deleteAttribute(int attr) override
Removes attribute from the layer and commits changes.
static int createProperty(QgsPalLayerSettings::Property property, QgsVectorLayer *vlayer, bool overwriteExisting=true)
Creates if necessary a new auxiliary field for a PAL property and activates this property in settings...
QgsFields auxiliaryFields() const
Returns a list of all auxiliary fields currently managed by the layer.
QgsAuxiliaryLayer(const QString &pkField, const QString &filename, const QString &table, QgsVectorLayer *vlayer)
Constructor.
bool save()
Commits changes and starts editing then.
int propertyFromIndex(int index) const
Returns the underlying property key for the field index.
QgsVectorLayerJoinInfo joinInfo() const
Returns information to use for joining with primary key and so on.
static QString nameFromProperty(const QgsPropertyDefinition &def, bool joined=false)
Returns the name of the auxiliary field for a property definition.
QgsPropertyDefinition propertyDefinitionFromIndex(int index) const
Returns the property definition for the underlying field index.
bool exists(const QgsPropertyDefinition &definition) const
Returns true if the property is stored in the layer already, false otherwise.
int indexOfPropertyDefinition(const QgsPropertyDefinition &definition) const
Returns the index of the auxiliary field for a specific property definition.
static QgsField createAuxiliaryField(const QgsPropertyDefinition &definition)
Creates a new auxiliary field from a property definition.
virtual ~QgsAuxiliaryStorage()
Destructor.
static bool duplicateTable(const QgsDataSourceUri &uri, const QString &newTable)
Duplicates a table and its content.
QString errorString() const
Returns the underlying error string describing potential errors happening in saveAs().
bool save() const
Saves the current database.
static bool exists(const QgsProject &project)
Returns true if the auxiliary database yet exists for a project, false otherwise.
static bool deleteTable(const QgsDataSourceUri &uri)
Removes a table from the auxiliary storage.
QgsAuxiliaryLayer * createAuxiliaryLayer(const QgsField &field, QgsVectorLayer *layer) const
Creates an auxiliary layer for a vector layer.
bool saveAs(const QString &filename)
Saves the current database to a new path.
bool isValid() const
Returns the status of the auxiliary storage currently defined.
QString currentFileName() const
Returns the path of the current database used.
QgsAuxiliaryStorage(const QgsProject &project, bool copy=true)
Constructor.
QString fileName() const
Returns the target filename of the database.
static QString extension()
Returns the extension used for auxiliary databases.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the callout's property collection, used for data defined overrides.
static QgsPropertiesDefinition propertyDefinitions()
Returns the definitions for data defined properties available for use in callouts.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the callout's property collection, used for data defined overrides.
Property
Data definable properties.
Class for storing the component parts of a RDBMS data source URI (e.g.
QString table() const
Returns the table name stored in the URI.
QString uri(bool expandAuthConfig=true) const
Returns the complete URI as a string.
void setDataSource(const QString &aSchema, const QString &aTable, const QString &aGeometryColumn, const QString &aSql=QString(), const QString &aKeyColumn=QString())
Sets all data source related members at once.
QString database() const
Returns the database name stored in the URI.
void setDatabase(const QString &database)
Sets the URI database name.
Stores the settings for rendering of all diagrams for a layer.
Property
Data definable properties.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the diagram property definitions.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the diagram's property collection, used for data defined overrides.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the diagram's property collection, used for data defined overrides.
static QString createFieldEqualityExpression(const QString &fieldName, const QVariant &value)
Create an expression allowing to evaluate if a field is equal to a value.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
virtual QgsFeatureIds allFeatureIds() const
Returns a list of all feature IDs for features present in the source.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool isValid() const
Returns the validity of this feature.
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Encapsulate a field in an attribute table or data source.
QString typeName() const
Gets the field type.
void setPrecision(int precision)
Set the field precision.
void setName(const QString &name)
Set the field name.
void setLength(int len)
Set the field length.
void setType(QVariant::Type type)
Set variant type.
void setTypeName(const QString &typeName)
Set the field type.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int indexOf(const QString &fieldName) const
Gets the field index from the field name.
int count() const
Returns number of items.
QgsField field(int fieldIdx) const
Returns the field at particular index (must be in range 0..N-1).
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
QString source() const
Returns the source for the layer.
QgsCoordinateReferenceSystem crs
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
static QgsVectorLayer * createMemoryLayer(const QString &name, const QgsFields &fields, QgsWkbTypes::Type geometryType=QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem()) SIP_FACTORY
Creates a new memory layer using the specified parameters.
Contains settings for how a map layer will be labeled.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
QgsCallout * callout() const
Returns the label callout renderer, responsible for drawing label callouts.
Property
Data definable properties.
@ LabelRotation
Label rotation.
@ PositionY
Y-coordinate data defined label position.
@ Strikeout
Use strikeout.
@ FontStyle
Font style name.
@ PositionX
X-coordinate data defined label position.
@ CalloutDraw
Show callout.
@ Underline
Use underline.
@ MaxScale
Max scale (deprecated, for old project compatibility only)
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
@ LabelAllParts
Whether all parts of multi-part features should be labeled.
@ Italic
Use italic style.
@ MinScale
Min scale (deprecated, for old project compatibility only)
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the label's property collection, used for data defined overrides.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
QString absoluteFilePath() const
Returns full absolute path to the project file if the project is stored in a file system - derived fr...
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
Definition for a property.
StandardPropertyTemplate standardTemplate() const
Returns the property's standard template, if applicable.
QString comment() const
Returns the comment of the property.
DataType dataType() const
Returns the allowable field/value data type for the property.
void setOrigin(const QString &origin)
Sets the origin of the property.
@ ColorNoAlpha
Color with no alpha channel.
@ ColorWithAlpha
Color with alpha channel.
QString name() const
Returns the name of the property.
void setDataType(DataType type)
Sets the data type.
void setName(const QString &name)
Sets the name of the property.
QString origin() const
Returns the origin of the property.
void setComment(const QString &comment)
Sets comment of the property.
@ DataTypeString
Property requires a string value.
@ DataTypeBoolean
Property requires a boolean value.
@ DataTypeNumeric
Property requires a numeric value.
A store for object properties.
@ InvalidProperty
Invalid (not set) property.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
Type propertyType() const
Returns the property type.
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol layer property definitions.
Defines left outer join from our vector layer to some other vector layer.
QString targetFieldName() const
Returns name of the field of our layer that will be used for join.
Represents a vector layer which manages a vector based data sets.
Q_INVOKABLE QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
Q_INVOKABLE bool startEditing()
Makes the layer editable.
bool addAttribute(const QgsField &field)
Add an attribute field (but does not commit it) returns true if the field was added.
void updateFields()
Will regenerate the fields property of this layer by obtaining all fields from the dataProvider,...
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
bool deleteFeatures(const QgsFeatureIds &fids, DeleteContext *context=nullptr)
Deletes a set of features from the layer (but does not commit it)
const QgsDiagramLayerSettings * diagramLayerSettings() const
QgsAuxiliaryLayer * auxiliaryLayer()
Returns the current auxiliary layer.
virtual bool deleteAttribute(int attr)
Deletes an attribute field (but does not commit it).
bool isEditable() const FINAL
Returns true if the provider is in editing mode.
void setEditorWidgetSetup(int index, const QgsEditorWidgetSetup &setup)
The editor widget setup defines which QgsFieldFormatter and editor widget will be used for the field ...
Q_INVOKABLE bool commitChanges(bool stopEditing=true)
Attempts to commit to the underlying data provider any buffered changes made since the last to call t...
QgsEditorWidgetSetup editorWidgetSetup(int index) const
The editor widget setup defines which QgsFieldFormatter and editor widget will be used for the field ...
QgsVectorLayer * clone() const override
Returns a new instance equivalent to this one.
QgsAttributeTableConfig attributeTableConfig() const
Returns the attribute table configuration object.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) FINAL
Adds a single feature to the sink.
void setAttributeTableConfig(const QgsAttributeTableConfig &attributeTableConfig)
Sets the attribute table configuration object.
void setDiagramLayerSettings(const QgsDiagramLayerSettings &s)
const QgsAbstractVectorLayerLabeling * labeling() const
Access to const labeling configuration.
Unique pointer for spatialite databases, which automatically closes the database when the pointer goe...
int open_v2(const QString &path, int flags, const char *zVfs)
Opens the database at the specified file path.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
Q_GLOBAL_STATIC_WITH_ARGS(PalPropertyList, palHiddenProperties,({ QgsPalLayerSettings::PositionX, QgsPalLayerSettings::PositionY, QgsPalLayerSettings::Show, QgsPalLayerSettings::LabelRotation, QgsPalLayerSettings::Family, QgsPalLayerSettings::FontStyle, QgsPalLayerSettings::Size, QgsPalLayerSettings::Bold, QgsPalLayerSettings::Italic, QgsPalLayerSettings::Underline, QgsPalLayerSettings::Color, QgsPalLayerSettings::Strikeout, QgsPalLayerSettings::MultiLineAlignment, QgsPalLayerSettings::BufferSize, QgsPalLayerSettings::BufferDraw, QgsPalLayerSettings::BufferColor, QgsPalLayerSettings::LabelDistance, QgsPalLayerSettings::Hali, QgsPalLayerSettings::Vali, QgsPalLayerSettings::ScaleVisibility, QgsPalLayerSettings::MinScale, QgsPalLayerSettings::MaxScale, QgsPalLayerSettings::AlwaysShow, QgsPalLayerSettings::CalloutDraw, QgsPalLayerSettings::LabelAllParts })) QgsAuxiliaryLayer
QVector< QgsPalLayerSettings::Property > PalPropertyList
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.