LCOV - code coverage report
Current view: top level - gcore - gdal_dataset.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 41 41 100.0 %
Date: 2025-12-21 22:14:19 Functions: 20 20 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Name:     gdal_dataset.h
       4             :  * Project:  GDAL Core
       5             :  * Purpose:  Declaration of GDALDataset class
       6             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 1998, Frank Warmerdam
      10             :  * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com>
      11             :  *
      12             :  * SPDX-License-Identifier: MIT
      13             :  ****************************************************************************/
      14             : 
      15             : #ifndef GDALDATASET_H_INCLUDED
      16             : #define GDALDATASET_H_INCLUDED
      17             : 
      18             : #include "cpl_port.h"
      19             : #include "gdal_fwd.h"
      20             : #include "gdal.h"
      21             : #include "gdal_geotransform.h"
      22             : #include "gdal_majorobject.h"
      23             : #include "gdal_defaultoverviews.h"
      24             : #include "ogr_core.h"     // for OGRErr
      25             : #include "ogr_feature.h"  // for OGRFeatureUniquePtr
      26             : 
      27             : #include <cstddef>
      28             : #include <iterator>
      29             : #include <memory>
      30             : #include <vector>
      31             : 
      32             : /* ******************************************************************** */
      33             : /*                             GDALDataset                              */
      34             : /* ******************************************************************** */
      35             : 
      36             : class OGRGeometry;
      37             : class OGRLayer;
      38             : class OGRSpatialReference;
      39             : class OGRStyleTable;
      40             : class swq_select;
      41             : class swq_select_parse_options;
      42             : class GDALAsyncReader;
      43             : class GDALDriver;
      44             : class GDALGroup;
      45             : class GDALMDArray;
      46             : class GDALRasterBand;
      47             : class GDALRelationship;
      48             : 
      49             : //! @cond Doxygen_Suppress
      50             : typedef struct GDALSQLParseInfo GDALSQLParseInfo;
      51             : //! @endcond
      52             : 
      53             : //! @cond Doxygen_Suppress
      54             : #if !defined(OPTIONAL_OUTSIDE_GDAL)
      55             : #if defined(GDAL_COMPILATION)
      56             : #define OPTIONAL_OUTSIDE_GDAL(val)
      57             : #else
      58             : #define OPTIONAL_OUTSIDE_GDAL(val) = val
      59             : #endif
      60             : #endif
      61             : //! @endcond
      62             : 
      63             : //! @cond Doxygen_Suppress
      64             : // This macro can be defined to check that GDALDataset::IRasterIO()
      65             : // implementations do not alter the passed panBandList. It is not defined
      66             : // by default (and should not!), hence int* is used.
      67             : #if defined(GDAL_BANDMAP_TYPE_CONST_SAFE)
      68             : #define BANDMAP_TYPE const int *
      69             : #else
      70             : #define BANDMAP_TYPE int *
      71             : #endif
      72             : //! @endcond
      73             : 
      74             : /** A set of associated raster bands, usually from one file. */
      75             : class CPL_DLL GDALDataset : public GDALMajorObject
      76             : {
      77             :     friend GDALDatasetH CPL_STDCALL
      78             :     GDALOpenEx(const char *pszFilename, unsigned int nOpenFlags,
      79             :                const char *const *papszAllowedDrivers,
      80             :                const char *const *papszOpenOptions,
      81             :                const char *const *papszSiblingFiles);
      82             :     friend CPLErr CPL_STDCALL GDALClose(GDALDatasetH hDS);
      83             : 
      84             :     friend class GDALDriver;
      85             :     friend class GDALDefaultOverviews;
      86             :     friend class GDALProxyDataset;
      87             :     friend class GDALDriverManager;
      88             : 
      89             :     CPL_INTERNAL void AddToDatasetOpenList();
      90             : 
      91             :     CPL_INTERNAL void UnregisterFromSharedDataset();
      92             : 
      93             :     CPL_INTERNAL static void ReportErrorV(const char *pszDSName,
      94             :                                           CPLErr eErrClass, CPLErrorNum err_no,
      95             :                                           const char *fmt, va_list args);
      96             : 
      97             :   protected:
      98             :     //! @cond Doxygen_Suppress
      99             :     GDALDriver *poDriver = nullptr;
     100             :     GDALAccess eAccess = GA_ReadOnly;
     101             : 
     102             :     // Stored raster information.
     103             :     int nRasterXSize = 512;
     104             :     int nRasterYSize = 512;
     105             :     int nBands = 0;
     106             :     GDALRasterBand **papoBands = nullptr;
     107             : 
     108             :     static constexpr int OPEN_FLAGS_CLOSED = -1;
     109             :     int nOpenFlags =
     110             :         0;  // set to OPEN_FLAGS_CLOSED after Close() has been called
     111             : 
     112             :     int nRefCount = 1;
     113             :     bool bForceCachedIO = false;
     114             :     bool bShared = false;
     115             :     bool bIsInternal = true;
     116             :     bool bSuppressOnClose = false;
     117             : 
     118             :     mutable std::map<std::string, std::unique_ptr<OGRFieldDomain>>
     119             :         m_oMapFieldDomains{};
     120             : 
     121             :     GDALDataset(void);
     122             :     explicit GDALDataset(int bForceCachedIO);
     123             : 
     124             :     void RasterInitialize(int, int);
     125             :     void SetBand(int nNewBand, GDALRasterBand *poBand);
     126             :     void SetBand(int nNewBand, std::unique_ptr<GDALRasterBand> poBand);
     127             : 
     128             :     GDALDefaultOverviews oOvManager{};
     129             : 
     130             :     virtual CPLErr IBuildOverviews(const char *pszResampling, int nOverviews,
     131             :                                    const int *panOverviewList, int nListBands,
     132             :                                    const int *panBandList,
     133             :                                    GDALProgressFunc pfnProgress,
     134             :                                    void *pProgressData,
     135             :                                    CSLConstList papszOptions);
     136             : 
     137             :     virtual CPLErr
     138             :     IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize,
     139             :               void *pData, int nBufXSize, int nBufYSize, GDALDataType eBufType,
     140             :               int nBandCount, BANDMAP_TYPE panBandMap, GSpacing nPixelSpace,
     141             :               GSpacing nLineSpace, GSpacing nBandSpace,
     142             :               GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
     143             : 
     144             :     /* This method should only be be overloaded by GDALProxyDataset */
     145             :     virtual CPLErr
     146             :     BlockBasedRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
     147             :                        int nYSize, void *pData, int nBufXSize, int nBufYSize,
     148             :                        GDALDataType eBufType, int nBandCount,
     149             :                        const int *panBandMap, GSpacing nPixelSpace,
     150             :                        GSpacing nLineSpace, GSpacing nBandSpace,
     151             :                        GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
     152             :     CPLErr BlockBasedFlushCache(bool bAtClosing);
     153             : 
     154             :     CPLErr
     155             :     BandBasedRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
     156             :                       int nYSize, void *pData, int nBufXSize, int nBufYSize,
     157             :                       GDALDataType eBufType, int nBandCount,
     158             :                       const int *panBandMap, GSpacing nPixelSpace,
     159             :                       GSpacing nLineSpace, GSpacing nBandSpace,
     160             :                       GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
     161             : 
     162             :     CPLErr
     163             :     RasterIOResampled(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
     164             :                       int nYSize, void *pData, int nBufXSize, int nBufYSize,
     165             :                       GDALDataType eBufType, int nBandCount,
     166             :                       const int *panBandMap, GSpacing nPixelSpace,
     167             :                       GSpacing nLineSpace, GSpacing nBandSpace,
     168             :                       GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
     169             : 
     170             :     CPLErr ValidateRasterIOOrAdviseReadParameters(
     171             :         const char *pszCallingFunc, int *pbStopProcessingOnCENone, int nXOff,
     172             :         int nYOff, int nXSize, int nYSize, int nBufXSize, int nBufYSize,
     173             :         int nBandCount, const int *panBandMap);
     174             : 
     175             :     CPLErr TryOverviewRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
     176             :                                int nXSize, int nYSize, void *pData,
     177             :                                int nBufXSize, int nBufYSize,
     178             :                                GDALDataType eBufType, int nBandCount,
     179             :                                const int *panBandMap, GSpacing nPixelSpace,
     180             :                                GSpacing nLineSpace, GSpacing nBandSpace,
     181             :                                GDALRasterIOExtraArg *psExtraArg, int *pbTried);
     182             : 
     183             :     void ShareLockWithParentDataset(GDALDataset *poParentDataset);
     184             : 
     185             :     bool m_bCanBeReopened = false;
     186             : 
     187             :     virtual bool CanBeCloned(int nScopeFlags, bool bCanShareState) const;
     188             : 
     189             :     friend class GDALThreadSafeDataset;
     190             :     friend class MEMDataset;
     191             :     virtual std::unique_ptr<GDALDataset> Clone(int nScopeFlags,
     192             :                                                bool bCanShareState) const;
     193             : 
     194             :     //! @endcond
     195             : 
     196             :     void CleanupPostFileClosing();
     197             : 
     198             :     virtual int CloseDependentDatasets();
     199             :     //! @cond Doxygen_Suppress
     200             :     int ValidateLayerCreationOptions(const char *const *papszLCO);
     201             : 
     202             :     char **papszOpenOptions = nullptr;
     203             : 
     204             :     friend class GDALRasterBand;
     205             : 
     206             :     // The below methods related to read write mutex are fragile logic, and
     207             :     // should not be used by out-of-tree code if possible.
     208             :     int EnterReadWrite(GDALRWFlag eRWFlag);
     209             :     void LeaveReadWrite();
     210             :     void InitRWLock();
     211             : 
     212             :     void TemporarilyDropReadWriteLock();
     213             :     void ReacquireReadWriteLock();
     214             : 
     215             :     void DisableReadWriteMutex();
     216             : 
     217             :     int AcquireMutex();
     218             :     void ReleaseMutex();
     219             : 
     220             :     bool IsAllBands(int nBandCount, const int *panBandList) const;
     221             :     //! @endcond
     222             : 
     223             :   public:
     224             :     ~GDALDataset() override;
     225             : 
     226             :     virtual CPLErr Close(GDALProgressFunc pfnProgress = nullptr,
     227             :                          void *pProgressData = nullptr);
     228             : 
     229             :     virtual bool GetCloseReportsProgress() const;
     230             : 
     231             :     virtual bool CanReopenWithCurrentDescription() const;
     232             : 
     233             :     int GetRasterXSize() const;
     234             :     int GetRasterYSize() const;
     235             :     int GetRasterCount() const;
     236             :     GDALRasterBand *GetRasterBand(int);
     237             :     const GDALRasterBand *GetRasterBand(int) const;
     238             : 
     239             :     /**
     240             :      * @brief SetQueryLoggerFunc
     241             :      * @param pfnQueryLoggerFuncIn query logger function callback
     242             :      * @param poQueryLoggerArgIn arguments passed to the query logger function
     243             :      * @return true on success
     244             :      */
     245             :     virtual bool SetQueryLoggerFunc(GDALQueryLoggerFunc pfnQueryLoggerFuncIn,
     246             :                                     void *poQueryLoggerArgIn);
     247             : 
     248             :     /** Class returned by GetBands() that act as a container for raster bands.
     249             :      */
     250             :     class CPL_DLL Bands
     251             :     {
     252             :       private:
     253             :         friend class GDALDataset;
     254             :         GDALDataset *m_poSelf;
     255             : 
     256           7 :         CPL_INTERNAL explicit Bands(GDALDataset *poSelf) : m_poSelf(poSelf)
     257             :         {
     258           7 :         }
     259             : 
     260           6 :         class CPL_DLL Iterator
     261             :         {
     262             :             struct Private;
     263             :             std::unique_ptr<Private> m_poPrivate;
     264             : 
     265             :           public:
     266             :             Iterator(GDALDataset *poDS, bool bStart);
     267             :             Iterator(const Iterator &oOther);  // declared but not defined.
     268             :                                                // Needed for gcc 5.4 at least
     269             :             Iterator(Iterator &&oOther) noexcept;  // declared but not defined.
     270             :                 // Needed for gcc 5.4 at least
     271             :             ~Iterator();
     272             :             GDALRasterBand *operator*();
     273             :             Iterator &operator++();
     274             :             bool operator!=(const Iterator &it) const;
     275             :         };
     276             : 
     277             :       public:
     278             :         const Iterator begin() const;
     279             : 
     280             :         const Iterator end() const;
     281             : 
     282             :         size_t size() const;
     283             : 
     284             :         GDALRasterBand *operator[](int iBand);
     285             :         GDALRasterBand *operator[](size_t iBand);
     286             :     };
     287             : 
     288             :     Bands GetBands();
     289             : 
     290             :     /** Class returned by GetBands() that act as a container for raster bands.
     291             :      */
     292             :     class CPL_DLL ConstBands
     293             :     {
     294             :       private:
     295             :         friend class GDALDataset;
     296             :         const GDALDataset *const m_poSelf;
     297             : 
     298           4 :         CPL_INTERNAL explicit ConstBands(const GDALDataset *poSelf)
     299           4 :             : m_poSelf(poSelf)
     300             :         {
     301           4 :         }
     302             : 
     303           2 :         class CPL_DLL Iterator
     304             :         {
     305             :             struct Private;
     306             :             std::unique_ptr<Private> m_poPrivate;
     307             : 
     308             :           public:
     309             :             Iterator(const GDALDataset *poDS, bool bStart);
     310             :             ~Iterator();
     311             :             const GDALRasterBand *operator*() const;
     312             :             Iterator &operator++();
     313             :             bool operator!=(const Iterator &it) const;
     314             :         };
     315             : 
     316             :       public:
     317             :         const Iterator begin() const;
     318             : 
     319             :         const Iterator end() const;
     320             : 
     321             :         size_t size() const;
     322             : 
     323             :         const GDALRasterBand *operator[](int iBand) const;
     324             :         const GDALRasterBand *operator[](size_t iBand) const;
     325             :     };
     326             : 
     327             :     ConstBands GetBands() const;
     328             : 
     329             :     virtual CPLErr FlushCache(bool bAtClosing = false);
     330             :     virtual CPLErr DropCache();
     331             : 
     332             :     virtual GIntBig GetEstimatedRAMUsage();
     333             : 
     334             :     virtual const OGRSpatialReference *GetSpatialRef() const;
     335             :     virtual CPLErr SetSpatialRef(const OGRSpatialReference *poSRS);
     336             : 
     337             :     virtual const OGRSpatialReference *GetSpatialRefRasterOnly() const;
     338             :     virtual const OGRSpatialReference *GetSpatialRefVectorOnly() const;
     339             : 
     340             :     // Compatibility layer
     341             :     const char *GetProjectionRef(void) const;
     342             :     CPLErr SetProjection(const char *pszProjection);
     343             : 
     344             :     virtual CPLErr GetGeoTransform(GDALGeoTransform &gt) const;
     345             :     virtual CPLErr SetGeoTransform(const GDALGeoTransform &gt);
     346             : 
     347             :     CPLErr GetGeoTransform(double *padfGeoTransform) const
     348             : #if defined(GDAL_COMPILATION) && !defined(DOXYGEN_XML)
     349             :         CPL_WARN_DEPRECATED("Use GetGeoTransform(GDALGeoTransform&) instead")
     350             : #endif
     351             :             ;
     352             : 
     353             :     CPLErr SetGeoTransform(const double *padfGeoTransform)
     354             : #if defined(GDAL_COMPILATION) && !defined(DOXYGEN_XML)
     355             :         CPL_WARN_DEPRECATED(
     356             :             "Use SetGeoTransform(const GDALGeoTransform&) instead")
     357             : #endif
     358             :             ;
     359             : 
     360             :     virtual CPLErr GetExtent(OGREnvelope *psExtent,
     361             :                              const OGRSpatialReference *poCRS = nullptr) const;
     362             :     virtual CPLErr GetExtentWGS84LongLat(OGREnvelope *psExtent) const;
     363             : 
     364             :     CPLErr GeolocationToPixelLine(
     365             :         double dfGeolocX, double dfGeolocY, const OGRSpatialReference *poSRS,
     366             :         double *pdfPixel, double *pdfLine,
     367             :         CSLConstList papszTransformerOptions = nullptr) const;
     368             : 
     369             :     virtual CPLErr AddBand(GDALDataType eType, char **papszOptions = nullptr);
     370             : 
     371             :     virtual void *GetInternalHandle(const char *pszHandleName);
     372             :     virtual GDALDriver *GetDriver(void);
     373             :     virtual char **GetFileList(void);
     374             : 
     375             :     const char *GetDriverName() const;
     376             : 
     377             :     virtual const OGRSpatialReference *GetGCPSpatialRef() const;
     378             :     virtual int GetGCPCount();
     379             :     virtual const GDAL_GCP *GetGCPs();
     380             :     virtual CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList,
     381             :                            const OGRSpatialReference *poGCP_SRS);
     382             : 
     383             :     // Compatibility layer
     384             :     const char *GetGCPProjection() const;
     385             :     CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList,
     386             :                    const char *pszGCPProjection);
     387             : 
     388             :     virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,
     389             :                               int nBufXSize, int nBufYSize, GDALDataType eDT,
     390             :                               int nBandCount, int *panBandList,
     391             :                               char **papszOptions);
     392             : 
     393             :     virtual CPLErr CreateMaskBand(int nFlagsIn);
     394             : 
     395             :     virtual GDALAsyncReader *
     396             :     BeginAsyncReader(int nXOff, int nYOff, int nXSize, int nYSize, void *pBuf,
     397             :                      int nBufXSize, int nBufYSize, GDALDataType eBufType,
     398             :                      int nBandCount, int *panBandMap, int nPixelSpace,
     399             :                      int nLineSpace, int nBandSpace, char **papszOptions);
     400             :     virtual void EndAsyncReader(GDALAsyncReader *poARIO);
     401             : 
     402             :     //! @cond Doxygen_Suppress
     403             :     struct RawBinaryLayout
     404             :     {
     405             :         enum class Interleaving
     406             :         {
     407             :             UNKNOWN,
     408             :             BIP,
     409             :             BIL,
     410             :             BSQ
     411             :         };
     412             :         std::string osRawFilename{};
     413             :         Interleaving eInterleaving = Interleaving::UNKNOWN;
     414             :         GDALDataType eDataType = GDT_Unknown;
     415             :         bool bLittleEndianOrder = false;
     416             : 
     417             :         vsi_l_offset nImageOffset = 0;
     418             :         GIntBig nPixelOffset = 0;
     419             :         GIntBig nLineOffset = 0;
     420             :         GIntBig nBandOffset = 0;
     421             :     };
     422             : 
     423             :     virtual bool GetRawBinaryLayout(RawBinaryLayout &);
     424             :     //! @endcond
     425             : 
     426             : #ifndef DOXYGEN_SKIP
     427             :     CPLErr RasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
     428             :                     int nYSize, void *pData, int nBufXSize, int nBufYSize,
     429             :                     GDALDataType eBufType, int nBandCount,
     430             :                     const int *panBandMap, GSpacing nPixelSpace,
     431             :                     GSpacing nLineSpace, GSpacing nBandSpace,
     432             :                     GDALRasterIOExtraArg *psExtraArg
     433             :                         OPTIONAL_OUTSIDE_GDAL(nullptr)) CPL_WARN_UNUSED_RESULT;
     434             : #else
     435             :     CPLErr RasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
     436             :                     int nYSize, void *pData, int nBufXSize, int nBufYSize,
     437             :                     GDALDataType eBufType, int nBandCount,
     438             :                     const int *panBandMap, GSpacing nPixelSpace,
     439             :                     GSpacing nLineSpace, GSpacing nBandSpace,
     440             :                     GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
     441             : #endif
     442             : 
     443             :     virtual CPLStringList GetCompressionFormats(int nXOff, int nYOff,
     444             :                                                 int nXSize, int nYSize,
     445             :                                                 int nBandCount,
     446             :                                                 const int *panBandList);
     447             :     virtual CPLErr ReadCompressedData(const char *pszFormat, int nXOff,
     448             :                                       int nYOff, int nXSize, int nYSize,
     449             :                                       int nBands, const int *panBandList,
     450             :                                       void **ppBuffer, size_t *pnBufferSize,
     451             :                                       char **ppszDetailedFormat);
     452             : 
     453             :     int Reference();
     454             :     int Dereference();
     455             :     int ReleaseRef();
     456             : 
     457             :     /** Return access mode.
     458             :      * @return access mode.
     459             :      */
     460      197684 :     GDALAccess GetAccess() const
     461             :     {
     462      197684 :         return eAccess;
     463             :     }
     464             : 
     465             :     int GetShared() const;
     466             :     void MarkAsShared();
     467             : 
     468             :     void MarkSuppressOnClose();
     469             :     void UnMarkSuppressOnClose();
     470             : 
     471             :     /** Return MarkSuppressOnClose flag.
     472             :     * @return MarkSuppressOnClose flag.
     473             :     */
     474     5772924 :     bool IsMarkedSuppressOnClose() const
     475             :     {
     476     5772924 :         return bSuppressOnClose;
     477             :     }
     478             : 
     479             :     /** Return open options.
     480             :      * @return open options.
     481             :      */
     482      144296 :     char **GetOpenOptions()
     483             :     {
     484      144296 :         return papszOpenOptions;
     485             :     }
     486             : 
     487             :     bool IsThreadSafe(int nScopeFlags) const;
     488             : 
     489             : #ifndef DOXYGEN_SKIP
     490             :     /** Return open options.
     491             :      * @return open options.
     492             :      */
     493           8 :     CSLConstList GetOpenOptions() const
     494             :     {
     495           8 :         return papszOpenOptions;
     496             :     }
     497             : #endif
     498             : 
     499             :     static GDALDataset **GetOpenDatasets(int *pnDatasetCount);
     500             : 
     501             : #ifndef DOXYGEN_SKIP
     502             :     CPLErr
     503             :     BuildOverviews(const char *pszResampling, int nOverviews,
     504             :                    const int *panOverviewList, int nListBands,
     505             :                    const int *panBandList, GDALProgressFunc pfnProgress,
     506             :                    void *pProgressData,
     507             :                    CSLConstList papszOptions OPTIONAL_OUTSIDE_GDAL(nullptr));
     508             : #else
     509             :     CPLErr BuildOverviews(const char *pszResampling, int nOverviews,
     510             :                           const int *panOverviewList, int nListBands,
     511             :                           const int *panBandList, GDALProgressFunc pfnProgress,
     512             :                           void *pProgressData, CSLConstList papszOptions);
     513             : #endif
     514             : 
     515             :     virtual CPLErr AddOverviews(const std::vector<GDALDataset *> &apoSrcOvrDS,
     516             :                                 GDALProgressFunc pfnProgress,
     517             :                                 void *pProgressData, CSLConstList papszOptions);
     518             : 
     519             :     CPLErr GetInterBandCovarianceMatrix(
     520             :         double *padfCovMatrix, size_t nSize, int nBandCount = 0,
     521             :         const int *panBandList = nullptr, bool bApproxOK = false,
     522             :         bool bForce = false, bool bWriteIntoMetadata = true,
     523             :         int nDeltaDegreeOfFreedom = 1, GDALProgressFunc pfnProgress = nullptr,
     524             :         void *pProgressData = nullptr);
     525             : 
     526             :     std::vector<double> GetInterBandCovarianceMatrix(
     527             :         int nBandCount = 0, const int *panBandList = nullptr,
     528             :         bool bApproxOK = false, bool bForce = false,
     529             :         bool bWriteIntoMetadata = true, int nDeltaDegreeOfFreedom = 1,
     530             :         GDALProgressFunc pfnProgress = nullptr, void *pProgressData = nullptr);
     531             : 
     532             :     CPLErr ComputeInterBandCovarianceMatrix(
     533             :         double *padfCovMatrix, size_t nSize, int nBandCount = 0,
     534             :         const int *panBandList = nullptr, bool bApproxOK = false,
     535             :         bool bWriteIntoMetadata = true, int nDeltaDegreeOfFreedom = 1,
     536             :         GDALProgressFunc pfnProgress = nullptr, void *pProgressData = nullptr);
     537             : 
     538             :     std::vector<double> ComputeInterBandCovarianceMatrix(
     539             :         int nBandCount = 0, const int *panBandList = nullptr,
     540             :         bool bApproxOK = false, bool bWriteIntoMetadata = true,
     541             :         int nDeltaDegreeOfFreedom = 1, GDALProgressFunc pfnProgress = nullptr,
     542             :         void *pProgressData = nullptr);
     543             : 
     544             : #ifndef DOXYGEN_XML
     545             :     void ReportError(CPLErr eErrClass, CPLErrorNum err_no, const char *fmt,
     546             :                      ...) const CPL_PRINT_FUNC_FORMAT(4, 5);
     547             : 
     548             :     static void ReportError(const char *pszDSName, CPLErr eErrClass,
     549             :                             CPLErrorNum err_no, const char *fmt, ...)
     550             :         CPL_PRINT_FUNC_FORMAT(4, 5);
     551             : #endif
     552             : 
     553             :     char **GetMetadata(const char *pszDomain = "") override;
     554             : 
     555             : // Only defined when Doxygen enabled
     556             : #ifdef DOXYGEN_SKIP
     557             :     CPLErr SetMetadata(char **papszMetadata, const char *pszDomain) override;
     558             :     CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
     559             :                            const char *pszDomain) override;
     560             : #endif
     561             : 
     562             :     char **GetMetadataDomainList() override;
     563             : 
     564             :     virtual void ClearStatistics();
     565             : 
     566             :     std::shared_ptr<GDALMDArray> AsMDArray(CSLConstList papszOptions = nullptr);
     567             : 
     568             :     /** Convert a GDALDataset* to a GDALDatasetH.
     569             :      */
     570       36605 :     static inline GDALDatasetH ToHandle(GDALDataset *poDS)
     571             :     {
     572       36605 :         return static_cast<GDALDatasetH>(poDS);
     573             :     }
     574             : 
     575             :     /** Convert a GDALDatasetH to a GDALDataset*.
     576             :      */
     577     1535442 :     static inline GDALDataset *FromHandle(GDALDatasetH hDS)
     578             :     {
     579     1535442 :         return static_cast<GDALDataset *>(hDS);
     580             :     }
     581             : 
     582             :     /** @see GDALOpenEx().
     583             :      */
     584       31959 :     static GDALDataset *Open(const char *pszFilename,
     585             :                              unsigned int nOpenFlags = 0,
     586             :                              const char *const *papszAllowedDrivers = nullptr,
     587             :                              const char *const *papszOpenOptions = nullptr,
     588             :                              const char *const *papszSiblingFiles = nullptr)
     589             :     {
     590       31959 :         return FromHandle(GDALOpenEx(pszFilename, nOpenFlags,
     591             :                                      papszAllowedDrivers, papszOpenOptions,
     592       31959 :                                      papszSiblingFiles));
     593             :     }
     594             : 
     595             :     /** Object returned by GetFeatures() iterators */
     596             :     struct FeatureLayerPair
     597             :     {
     598             :         /** Unique pointer to a OGRFeature. */
     599             :         OGRFeatureUniquePtr feature{};
     600             : 
     601             :         /** Layer to which the feature belongs to. */
     602             :         OGRLayer *layer = nullptr;
     603             :     };
     604             : 
     605             :     //! @cond Doxygen_Suppress
     606             :     // SetEnableOverviews() only to be used by GDALOverviewDataset
     607             :     void SetEnableOverviews(bool bEnable);
     608             : 
     609             :     // Only to be used by driver's GetOverviewCount() method.
     610             :     bool AreOverviewsEnabled() const;
     611             : 
     612             :     static void ReportUpdateNotSupportedByDriver(const char *pszDriverName);
     613             :     //! @endcond
     614             : 
     615             :   private:
     616             :     class Private;
     617             :     Private *m_poPrivate;
     618             : 
     619             :     CPL_INTERNAL OGRLayer *BuildLayerFromSelectInfo(
     620             :         swq_select *psSelectInfo, OGRGeometry *poSpatialFilter,
     621             :         const char *pszDialect, swq_select_parse_options *poSelectParseOptions);
     622             :     CPLStringList oDerivedMetadataList{};
     623             : 
     624             :   public:
     625             :     virtual int GetLayerCount() const;
     626             :     virtual const OGRLayer *GetLayer(int iLayer) const;
     627             : 
     628     1866626 :     OGRLayer *GetLayer(int iLayer)
     629             :     {
     630             :         return const_cast<OGRLayer *>(
     631     1866626 :             const_cast<const GDALDataset *>(this)->GetLayer(iLayer));
     632             :     }
     633             : 
     634             :     virtual bool IsLayerPrivate(int iLayer) const;
     635             : 
     636             :     /** Class returned by GetLayers() that acts as a range of layers.
     637             :      */
     638             :     class CPL_DLL Layers
     639             :     {
     640             :       private:
     641             :         friend class GDALDataset;
     642             :         GDALDataset *m_poSelf;
     643             : 
     644         327 :         CPL_INTERNAL explicit Layers(GDALDataset *poSelf) : m_poSelf(poSelf)
     645             :         {
     646         327 :         }
     647             : 
     648             :       public:
     649             :         /** Layer iterator.
     650             :          */
     651         664 :         class CPL_DLL Iterator
     652             :         {
     653             :             struct Private;
     654             :             std::unique_ptr<Private> m_poPrivate;
     655             : 
     656             :           public:
     657             :             using value_type = OGRLayer *; /**< value_type */
     658             :             using reference = OGRLayer *;  /**< reference */
     659             :             using difference_type = void;  /**< difference_type */
     660             :             using pointer = void;          /**< pointer */
     661             :             using iterator_category =
     662             :                 std::input_iterator_tag; /**< iterator_category */
     663             : 
     664             :             Iterator(); /**< Default constructor */
     665             :             Iterator(GDALDataset *poDS, bool bStart); /**< Constructor */
     666             :             Iterator(const Iterator &oOther);         /**< Copy constructor */
     667             :             Iterator(Iterator &&oOther) noexcept;     /**< Move constructor */
     668             :             ~Iterator();                              /**< Destructor */
     669             : 
     670             :             Iterator &
     671             :             operator=(const Iterator &oOther); /**< Assignment operator */
     672             :             Iterator &operator=(
     673             :                 Iterator &&oOther) noexcept; /**< Move assignment operator */
     674             : 
     675             :             value_type operator*() const; /**< Dereference operator */
     676             :             Iterator &operator++();       /**< Pre-increment operator */
     677             :             Iterator operator++(int);     /**< Post-increment operator */
     678             :             bool operator!=(const Iterator &it)
     679             :                 const; /**< Difference comparison operator */
     680             :         };
     681             : 
     682             :         Iterator begin() const;
     683             :         Iterator end() const;
     684             : 
     685             :         size_t size() const;
     686             : 
     687             :         OGRLayer *operator[](int iLayer);
     688             :         OGRLayer *operator[](size_t iLayer);
     689             :         OGRLayer *operator[](const char *pszLayername);
     690             :     };
     691             : 
     692             :     Layers GetLayers();
     693             : 
     694             :     /** Class returned by GetLayers() that acts as a range of layers.
     695             :      * @since GDAL 3.12
     696             :      */
     697             :     class CPL_DLL ConstLayers
     698             :     {
     699             :       private:
     700             :         friend class GDALDataset;
     701             :         const GDALDataset *m_poSelf;
     702             : 
     703       17566 :         CPL_INTERNAL explicit ConstLayers(const GDALDataset *poSelf)
     704       17566 :             : m_poSelf(poSelf)
     705             :         {
     706       17566 :         }
     707             : 
     708             :       public:
     709             :         /** Layer iterator.
     710             :          * @since GDAL 3.12
     711             :          */
     712       35142 :         class CPL_DLL Iterator
     713             :         {
     714             :             struct Private;
     715             :             std::unique_ptr<Private> m_poPrivate;
     716             : 
     717             :           public:
     718             :             using value_type = const OGRLayer *; /**< value_type */
     719             :             using reference = const OGRLayer *;  /**< reference */
     720             :             using difference_type = void;        /**< difference_type */
     721             :             using pointer = void;                /**< pointer */
     722             :             using iterator_category =
     723             :                 std::input_iterator_tag; /**< iterator_category */
     724             : 
     725             :             Iterator(); /**< Default constructor */
     726             :             Iterator(const GDALDataset *poDS, bool bStart); /**< Constructor */
     727             :             Iterator(const Iterator &oOther);     /**< Copy constructor */
     728             :             Iterator(Iterator &&oOther) noexcept; /**< Move constructor */
     729             :             ~Iterator();                          /**< Destructor */
     730             : 
     731             :             Iterator &
     732             :             operator=(const Iterator &oOther); /**< Assignment operator */
     733             :             Iterator &operator=(
     734             :                 Iterator &&oOther) noexcept; /**< Move assignment operator */
     735             : 
     736             :             value_type operator*() const; /**< Dereference operator */
     737             :             Iterator &operator++();       /**< Pre-increment operator */
     738             :             Iterator operator++(int);     /**< Post-increment operator */
     739             :             bool operator!=(const Iterator &it)
     740             :                 const; /**< Difference comparison operator */
     741             :         };
     742             : 
     743             :         Iterator begin() const;
     744             :         Iterator end() const;
     745             : 
     746             :         size_t size() const;
     747             : 
     748             :         const OGRLayer *operator[](int iLayer);
     749             :         const OGRLayer *operator[](size_t iLayer);
     750             :         const OGRLayer *operator[](const char *pszLayername);
     751             :     };
     752             : 
     753             :     ConstLayers GetLayers() const;
     754             : 
     755             :     virtual OGRLayer *GetLayerByName(const char *);
     756             : 
     757             :     int GetLayerIndex(const char *pszName) const;
     758             : 
     759             :     virtual OGRErr DeleteLayer(int iLayer);
     760             : 
     761             :     virtual void ResetReading();
     762             :     virtual OGRFeature *GetNextFeature(OGRLayer **ppoBelongingLayer,
     763             :                                        double *pdfProgressPct,
     764             :                                        GDALProgressFunc pfnProgress,
     765             :                                        void *pProgressData);
     766             : 
     767             :     /** Class returned by GetFeatures() that act as a container for vector
     768             :      * features. */
     769             :     class CPL_DLL Features
     770             :     {
     771             :       private:
     772             :         friend class GDALDataset;
     773             :         GDALDataset *m_poSelf;
     774             : 
     775           2 :         CPL_INTERNAL explicit Features(GDALDataset *poSelf) : m_poSelf(poSelf)
     776             :         {
     777           2 :         }
     778             : 
     779           4 :         class CPL_DLL Iterator
     780             :         {
     781             :             struct Private;
     782             :             std::unique_ptr<Private> m_poPrivate;
     783             : 
     784             :           public:
     785             :             Iterator(GDALDataset *poDS, bool bStart);
     786             :             Iterator(const Iterator &oOther);  // declared but not defined.
     787             :                                                // Needed for gcc 5.4 at least
     788             :             Iterator(Iterator &&oOther) noexcept;  // declared but not defined.
     789             :                 // Needed for gcc 5.4 at least
     790             :             ~Iterator();
     791             :             const FeatureLayerPair &operator*() const;
     792             :             Iterator &operator++();
     793             :             bool operator!=(const Iterator &it) const;
     794             :         };
     795             : 
     796             :       public:
     797             :         const Iterator begin() const;
     798             : 
     799             :         const Iterator end() const;
     800             :     };
     801             : 
     802             :     Features GetFeatures();
     803             : 
     804             :     virtual int TestCapability(const char *) const;
     805             : 
     806             :     virtual std::vector<std::string>
     807             :     GetFieldDomainNames(CSLConstList papszOptions = nullptr) const;
     808             : 
     809             :     virtual const OGRFieldDomain *GetFieldDomain(const std::string &name) const;
     810             : 
     811             :     virtual bool AddFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
     812             :                                 std::string &failureReason);
     813             : 
     814             :     virtual bool DeleteFieldDomain(const std::string &name,
     815             :                                    std::string &failureReason);
     816             : 
     817             :     virtual bool UpdateFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
     818             :                                    std::string &failureReason);
     819             : 
     820             :     virtual std::vector<std::string>
     821             :     GetRelationshipNames(CSLConstList papszOptions = nullptr) const;
     822             : 
     823             :     virtual const GDALRelationship *
     824             :     GetRelationship(const std::string &name) const;
     825             : 
     826             :     virtual bool
     827             :     AddRelationship(std::unique_ptr<GDALRelationship> &&relationship,
     828             :                     std::string &failureReason);
     829             : 
     830             :     virtual bool DeleteRelationship(const std::string &name,
     831             :                                     std::string &failureReason);
     832             : 
     833             :     virtual bool
     834             :     UpdateRelationship(std::unique_ptr<GDALRelationship> &&relationship,
     835             :                        std::string &failureReason);
     836             : 
     837             :     //! @cond Doxygen_Suppress
     838             :     OGRLayer *CreateLayer(const char *pszName);
     839             : 
     840             :     OGRLayer *CreateLayer(const char *pszName, std::nullptr_t);
     841             :     //! @endcond
     842             : 
     843             :     OGRLayer *CreateLayer(const char *pszName,
     844             :                           const OGRSpatialReference *poSpatialRef,
     845             :                           OGRwkbGeometryType eGType = wkbUnknown,
     846             :                           CSLConstList papszOptions = nullptr);
     847             : 
     848             :     OGRLayer *CreateLayer(const char *pszName,
     849             :                           const OGRGeomFieldDefn *poGeomFieldDefn,
     850             :                           CSLConstList papszOptions = nullptr);
     851             : 
     852             :     virtual OGRLayer *CopyLayer(OGRLayer *poSrcLayer, const char *pszNewName,
     853             :                                 char **papszOptions = nullptr);
     854             : 
     855             :     virtual OGRStyleTable *GetStyleTable();
     856             :     virtual void SetStyleTableDirectly(OGRStyleTable *poStyleTable);
     857             : 
     858             :     virtual void SetStyleTable(OGRStyleTable *poStyleTable);
     859             : 
     860             :     virtual OGRLayer *ExecuteSQL(const char *pszStatement,
     861             :                                  OGRGeometry *poSpatialFilter,
     862             :                                  const char *pszDialect);
     863             :     virtual void ReleaseResultSet(OGRLayer *poResultsSet);
     864             :     virtual OGRErr AbortSQL();
     865             : 
     866             :     int GetRefCount() const;
     867             :     int GetSummaryRefCount() const;
     868             :     OGRErr Release();
     869             : 
     870             :     virtual OGRErr StartTransaction(int bForce = FALSE);
     871             :     virtual OGRErr CommitTransaction();
     872             :     virtual OGRErr RollbackTransaction();
     873             : 
     874             :     virtual std::shared_ptr<GDALGroup> GetRootGroup() const;
     875             : 
     876             :     static std::string BuildFilename(const char *pszFilename,
     877             :                                      const char *pszReferencePath,
     878             :                                      bool bRelativeToReferencePath);
     879             : 
     880             :     //! @cond Doxygen_Suppress
     881             :     static int IsGenericSQLDialect(const char *pszDialect);
     882             : 
     883             :     // Semi-public methods. Only to be used by in-tree drivers.
     884             :     GDALSQLParseInfo *
     885             :     BuildParseInfo(swq_select *psSelectInfo,
     886             :                    swq_select_parse_options *poSelectParseOptions);
     887             :     static void DestroyParseInfo(GDALSQLParseInfo *psParseInfo);
     888             :     OGRLayer *ExecuteSQL(const char *pszStatement, OGRGeometry *poSpatialFilter,
     889             :                          const char *pszDialect,
     890             :                          swq_select_parse_options *poSelectParseOptions);
     891             : 
     892             :     static constexpr const char *const apszSpecialSubDatasetSyntax[] = {
     893             :         "NITF_IM:{ANY}:{FILENAME}", "PDF:{ANY}:{FILENAME}",
     894             :         "RASTERLITE:{FILENAME},{ANY}", "TILEDB:\"{FILENAME}\":{ANY}",
     895             :         "TILEDB:{FILENAME}:{ANY}"};
     896             : 
     897             :     //! @endcond
     898             : 
     899             :   protected:
     900             :     virtual OGRLayer *ICreateLayer(const char *pszName,
     901             :                                    const OGRGeomFieldDefn *poGeomFieldDefn,
     902             :                                    CSLConstList papszOptions);
     903             : 
     904             :     //! @cond Doxygen_Suppress
     905             :     OGRErr ProcessSQLCreateIndex(const char *);
     906             :     OGRErr ProcessSQLDropIndex(const char *);
     907             :     OGRErr ProcessSQLDropTable(const char *);
     908             :     OGRErr ProcessSQLAlterTableAddColumn(const char *);
     909             :     OGRErr ProcessSQLAlterTableDropColumn(const char *);
     910             :     OGRErr ProcessSQLAlterTableAlterColumn(const char *);
     911             :     OGRErr ProcessSQLAlterTableRenameColumn(const char *);
     912             : 
     913             :     OGRStyleTable *m_poStyleTable = nullptr;
     914             : 
     915             :     friend class GDALProxyPoolDataset;
     916             :     //! @endcond
     917             : 
     918             :   private:
     919             :     CPL_DISALLOW_COPY_ASSIGN(GDALDataset)
     920             : };
     921             : 
     922             : //! @cond Doxygen_Suppress
     923             : struct CPL_DLL GDALDatasetUniquePtrDeleter
     924             : {
     925         101 :     void operator()(GDALDataset *poDataset) const
     926             :     {
     927         101 :         GDALClose(poDataset);
     928         101 :     }
     929             : };
     930             : 
     931             : //! @endcond
     932             : 
     933             : //! @cond Doxygen_Suppress
     934             : struct CPL_DLL GDALDatasetUniquePtrReleaser
     935             : {
     936        2309 :     void operator()(GDALDataset *poDataset) const
     937             :     {
     938        2309 :         if (poDataset)
     939        2305 :             poDataset->Release();
     940        2309 :     }
     941             : };
     942             : 
     943             : //! @endcond
     944             : 
     945             : /** Unique pointer type for GDALDataset.
     946             :  * Appropriate for use on datasets open in non-shared mode and onto which
     947             :  * reference counter has not been manually modified.
     948             :  */
     949             : using GDALDatasetUniquePtr =
     950             :     std::unique_ptr<GDALDataset, GDALDatasetUniquePtrDeleter>;
     951             : 
     952             : #endif

Generated by: LCOV version 1.14