LCOV - code coverage report
Current view: top level - core - qgsabstractdatabaseproviderconnection.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 11 0.0 %
Date: 2021-03-26 12:19:53 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :   qgsabstractdatabaseproviderconnection.h - QgsAbstractDatabaseProviderConnection
       3                 :            : 
       4                 :            :  ---------------------
       5                 :            :  begin                : 2.8.2019
       6                 :            :  copyright            : (C) 2019 by Alessandro Pasotti
       7                 :            :  email                : elpaso at itopen dot it
       8                 :            :  ***************************************************************************
       9                 :            :  *                                                                         *
      10                 :            :  *   This program is free software; you can redistribute it and/or modify  *
      11                 :            :  *   it under the terms of the GNU General Public License as published by  *
      12                 :            :  *   the Free Software Foundation; either version 2 of the License, or     *
      13                 :            :  *   (at your option) any later version.                                   *
      14                 :            :  *                                                                         *
      15                 :            :  ***************************************************************************/
      16                 :            : #ifndef QGSABSTRACTDATABASEPROVIDERCONNECTION_H
      17                 :            : #define QGSABSTRACTDATABASEPROVIDERCONNECTION_H
      18                 :            : 
      19                 :            : #include "qgsabstractproviderconnection.h"
      20                 :            : #include "qgscoordinatereferencesystem.h"
      21                 :            : #include "qgis_core.h"
      22                 :            : #include "qgsfields.h"
      23                 :            : #include "qgsexception.h"
      24                 :            : #include "qgsvectordataprovider.h"
      25                 :            : 
      26                 :            : #include <QObject>
      27                 :            : 
      28                 :            : class QgsFeedback;
      29                 :            : 
      30                 :            : /**
      31                 :            :  * \brief The QgsAbstractDatabaseProviderConnection class provides common functionality
      32                 :            :  * for DB based connections.
      33                 :            :  *
      34                 :            :  * This class performs low level DB operations without asking
      35                 :            :  * the user for confirmation or handling currently opened layers and the registry
      36                 :            :  * entries, it is responsibility of the client code to keep layers in sync.
      37                 :            :  * The class methods will throw exceptions in case the requested operation
      38                 :            :  * is not supported or cannot be performed without errors.
      39                 :            :  *
      40                 :            :  * \ingroup core
      41                 :            :  * \since QGIS 3.10
      42                 :            :  */
      43                 :          0 : class CORE_EXPORT QgsAbstractDatabaseProviderConnection : public QgsAbstractProviderConnection
      44                 :            : {
      45                 :            : 
      46                 :            :     Q_GADGET
      47                 :            : 
      48                 :            :   public:
      49                 :            : 
      50                 :            :     /**
      51                 :            :      * Flags for table properties.
      52                 :            :      *
      53                 :            :      * Flags can be useful for filtering the tables returned
      54                 :            :      * from tables().
      55                 :            :      */
      56                 :            :     enum TableFlag
      57                 :            :     {
      58                 :            :       Aspatial = 1 << 1,          //!< Aspatial table (it does not contain any geometry column)
      59                 :            :       Vector = 1 << 2,            //!< Vector table (it does contain one geometry column)
      60                 :            :       Raster = 1 << 3,            //!< Raster table
      61                 :            :       View = 1 << 4,              //!< View table
      62                 :            :       MaterializedView = 1 << 5,  //!< Materialized view table
      63                 :            :       Foreign = 1 << 6,           //!< Foreign data wrapper
      64                 :            :     };
      65                 :            : 
      66                 :            :     Q_ENUM( TableFlag )
      67                 :            :     Q_DECLARE_FLAGS( TableFlags, TableFlag )
      68                 :            :     Q_FLAG( TableFlags )
      69                 :            : 
      70                 :            :     /**
      71                 :            :      * The QueryResult class represents the result of a query executed by execSql()
      72                 :            :      *
      73                 :            :      * It encapsulates an iterator over the result rows and a list of the column names.
      74                 :            :      *
      75                 :            :      * Rows can be retrieved by iterating over the result with hasNextRow() and nextRow()
      76                 :            :      * or by calling rows() that will internally iterate over the results and return
      77                 :            :      * the whole result list.
      78                 :            :      *
      79                 :            :      *
      80                 :            :      * \since QGIS 3.18
      81                 :            :      */
      82                 :          0 :     struct CORE_EXPORT QueryResult
      83                 :            :     {
      84                 :            : 
      85                 :            :         /**
      86                 :            :          * Returns the column names
      87                 :            :          */
      88                 :            :         QStringList columns() const;
      89                 :            : 
      90                 :            :         /**
      91                 :            :          * Returns the result rows by calling the iterator internally and fetching
      92                 :            :          * all the rows, an optional \a feedback can be used to interrupt the fetching loop.
      93                 :            :          *
      94                 :            :          * \note calling this function more than one time is not supported: the second
      95                 :            :          * call will always return an empty list.
      96                 :            :          */
      97                 :            :         QList<QList<QVariant> > rows( QgsFeedback *feedback = nullptr );
      98                 :            : 
      99                 :            :         /**
     100                 :            :          * Returns TRUE if there are more rows to fetch
     101                 :            :          *
     102                 :            :          * \see nextRow()
     103                 :            :          * \see rewind()
     104                 :            :          */
     105                 :            :         bool hasNextRow() const;
     106                 :            : 
     107                 :            :         /**
     108                 :            :          * Returns the next result row or an empty row if there are no rows left
     109                 :            :          *
     110                 :            :          * \see hasNextRow()
     111                 :            :          * \see rewind()
     112                 :            :          */
     113                 :            :         QList<QVariant> nextRow() const;
     114                 :            : 
     115                 :            :         /**
     116                 :            :          * Returns the number of fetched rows
     117                 :            :          *
     118                 :            :          * \see rowCount()
     119                 :            :          */
     120                 :            :         qlonglong fetchedRowCount( ) const;
     121                 :            : 
     122                 :            : 
     123                 :            : #ifdef SIP_RUN
     124                 :            :         // Python iterator
     125                 :            :         QueryResult *__iter__();
     126                 :            :         % MethodCode
     127                 :            :         sipRes = sipCpp;
     128                 :            :         % End
     129                 :            : 
     130                 :            :         SIP_PYOBJECT __next__();
     131                 :            :         % MethodCode
     132                 :            :         QList<QVariant> result;
     133                 :            :         Py_BEGIN_ALLOW_THREADS
     134                 :            :         result = sipCpp->nextRow( );
     135                 :            :         Py_END_ALLOW_THREADS
     136                 :            :         if ( ! result.isEmpty() )
     137                 :            :         {
     138                 :            :           const sipTypeDef *qvariantlist_type = sipFindType( "QList<QVariant>" );
     139                 :            :           sipRes = sipConvertFromNewType( new QList<QVariant>( result ), qvariantlist_type, Py_None );
     140                 :            :         }
     141                 :            :         else
     142                 :            :         {
     143                 :            :           PyErr_SetString( PyExc_StopIteration, "" );
     144                 :            :         }
     145                 :            :         % End
     146                 :            : #endif
     147                 :            : 
     148                 :            : ///@cond private
     149                 :            : 
     150                 :            :         /**
     151                 :            :          * The QueryResultIterator struct is an abstract interface for provider query result iterators.
     152                 :            :          * Providers must implement their own concrete iterator over query results.
     153                 :            :          *
     154                 :            :          */
     155                 :          0 :         struct CORE_EXPORT QueryResultIterator SIP_SKIP
     156                 :            :         {
     157                 :            :             QVariantList nextRow();
     158                 :            :             bool hasNextRow() const;
     159                 :            :             qlonglong fetchedRowCount();
     160                 :          0 :             virtual ~QueryResultIterator() = default;
     161                 :            : 
     162                 :            :           private:
     163                 :            : 
     164                 :            :             virtual QVariantList nextRowPrivate() = 0;
     165                 :            :             virtual bool hasNextRowPrivate() const = 0;
     166                 :          0 :             mutable qlonglong mFetchedRowCount = 0;
     167                 :            :             mutable QMutex mMutex;
     168                 :            : 
     169                 :            :         };
     170                 :            : 
     171                 :            :         /**
     172                 :            :          * Appends \a columnName to the list of column names.
     173                 :            :          * \note Not available in Python bindings
     174                 :            :          */
     175                 :            :         void appendColumn( const QString &columnName ) SIP_SKIP;
     176                 :            : 
     177                 :            :         /**
     178                 :            :          * Constructs a QueryResult object from an \a iterator
     179                 :            :          * \note Not available in Python bindings
     180                 :            :          */
     181                 :            :         QueryResult( std::shared_ptr<QueryResultIterator> iterator ) SIP_SKIP;
     182                 :            : 
     183                 :            :         /**
     184                 :            :          * Default constructor, used to return empty results
     185                 :            :          * \note Not available in Python bindings
     186                 :            :          */
     187                 :          0 :         QueryResult( ) = default SIP_SKIP;
     188                 :            : 
     189                 :            : ///@endcond private
     190                 :            : 
     191                 :            :       private:
     192                 :            : 
     193                 :            :         mutable std::shared_ptr<QueryResultIterator> mResultIterator;
     194                 :            :         QStringList mColumns;
     195                 :            : 
     196                 :            :     };
     197                 :            : 
     198                 :            : 
     199                 :            :     /**
     200                 :            :      * The TableProperty class represents a database table or view.
     201                 :            :      *
     202                 :            :      * In case the table is a vector spatial table and it has multiple
     203                 :            :      * geometry columns, separate entries for each geometry column must
     204                 :            :      * be created.
     205                 :            :      *
     206                 :            :      * In case the table is a vector spatial table and the geometry column
     207                 :            :      * can contain multiple geometry types and/or CRSs, a clone of the property
     208                 :            :      * for the individual geometry type/CRS can be retrieved with at(i)
     209                 :            :      */
     210                 :          0 :     struct CORE_EXPORT TableProperty
     211                 :            :     {
     212                 :            : 
     213                 :            : #ifdef SIP_RUN
     214                 :            :         SIP_PYOBJECT __repr__();
     215                 :            :         % MethodCode
     216                 :            :         QString str = QStringLiteral( "<QgsAbstractDatabaseProviderConnection.TableProperty: '%1'>" ).arg( sipCpp->tableName() );
     217                 :            :         sipRes = PyUnicode_FromString( str.toUtf8().constData() );
     218                 :            :         % End
     219                 :            : #endif
     220                 :            : 
     221                 :            :         /**
     222                 :            :          * The GeometryColumnType struct represents the combination
     223                 :            :          * of geometry type and CRS for the table geometry column.
     224                 :            :          */
     225                 :          0 :         struct CORE_EXPORT GeometryColumnType
     226                 :            :         {
     227                 :            : #ifdef SIP_RUN
     228                 :            :           SIP_PYOBJECT __repr__();
     229                 :            :           % MethodCode
     230                 :            :           QString str = QStringLiteral( "<QgsAbstractDatabaseProviderConnection.TableProperty.GeometryColumnType: '%1, %2'>" ).arg( QgsWkbTypes::displayString( sipCpp->wkbType ), sipCpp->crs.authid() );
     231                 :            :           sipRes = PyUnicode_FromString( str.toUtf8().constData() );
     232                 :            :           % End
     233                 :            : #endif
     234                 :            :           QgsWkbTypes::Type wkbType;
     235                 :            :           QgsCoordinateReferenceSystem crs;
     236                 :            : 
     237                 :          0 :           inline bool operator==( const GeometryColumnType &other ) const
     238                 :            :           {
     239                 :          0 :             return this->crs == other.crs && this->wkbType == other.wkbType;
     240                 :            :           }
     241                 :            :         };
     242                 :            : 
     243                 :            :       public:
     244                 :            : 
     245                 :            :         /**
     246                 :            :          * Returns the table name
     247                 :            :          * \see defaultName()
     248                 :            :          */
     249                 :            :         QString tableName() const;
     250                 :            : 
     251                 :            :         /**
     252                 :            :          * Sets the table name to \a name
     253                 :            :          * \see defaultName()
     254                 :            :          */
     255                 :            :         void setTableName( const QString &name );
     256                 :            : 
     257                 :            :         /**
     258                 :            :          * Appends the geometry column \a type with the given \a srid to the geometry column types list
     259                 :            :          */
     260                 :            :         void addGeometryColumnType( const QgsWkbTypes::Type &type, const QgsCoordinateReferenceSystem &crs );
     261                 :            : 
     262                 :            :         /**
     263                 :            :          * Returns the list of geometry column types and CRSs.
     264                 :            :          * The method returns a list of GeometryColumnType
     265                 :            :          */
     266                 :            :         QList<QgsAbstractDatabaseProviderConnection::TableProperty::GeometryColumnType> geometryColumnTypes() const;
     267                 :            : 
     268                 :            :         /**
     269                 :            :          * Sets the geometry column types to \a geometryColumnTypes
     270                 :            :          */
     271                 :            :         void setGeometryColumnTypes( const QList<QgsAbstractDatabaseProviderConnection::TableProperty::GeometryColumnType> &geometryColumnTypes );
     272                 :            : 
     273                 :            :         /**
     274                 :            :          * Returns the default name for the table entry
     275                 :            :          *
     276                 :            :          * It is usually the table name but in case there are multiple geometry
     277                 :            :          * columns, the geometry column name is appended to the table name.
     278                 :            :          * \see geometryColumnCount()
     279                 :            :          */
     280                 :            :         QString defaultName() const;
     281                 :            : 
     282                 :            :         /**
     283                 :            :          * Returns the table property corresponding to the geometry type at
     284                 :            :          * the given \a index
     285                 :            :          */
     286                 :            :         TableProperty at( int index ) const;
     287                 :            : 
     288                 :            :         /**
     289                 :            :          * Returns the schema or an empty string for backends that do not support a schema
     290                 :            :          */
     291                 :            :         QString schema() const;
     292                 :            : 
     293                 :            :         /**
     294                 :            :          * Sets the \a schema
     295                 :            :          */
     296                 :            :         void setSchema( const QString &schema );
     297                 :            : 
     298                 :            :         /**
     299                 :            :          * Returns the geometry column name
     300                 :            :          */
     301                 :            :         QString geometryColumn() const;
     302                 :            : 
     303                 :            :         /**
     304                 :            :          * Sets the geometry column name to \a geometryColumn
     305                 :            :          */
     306                 :            :         void setGeometryColumn( const QString &geometryColumn );
     307                 :            : 
     308                 :            :         /**
     309                 :            :          * Returns the list of primary key column names
     310                 :            :          */
     311                 :            :         QStringList primaryKeyColumns() const;
     312                 :            : 
     313                 :            :         /**
     314                 :            :          * Sets the primary key column names to \a primaryKeyColumns
     315                 :            :          */
     316                 :            :         void setPrimaryKeyColumns( const QStringList &primaryKeyColumns );
     317                 :            : 
     318                 :            :         /**
     319                 :            :          * Returns the list of CRSs supported by the geometry column
     320                 :            :          */
     321                 :            :         QList<QgsCoordinateReferenceSystem> crsList() const;
     322                 :            : 
     323                 :            :         /**
     324                 :            :          * Returns the table flags
     325                 :            :          */
     326                 :            :         TableFlags flags() const;
     327                 :            : 
     328                 :            :         /**
     329                 :            :          * Sets the table \a flags
     330                 :            :          */
     331                 :            :         void setFlags( const TableFlags &flags );
     332                 :            : 
     333                 :            :         /**
     334                 :            :          * Returns the table comment
     335                 :            :          */
     336                 :            :         QString comment() const;
     337                 :            : 
     338                 :            :         /**
     339                 :            :          * Sets the table \a comment
     340                 :            :          */
     341                 :            :         void setComment( const QString &comment );
     342                 :            : 
     343                 :            :         /**
     344                 :            :          * Returns additional information about the table
     345                 :            :          *
     346                 :            :          * Provider classes may use this property
     347                 :            :          * to store custom bits of information.
     348                 :            :          */
     349                 :            :         QVariantMap info() const;
     350                 :            : 
     351                 :            :         /**
     352                 :            :          * Sets additional information about the table to \a info
     353                 :            :          *
     354                 :            :          * Provider classes may use this property
     355                 :            :          * to store custom bits of information.
     356                 :            :          */
     357                 :            :         void setInfo( const QVariantMap &info );
     358                 :            : 
     359                 :            :         /**
     360                 :            :          * Returns the number of geometry columns in the original table this entry refers to
     361                 :            :          *
     362                 :            :          * This information is used internally to build the \see defaultName()
     363                 :            :          */
     364                 :            :         int geometryColumnCount() const;
     365                 :            : 
     366                 :            :         /**
     367                 :            :          * Sets the \a geometryColumnCount
     368                 :            :          */
     369                 :            :         void setGeometryColumnCount( int geometryColumnCount );
     370                 :            : 
     371                 :            :         /**
     372                 :            :          * Sets a \a flag
     373                 :            :          */
     374                 :            :         void setFlag( const TableFlag &flag );
     375                 :            : 
     376                 :            :         /**
     377                 :            :          * Returns the maximum coordinate dimensions of the geometries of a vector table.
     378                 :            :          * This information is calculated from the geometry columns types.
     379                 :            :          * \see geometryColumnTypes()
     380                 :            :          */
     381                 :            :         int maxCoordinateDimensions() const;
     382                 :            : 
     383                 :            :         bool operator==( const QgsAbstractDatabaseProviderConnection::TableProperty &other ) const;
     384                 :            : 
     385                 :            :       private:
     386                 :            : 
     387                 :            :         //! Holds the list of geometry wkb types and srids supported by the table
     388                 :            :         QList<GeometryColumnType>    mGeometryColumnTypes;
     389                 :            :         //! Table schema
     390                 :            :         QString                       mSchema;
     391                 :            :         //! Table name
     392                 :            :         QString                       mTableName;
     393                 :            :         //! Name of the geometry column
     394                 :            :         QString                       mGeometryColumn;
     395                 :            :         //! The number of geometry columns in the table
     396                 :            :         int                           mGeometryColumnCount;
     397                 :            :         //! PK columns
     398                 :            :         QStringList                   mPkColumns;
     399                 :            :         TableFlags                    mFlags;
     400                 :            :         QString                       mComment;
     401                 :            :         //! Additional unstructured information about the table
     402                 :            :         QVariantMap                   mInfo;
     403                 :            :     };
     404                 :            : 
     405                 :            :     /**
     406                 :            :      * The Capability enum represents the operations supported by the connection
     407                 :            :      */
     408                 :            :     enum Capability
     409                 :            :     {
     410                 :            :       CreateVectorTable = 1 << 1,   //!< Can CREATE a vector (or aspatial) table/layer
     411                 :            :       DropRasterTable = 1 << 2,     //!< Can DROP a raster table/layer
     412                 :            :       DropVectorTable = 1 << 3,     //!< Can DROP a vector (or aspatial) table/layer
     413                 :            :       RenameVectorTable = 1 << 4,   //!< Can RENAME a vector (or aspatial) table/layer
     414                 :            :       RenameRasterTable = 1 << 5,   //!< Can RENAME a raster table/layer
     415                 :            :       CreateSchema = 1 << 6,        //!< Can CREATE a schema
     416                 :            :       DropSchema = 1 << 7,          //!< Can DROP a schema
     417                 :            :       RenameSchema = 1 << 8,        //!< Can RENAME a schema
     418                 :            :       ExecuteSql = 1 << 9,          //!< Can execute raw SQL queries (without returning results)
     419                 :            :       Vacuum = 1 << 10,             //!< Can run vacuum
     420                 :            :       Tables = 1 << 11,             //!< Can list tables
     421                 :            :       Schemas = 1 << 12,            //!< Can list schemas (if not set, the connection does not support schemas)
     422                 :            :       SqlLayers = 1 << 13,          //!< Can create vector layers from SQL SELECT queries
     423                 :            :       TableExists = 1 << 14,        //!< Can check if table exists
     424                 :            :       Spatial = 1 << 15,            //!< The connection supports spatial tables
     425                 :            :       CreateSpatialIndex = 1 << 16, //!< The connection can create spatial indices
     426                 :            :       SpatialIndexExists = 1 << 17, //!< The connection can determine if a spatial index exists
     427                 :            :       DeleteSpatialIndex = 1 << 18, //!< The connection can delete spatial indices for tables
     428                 :            :       DeleteField = 1 << 19,        //!< Can delete an existing field/column
     429                 :            :       DeleteFieldCascade = 1 << 20, //!< Can delete an existing field/column with cascade
     430                 :            :       AddField = 1 << 21,           //!< Can add a new field/column
     431                 :            :     };
     432                 :          0 :     Q_ENUM( Capability )
     433                 :            :     Q_DECLARE_FLAGS( Capabilities, Capability )
     434                 :            :     Q_FLAG( Capabilities )
     435                 :            : 
     436                 :            :     /**
     437                 :            :      * The GeometryColumnCapability enum represents the geomery column features supported by the connection
     438                 :            :      * \since QGIS 3.16
     439                 :            :      */
     440                 :            :     enum GeometryColumnCapability
     441                 :            :     {
     442                 :            :       Z = 1 << 1,                    //! Supports Z dimension
     443                 :            :       M = 1 << 2,                    //! Supports M dimension
     444                 :            :       SinglePart = 1 << 3,           //! Multi and single part types are distinct types
     445                 :            :       Curves = 1 << 4                //! Supports curves
     446                 :            :     };
     447                 :            : 
     448                 :            :     Q_ENUM( GeometryColumnCapability )
     449                 :            :     Q_DECLARE_FLAGS( GeometryColumnCapabilities, GeometryColumnCapability )
     450                 :            :     Q_FLAG( GeometryColumnCapabilities )
     451                 :            : 
     452                 :            :     /**
     453                 :            :      * Creates a new connection with \a name by reading its configuration from the settings.
     454                 :            :      * If a connection with this name cannot be found, an empty connection will be returned.
     455                 :            :      */
     456                 :            :     QgsAbstractDatabaseProviderConnection( const QString &name );
     457                 :            : 
     458                 :            :     /**
     459                 :            :      * Creates a new connection from the given \a uri and \a configuration.
     460                 :            :      * The connection is not automatically stored in the settings.
     461                 :            :      * \see store()
     462                 :            :      */
     463                 :            :     QgsAbstractDatabaseProviderConnection( const QString &uri, const QVariantMap &configuration );
     464                 :            : 
     465                 :            : 
     466                 :            :     // Public interface
     467                 :            : 
     468                 :            :     /**
     469                 :            :      * Returns connection capabilities
     470                 :            :      */
     471                 :            :     Capabilities capabilities() const;
     472                 :            : 
     473                 :            :     /**
     474                 :            :      * Returns connection geomerty column capabilities (Z, M, SinglePart, Curves)
     475                 :            :      * \since QGIS 3.16
     476                 :            :      */
     477                 :            :     virtual GeometryColumnCapabilities geometryColumnCapabilities();
     478                 :            : 
     479                 :            :     // Operations interface
     480                 :            : 
     481                 :            :     /**
     482                 :            :      * Returns the URI string for the given \a table and \a schema.
     483                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     484                 :            :      * \throws QgsProviderConnectionException
     485                 :            :      * \since QGIS 3.12
     486                 :            :      */
     487                 :            :     virtual QString tableUri( const QString &schema, const QString &name ) const SIP_THROW( QgsProviderConnectionException );
     488                 :            : 
     489                 :            :     /**
     490                 :            :      * Creates an empty table with \a name in the given \a schema (schema is ignored if not supported by the backend).
     491                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     492                 :            :      * \throws QgsProviderConnectionException
     493                 :            :      */
     494                 :            :     virtual void createVectorTable( const QString &schema, const QString &name, const QgsFields &fields, QgsWkbTypes::Type wkbType, const QgsCoordinateReferenceSystem &srs, bool overwrite, const QMap<QString, QVariant> *options ) const SIP_THROW( QgsProviderConnectionException );
     495                 :            : 
     496                 :            :     /**
     497                 :            :      * Checks whether a table \a name exists in the given \a schema.
     498                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     499                 :            :      * \throws QgsProviderConnectionException
     500                 :            :      */
     501                 :            :     virtual bool tableExists( const QString &schema, const QString &name ) const SIP_THROW( QgsProviderConnectionException );
     502                 :            : 
     503                 :            :     /**
     504                 :            :      * Drops a vector (or aspatial) table with given \a schema (schema is ignored if not supported by the backend) and \a name.
     505                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     506                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     507                 :            :      * \throws QgsProviderConnectionException
     508                 :            :      */
     509                 :            :     virtual void dropVectorTable( const QString &schema, const QString &name ) const SIP_THROW( QgsProviderConnectionException );
     510                 :            : 
     511                 :            :     /**
     512                 :            :      * Drops a raster table with given \a schema (schema is ignored if not supported by the backend) and \a name.
     513                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     514                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     515                 :            :      * \throws QgsProviderConnectionException
     516                 :            :      */
     517                 :            :     virtual void dropRasterTable( const QString &schema, const QString &name ) const SIP_THROW( QgsProviderConnectionException );
     518                 :            : 
     519                 :            :     /**
     520                 :            :      * Renames a vector or aspatial table with given \a schema (schema is ignored if not supported by the backend) and \a name.
     521                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     522                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     523                 :            :      * \throws QgsProviderConnectionException
     524                 :            :      */
     525                 :            :     virtual void renameVectorTable( const QString &schema, const QString &name, const QString &newName ) const SIP_THROW( QgsProviderConnectionException );
     526                 :            : 
     527                 :            :     /**
     528                 :            :      * Renames a raster table with given \a schema (schema is ignored if not supported by the backend) and \a name.
     529                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     530                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     531                 :            :      * \throws QgsProviderConnectionException
     532                 :            :      */
     533                 :            :     virtual void renameRasterTable( const QString &schema, const QString &name, const QString &newName ) const SIP_THROW( QgsProviderConnectionException );
     534                 :            : 
     535                 :            :     /**
     536                 :            :      * Creates a new schema with the specified \a name
     537                 :            :      * \throws QgsProviderConnectionException
     538                 :            :      */
     539                 :            :     virtual void createSchema( const QString &name ) const SIP_THROW( QgsProviderConnectionException );
     540                 :            : 
     541                 :            :     /**
     542                 :            :      * Drops an entire schema with the specified name.
     543                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     544                 :            :      * \param name name of the schema to be dropped
     545                 :            :      * \param force if TRUE, a DROP CASCADE will drop all related objects
     546                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     547                 :            :      * \throws QgsProviderConnectionException
     548                 :            :      */
     549                 :            :     virtual void dropSchema( const QString &name, bool force = false ) const SIP_THROW( QgsProviderConnectionException );
     550                 :            : 
     551                 :            :     /**
     552                 :            :      * Deletes the field with the specified name.
     553                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     554                 :            :      * \param fieldName name of the field to be deleted
     555                 :            :      * \param schema name of the schema (schema is ignored if not supported by the backend).
     556                 :            :      * \param tableName name of the table
     557                 :            :      * \param force if TRUE, a DROP CASCADE will drop all related objects
     558                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     559                 :            :      * \throws QgsProviderConnectionException
     560                 :            :      * \since QGIS 3.16
     561                 :            :      */
     562                 :            :     virtual void deleteField( const QString &fieldName, const QString &schema, const QString &tableName, bool force = false ) const SIP_THROW( QgsProviderConnectionException );
     563                 :            : 
     564                 :            :     /**
     565                 :            :      * Adds a field
     566                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     567                 :            :      * \param field specification of the new field
     568                 :            :      * \param schema name of the schema (schema is ignored if not supported by the backend).
     569                 :            :      * \param tableName name of the table
     570                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     571                 :            :      * \throws QgsProviderConnectionException
     572                 :            :      * \since QGIS 3.16
     573                 :            :      */
     574                 :            :     virtual void addField( const QgsField &field, const QString &schema, const QString &tableName ) const SIP_THROW( QgsProviderConnectionException );
     575                 :            : 
     576                 :            : 
     577                 :            :     /**
     578                 :            :      * Renames a schema with the specified \a name.
     579                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     580                 :            :      * \note it is responsibility of the caller to handle open layers and registry entries.
     581                 :            :      * \throws QgsProviderConnectionException
     582                 :            :      */
     583                 :            :     virtual void renameSchema( const QString &name, const QString &newName ) const SIP_THROW( QgsProviderConnectionException );
     584                 :            : 
     585                 :            :     /**
     586                 :            :      * Executes raw \a sql and returns the (possibly empty) list of results in a multi-dimensional array, optionally \a feedback can be provided.
     587                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     588                 :            :      * \see execSql()
     589                 :            :      * \throws QgsProviderConnectionException
     590                 :            :      */
     591                 :            :     virtual QList<QList<QVariant>> executeSql( const QString &sql, QgsFeedback *feedback = nullptr ) const SIP_THROW( QgsProviderConnectionException );
     592                 :            : 
     593                 :            :     /**
     594                 :            :      * Executes raw \a sql and returns the (possibly empty) query results, optionally \a feedback can be provided.
     595                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     596                 :            :      * \see executeSql()
     597                 :            :      * \throws QgsProviderConnectionException
     598                 :            :      * \since QGIS 3.18
     599                 :            :      */
     600                 :            :     virtual QueryResult execSql( const QString &sql, QgsFeedback *feedback = nullptr ) const SIP_THROW( QgsProviderConnectionException );
     601                 :            : 
     602                 :            :     /**
     603                 :            :      * Vacuum the database table with given \a schema and \a name (schema is ignored if not supported by the backend).
     604                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     605                 :            :      * \throws QgsProviderConnectionException
     606                 :            :      */
     607                 :            :     virtual void vacuum( const QString &schema, const QString &name ) const SIP_THROW( QgsProviderConnectionException );
     608                 :            : 
     609                 :            :     /**
     610                 :            :      * Contains extra options relating to spatial index creation.
     611                 :            :      *
     612                 :            :      * \since QGIS 3.14
     613                 :            :      */
     614                 :            :     struct CORE_EXPORT SpatialIndexOptions
     615                 :            :     {
     616                 :            :       //! Specifies the name of the geometry column to create the index for
     617                 :            :       QString geometryColumnName;
     618                 :            :     };
     619                 :            : 
     620                 :            :     /**
     621                 :            :      * Creates a spatial index for the database table with given \a schema and \a name (schema is ignored if not supported by the backend).
     622                 :            :      *
     623                 :            :      * The \a options argument can be used to provide extra options controlling the spatial index creation.
     624                 :            :      *
     625                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     626                 :            :      * \throws QgsProviderConnectionException
     627                 :            :      * \since QGIS 3.14
     628                 :            :      */
     629                 :            :     virtual void createSpatialIndex( const QString &schema, const QString &name, const QgsAbstractDatabaseProviderConnection::SpatialIndexOptions &options = QgsAbstractDatabaseProviderConnection::SpatialIndexOptions() ) const SIP_THROW( QgsProviderConnectionException );
     630                 :            : 
     631                 :            :     /**
     632                 :            :      * Determines whether a spatial index exists for the database table with given \a schema, \a name and \a geometryColumn (\a schema and \a geometryColumn are
     633                 :            :      * ignored if not supported by the backend).
     634                 :            :      *
     635                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     636                 :            :      * \throws QgsProviderConnectionException
     637                 :            :      * \since QGIS 3.14
     638                 :            :      */
     639                 :            :     virtual bool spatialIndexExists( const QString &schema, const QString &name, const QString &geometryColumn ) const SIP_THROW( QgsProviderConnectionException );
     640                 :            : 
     641                 :            :     /**
     642                 :            :      * Deletes the existing spatial index for the database table with given \a schema, \a name and \a geometryColumn (\a schema and \a geometryColumn are
     643                 :            :      * ignored if not supported by the backend).
     644                 :            :      *
     645                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     646                 :            :      * \throws QgsProviderConnectionException
     647                 :            :      * \since QGIS 3.14
     648                 :            :      */
     649                 :            :     virtual void deleteSpatialIndex( const QString &schema, const QString &name, const QString &geometryColumn ) const SIP_THROW( QgsProviderConnectionException );
     650                 :            : 
     651                 :            :     /**
     652                 :            :      * Returns information on the tables in the given schema.
     653                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     654                 :            :      * \param schema name of the schema (ignored if not supported by the backend)
     655                 :            :      * \param flags filter tables by flags, this option completely overrides search options stored in the connection
     656                 :            :      * \throws QgsProviderConnectionException
     657                 :            :      * \note Not available in Python bindings
     658                 :            :      */
     659                 :            :     virtual QList<QgsAbstractDatabaseProviderConnection::TableProperty> tables( const QString &schema = QString(), const QgsAbstractDatabaseProviderConnection::TableFlags &flags = QgsAbstractDatabaseProviderConnection::TableFlags() ) const SIP_SKIP;
     660                 :            : 
     661                 :            :     /**
     662                 :            :      * Returns information on a \a table in the given \a schema.
     663                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered or if the table does not exist.
     664                 :            :      * \throws QgsProviderConnectionException
     665                 :            :      * \note Not available in Python bindings
     666                 :            :      * \since QGIS 3.12
     667                 :            :      */
     668                 :            :     virtual QgsAbstractDatabaseProviderConnection::TableProperty table( const QString &schema, const QString &table ) const SIP_THROW( QgsProviderConnectionException );
     669                 :            : 
     670                 :            :     /**
     671                 :            :      * Returns information on the tables in the given schema.
     672                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     673                 :            :      * \param schema name of the schema (ignored if not supported by the backend)
     674                 :            :      * \param flags filter tables by flags, this option completely overrides search options stored in the connection
     675                 :            :      * \throws QgsProviderConnectionException
     676                 :            :      */
     677                 :            :     QList<QgsAbstractDatabaseProviderConnection::TableProperty> tablesInt( const QString &schema = QString(), const int flags = 0 ) const SIP_THROW( QgsProviderConnectionException ) SIP_PYNAME( tables );
     678                 :            : 
     679                 :            : 
     680                 :            :     // TODO: return more schema information and not just the name
     681                 :            : 
     682                 :            :     /**
     683                 :            :      * Returns information about the existing schemas.
     684                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     685                 :            :      * \throws QgsProviderConnectionException
     686                 :            :      */
     687                 :            :     virtual QStringList schemas() const SIP_THROW( QgsProviderConnectionException );
     688                 :            : 
     689                 :            :     /**
     690                 :            :      * Returns the fields of a \a table and \a schema.
     691                 :            :      * Raises a QgsProviderConnectionException if any errors are encountered.
     692                 :            :      * \note the default implementation creates a temporary vector layer, providers may
     693                 :            :      * choose to override this method for a greater efficiency.
     694                 :            :      * \throws QgsProviderConnectionException
     695                 :            :      * \since QGIS 3.16
     696                 :            :      */
     697                 :            :     virtual QgsFields fields( const QString &schema, const QString &table ) const SIP_THROW( QgsProviderConnectionException );
     698                 :            : 
     699                 :            :     /**
     700                 :            :      * Returns a list of native types supported by the connection.
     701                 :            :      * \throws QgsProviderConnectionException
     702                 :            :      * \since QGIS 3.16
     703                 :            :      */
     704                 :            :     virtual QList< QgsVectorDataProvider::NativeType > nativeTypes() const SIP_THROW( QgsProviderConnectionException ) = 0;
     705                 :            : 
     706                 :            :     /**
     707                 :            :      * Returns the provider key
     708                 :            :      * \since QGIS 3.16
     709                 :            :      */
     710                 :            :     QString providerKey() const;
     711                 :            : 
     712                 :            :   protected:
     713                 :            : 
     714                 :            : ///@cond PRIVATE
     715                 :            : 
     716                 :            :     /**
     717                 :            :      * Checks if \a capability is supported and throws and exception if it's not
     718                 :            :      * \throws QgsProviderConnectionException
     719                 :            :      */
     720                 :            :     void checkCapability( Capability capability ) const;
     721                 :            : ///@endcond
     722                 :            : 
     723                 :            :     Capabilities mCapabilities = Capabilities() SIP_SKIP;
     724                 :            :     GeometryColumnCapabilities mGeometryColumnCapabilities = GeometryColumnCapabilities() SIP_SKIP;
     725                 :            :     QString mProviderKey;
     726                 :            : 
     727                 :            : };
     728                 :            : 
     729                 :            : Q_DECLARE_OPERATORS_FOR_FLAGS( QgsAbstractDatabaseProviderConnection::Capabilities )
     730                 :            : 
     731                 :            : #endif // QGSABSTRACTDATABASEPROVIDERCONNECTION_H

Generated by: LCOV version 1.14