Coverage Report

Created: 2025-11-16 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/gcore/gdal_dataset.h
Line
Count
Source
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();
227
228
    int GetRasterXSize() const;
229
    int GetRasterYSize() const;
230
    int GetRasterCount() const;
231
    GDALRasterBand *GetRasterBand(int);
232
    const GDALRasterBand *GetRasterBand(int) const;
233
234
    /**
235
     * @brief SetQueryLoggerFunc
236
     * @param pfnQueryLoggerFuncIn query logger function callback
237
     * @param poQueryLoggerArgIn arguments passed to the query logger function
238
     * @return true on success
239
     */
240
    virtual bool SetQueryLoggerFunc(GDALQueryLoggerFunc pfnQueryLoggerFuncIn,
241
                                    void *poQueryLoggerArgIn);
242
243
    /** Class returned by GetBands() that act as a container for raster bands.
244
     */
245
    class CPL_DLL Bands
246
    {
247
      private:
248
        friend class GDALDataset;
249
        GDALDataset *m_poSelf;
250
251
0
        CPL_INTERNAL explicit Bands(GDALDataset *poSelf) : m_poSelf(poSelf)
252
0
        {
253
0
        }
254
255
        class CPL_DLL Iterator
256
        {
257
            struct Private;
258
            std::unique_ptr<Private> m_poPrivate;
259
260
          public:
261
            Iterator(GDALDataset *poDS, bool bStart);
262
            Iterator(const Iterator &oOther);  // declared but not defined.
263
                                               // Needed for gcc 5.4 at least
264
            Iterator(Iterator &&oOther) noexcept;  // declared but not defined.
265
                // Needed for gcc 5.4 at least
266
            ~Iterator();
267
            GDALRasterBand *operator*();
268
            Iterator &operator++();
269
            bool operator!=(const Iterator &it) const;
270
        };
271
272
      public:
273
        const Iterator begin() const;
274
275
        const Iterator end() const;
276
277
        size_t size() const;
278
279
        GDALRasterBand *operator[](int iBand);
280
        GDALRasterBand *operator[](size_t iBand);
281
    };
282
283
    Bands GetBands();
284
285
    /** Class returned by GetBands() that act as a container for raster bands.
286
     */
287
    class CPL_DLL ConstBands
288
    {
289
      private:
290
        friend class GDALDataset;
291
        const GDALDataset *const m_poSelf;
292
293
        CPL_INTERNAL explicit ConstBands(const GDALDataset *poSelf)
294
0
            : m_poSelf(poSelf)
295
0
        {
296
0
        }
297
298
        class CPL_DLL Iterator
299
        {
300
            struct Private;
301
            std::unique_ptr<Private> m_poPrivate;
302
303
          public:
304
            Iterator(const GDALDataset *poDS, bool bStart);
305
            ~Iterator();
306
            const GDALRasterBand *operator*() const;
307
            Iterator &operator++();
308
            bool operator!=(const Iterator &it) const;
309
        };
310
311
      public:
312
        const Iterator begin() const;
313
314
        const Iterator end() const;
315
316
        size_t size() const;
317
318
        const GDALRasterBand *operator[](int iBand) const;
319
        const GDALRasterBand *operator[](size_t iBand) const;
320
    };
321
322
    ConstBands GetBands() const;
323
324
    virtual CPLErr FlushCache(bool bAtClosing = false);
325
    virtual CPLErr DropCache();
326
327
    virtual GIntBig GetEstimatedRAMUsage();
328
329
    virtual const OGRSpatialReference *GetSpatialRef() const;
330
    virtual CPLErr SetSpatialRef(const OGRSpatialReference *poSRS);
331
332
    virtual const OGRSpatialReference *GetSpatialRefRasterOnly() const;
333
    virtual const OGRSpatialReference *GetSpatialRefVectorOnly() const;
334
335
    // Compatibility layer
336
    const char *GetProjectionRef(void) const;
337
    CPLErr SetProjection(const char *pszProjection);
338
339
    virtual CPLErr GetGeoTransform(GDALGeoTransform &gt) const;
340
    virtual CPLErr SetGeoTransform(const GDALGeoTransform &gt);
341
342
    CPLErr GetGeoTransform(double *padfGeoTransform) const
343
#if defined(GDAL_COMPILATION) && !defined(DOXYGEN_XML)
344
        CPL_WARN_DEPRECATED("Use GetGeoTransform(GDALGeoTransform&) instead")
345
#endif
346
            ;
347
348
    CPLErr SetGeoTransform(const double *padfGeoTransform)
349
#if defined(GDAL_COMPILATION) && !defined(DOXYGEN_XML)
350
        CPL_WARN_DEPRECATED(
351
            "Use SetGeoTransform(const GDALGeoTransform&) instead")
352
#endif
353
            ;
354
355
    virtual CPLErr GetExtent(OGREnvelope *psExtent,
356
                             const OGRSpatialReference *poCRS = nullptr) const;
357
    virtual CPLErr GetExtentWGS84LongLat(OGREnvelope *psExtent) const;
358
359
    CPLErr GeolocationToPixelLine(
360
        double dfGeolocX, double dfGeolocY, const OGRSpatialReference *poSRS,
361
        double *pdfPixel, double *pdfLine,
362
        CSLConstList papszTransformerOptions = nullptr) const;
363
364
    virtual CPLErr AddBand(GDALDataType eType, char **papszOptions = nullptr);
365
366
    virtual void *GetInternalHandle(const char *pszHandleName);
367
    virtual GDALDriver *GetDriver(void);
368
    virtual char **GetFileList(void);
369
370
    const char *GetDriverName() const;
371
372
    virtual const OGRSpatialReference *GetGCPSpatialRef() const;
373
    virtual int GetGCPCount();
374
    virtual const GDAL_GCP *GetGCPs();
375
    virtual CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList,
376
                           const OGRSpatialReference *poGCP_SRS);
377
378
    // Compatibility layer
379
    const char *GetGCPProjection() const;
380
    CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList,
381
                   const char *pszGCPProjection);
382
383
    virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,
384
                              int nBufXSize, int nBufYSize, GDALDataType eDT,
385
                              int nBandCount, int *panBandList,
386
                              char **papszOptions);
387
388
    virtual CPLErr CreateMaskBand(int nFlagsIn);
389
390
    virtual GDALAsyncReader *
391
    BeginAsyncReader(int nXOff, int nYOff, int nXSize, int nYSize, void *pBuf,
392
                     int nBufXSize, int nBufYSize, GDALDataType eBufType,
393
                     int nBandCount, int *panBandMap, int nPixelSpace,
394
                     int nLineSpace, int nBandSpace, char **papszOptions);
395
    virtual void EndAsyncReader(GDALAsyncReader *poARIO);
396
397
    //! @cond Doxygen_Suppress
398
    struct RawBinaryLayout
399
    {
400
        enum class Interleaving
401
        {
402
            UNKNOWN,
403
            BIP,
404
            BIL,
405
            BSQ
406
        };
407
        std::string osRawFilename{};
408
        Interleaving eInterleaving = Interleaving::UNKNOWN;
409
        GDALDataType eDataType = GDT_Unknown;
410
        bool bLittleEndianOrder = false;
411
412
        vsi_l_offset nImageOffset = 0;
413
        GIntBig nPixelOffset = 0;
414
        GIntBig nLineOffset = 0;
415
        GIntBig nBandOffset = 0;
416
    };
417
418
    virtual bool GetRawBinaryLayout(RawBinaryLayout &);
419
    //! @endcond
420
421
#ifndef DOXYGEN_SKIP
422
    CPLErr RasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
423
                    int nYSize, void *pData, int nBufXSize, int nBufYSize,
424
                    GDALDataType eBufType, int nBandCount,
425
                    const int *panBandMap, GSpacing nPixelSpace,
426
                    GSpacing nLineSpace, GSpacing nBandSpace,
427
                    GDALRasterIOExtraArg *psExtraArg
428
                        OPTIONAL_OUTSIDE_GDAL(nullptr)) CPL_WARN_UNUSED_RESULT;
429
#else
430
    CPLErr RasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
431
                    int nYSize, void *pData, int nBufXSize, int nBufYSize,
432
                    GDALDataType eBufType, int nBandCount,
433
                    const int *panBandMap, GSpacing nPixelSpace,
434
                    GSpacing nLineSpace, GSpacing nBandSpace,
435
                    GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
436
#endif
437
438
    virtual CPLStringList GetCompressionFormats(int nXOff, int nYOff,
439
                                                int nXSize, int nYSize,
440
                                                int nBandCount,
441
                                                const int *panBandList);
442
    virtual CPLErr ReadCompressedData(const char *pszFormat, int nXOff,
443
                                      int nYOff, int nXSize, int nYSize,
444
                                      int nBands, const int *panBandList,
445
                                      void **ppBuffer, size_t *pnBufferSize,
446
                                      char **ppszDetailedFormat);
447
448
    int Reference();
449
    int Dereference();
450
    int ReleaseRef();
451
452
    /** Return access mode.
453
     * @return access mode.
454
     */
455
    GDALAccess GetAccess() const
456
0
    {
457
0
        return eAccess;
458
0
    }
459
460
    int GetShared() const;
461
    void MarkAsShared();
462
463
    void MarkSuppressOnClose();
464
    void UnMarkSuppressOnClose();
465
466
    /** Return MarkSuppressOnClose flag.
467
    * @return MarkSuppressOnClose flag.
468
    */
469
    bool IsMarkedSuppressOnClose() const
470
0
    {
471
0
        return bSuppressOnClose;
472
0
    }
473
474
    /** Return open options.
475
     * @return open options.
476
     */
477
    char **GetOpenOptions()
478
0
    {
479
0
        return papszOpenOptions;
480
0
    }
481
482
    bool IsThreadSafe(int nScopeFlags) const;
483
484
#ifndef DOXYGEN_SKIP
485
    /** Return open options.
486
     * @return open options.
487
     */
488
    CSLConstList GetOpenOptions() const
489
0
    {
490
0
        return papszOpenOptions;
491
0
    }
492
#endif
493
494
    static GDALDataset **GetOpenDatasets(int *pnDatasetCount);
495
496
#ifndef DOXYGEN_SKIP
497
    CPLErr
498
    BuildOverviews(const char *pszResampling, int nOverviews,
499
                   const int *panOverviewList, int nListBands,
500
                   const int *panBandList, GDALProgressFunc pfnProgress,
501
                   void *pProgressData,
502
                   CSLConstList papszOptions OPTIONAL_OUTSIDE_GDAL(nullptr));
503
#else
504
    CPLErr BuildOverviews(const char *pszResampling, int nOverviews,
505
                          const int *panOverviewList, int nListBands,
506
                          const int *panBandList, GDALProgressFunc pfnProgress,
507
                          void *pProgressData, CSLConstList papszOptions);
508
#endif
509
510
    virtual CPLErr AddOverviews(const std::vector<GDALDataset *> &apoSrcOvrDS,
511
                                GDALProgressFunc pfnProgress,
512
                                void *pProgressData, CSLConstList papszOptions);
513
514
#ifndef DOXYGEN_XML
515
    void ReportError(CPLErr eErrClass, CPLErrorNum err_no, const char *fmt,
516
                     ...) const CPL_PRINT_FUNC_FORMAT(4, 5);
517
518
    static void ReportError(const char *pszDSName, CPLErr eErrClass,
519
                            CPLErrorNum err_no, const char *fmt, ...)
520
        CPL_PRINT_FUNC_FORMAT(4, 5);
521
#endif
522
523
    char **GetMetadata(const char *pszDomain = "") override;
524
525
// Only defined when Doxygen enabled
526
#ifdef DOXYGEN_SKIP
527
    CPLErr SetMetadata(char **papszMetadata, const char *pszDomain) override;
528
    CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
529
                           const char *pszDomain) override;
530
#endif
531
532
    char **GetMetadataDomainList() override;
533
534
    virtual void ClearStatistics();
535
536
    std::shared_ptr<GDALMDArray> AsMDArray(CSLConstList papszOptions = nullptr);
537
538
    /** Convert a GDALDataset* to a GDALDatasetH.
539
     */
540
    static inline GDALDatasetH ToHandle(GDALDataset *poDS)
541
0
    {
542
0
        return static_cast<GDALDatasetH>(poDS);
543
0
    }
544
545
    /** Convert a GDALDatasetH to a GDALDataset*.
546
     */
547
    static inline GDALDataset *FromHandle(GDALDatasetH hDS)
548
0
    {
549
0
        return static_cast<GDALDataset *>(hDS);
550
0
    }
551
552
    /** @see GDALOpenEx().
553
     */
554
    static GDALDataset *Open(const char *pszFilename,
555
                             unsigned int nOpenFlags = 0,
556
                             const char *const *papszAllowedDrivers = nullptr,
557
                             const char *const *papszOpenOptions = nullptr,
558
                             const char *const *papszSiblingFiles = nullptr)
559
0
    {
560
0
        return FromHandle(GDALOpenEx(pszFilename, nOpenFlags,
561
0
                                     papszAllowedDrivers, papszOpenOptions,
562
0
                                     papszSiblingFiles));
563
0
    }
564
565
    /** Object returned by GetFeatures() iterators */
566
    struct FeatureLayerPair
567
    {
568
        /** Unique pointer to a OGRFeature. */
569
        OGRFeatureUniquePtr feature{};
570
571
        /** Layer to which the feature belongs to. */
572
        OGRLayer *layer = nullptr;
573
    };
574
575
    //! @cond Doxygen_Suppress
576
    // SetEnableOverviews() only to be used by GDALOverviewDataset
577
    void SetEnableOverviews(bool bEnable);
578
579
    // Only to be used by driver's GetOverviewCount() method.
580
    bool AreOverviewsEnabled() const;
581
582
    static void ReportUpdateNotSupportedByDriver(const char *pszDriverName);
583
    //! @endcond
584
585
  private:
586
    class Private;
587
    Private *m_poPrivate;
588
589
    CPL_INTERNAL OGRLayer *BuildLayerFromSelectInfo(
590
        swq_select *psSelectInfo, OGRGeometry *poSpatialFilter,
591
        const char *pszDialect, swq_select_parse_options *poSelectParseOptions);
592
    CPLStringList oDerivedMetadataList{};
593
594
  public:
595
    virtual int GetLayerCount() const;
596
    virtual const OGRLayer *GetLayer(int iLayer) const;
597
598
    OGRLayer *GetLayer(int iLayer)
599
0
    {
600
0
        return const_cast<OGRLayer *>(
601
0
            const_cast<const GDALDataset *>(this)->GetLayer(iLayer));
602
0
    }
603
604
    virtual bool IsLayerPrivate(int iLayer) const;
605
606
    /** Class returned by GetLayers() that acts as a range of layers.
607
     */
608
    class CPL_DLL Layers
609
    {
610
      private:
611
        friend class GDALDataset;
612
        GDALDataset *m_poSelf;
613
614
0
        CPL_INTERNAL explicit Layers(GDALDataset *poSelf) : m_poSelf(poSelf)
615
0
        {
616
0
        }
617
618
      public:
619
        /** Layer iterator.
620
         */
621
        class CPL_DLL Iterator
622
        {
623
            struct Private;
624
            std::unique_ptr<Private> m_poPrivate;
625
626
          public:
627
            using value_type = OGRLayer *; /**< value_type */
628
            using reference = OGRLayer *;  /**< reference */
629
            using difference_type = void;  /**< difference_type */
630
            using pointer = void;          /**< pointer */
631
            using iterator_category =
632
                std::input_iterator_tag; /**< iterator_category */
633
634
            Iterator(); /**< Default constructor */
635
            Iterator(GDALDataset *poDS, bool bStart); /**< Constructor */
636
            Iterator(const Iterator &oOther);         /**< Copy constructor */
637
            Iterator(Iterator &&oOther) noexcept;     /**< Move constructor */
638
            ~Iterator();                              /**< Destructor */
639
640
            Iterator &
641
            operator=(const Iterator &oOther); /**< Assignment operator */
642
            Iterator &operator=(
643
                Iterator &&oOther) noexcept; /**< Move assignment operator */
644
645
            value_type operator*() const; /**< Dereference operator */
646
            Iterator &operator++();       /**< Pre-increment operator */
647
            Iterator operator++(int);     /**< Post-increment operator */
648
            bool operator!=(const Iterator &it)
649
                const; /**< Difference comparison operator */
650
        };
651
652
        Iterator begin() const;
653
        Iterator end() const;
654
655
        size_t size() const;
656
657
        OGRLayer *operator[](int iLayer);
658
        OGRLayer *operator[](size_t iLayer);
659
        OGRLayer *operator[](const char *pszLayername);
660
    };
661
662
    Layers GetLayers();
663
664
    /** Class returned by GetLayers() that acts as a range of layers.
665
     * @since GDAL 3.12
666
     */
667
    class CPL_DLL ConstLayers
668
    {
669
      private:
670
        friend class GDALDataset;
671
        const GDALDataset *m_poSelf;
672
673
        CPL_INTERNAL explicit ConstLayers(const GDALDataset *poSelf)
674
0
            : m_poSelf(poSelf)
675
0
        {
676
0
        }
677
678
      public:
679
        /** Layer iterator.
680
         * @since GDAL 3.12
681
         */
682
        class CPL_DLL Iterator
683
        {
684
            struct Private;
685
            std::unique_ptr<Private> m_poPrivate;
686
687
          public:
688
            using value_type = const OGRLayer *; /**< value_type */
689
            using reference = const OGRLayer *;  /**< reference */
690
            using difference_type = void;        /**< difference_type */
691
            using pointer = void;                /**< pointer */
692
            using iterator_category =
693
                std::input_iterator_tag; /**< iterator_category */
694
695
            Iterator(); /**< Default constructor */
696
            Iterator(const GDALDataset *poDS, bool bStart); /**< Constructor */
697
            Iterator(const Iterator &oOther);     /**< Copy constructor */
698
            Iterator(Iterator &&oOther) noexcept; /**< Move constructor */
699
            ~Iterator();                          /**< Destructor */
700
701
            Iterator &
702
            operator=(const Iterator &oOther); /**< Assignment operator */
703
            Iterator &operator=(
704
                Iterator &&oOther) noexcept; /**< Move assignment operator */
705
706
            value_type operator*() const; /**< Dereference operator */
707
            Iterator &operator++();       /**< Pre-increment operator */
708
            Iterator operator++(int);     /**< Post-increment operator */
709
            bool operator!=(const Iterator &it)
710
                const; /**< Difference comparison operator */
711
        };
712
713
        Iterator begin() const;
714
        Iterator end() const;
715
716
        size_t size() const;
717
718
        const OGRLayer *operator[](int iLayer);
719
        const OGRLayer *operator[](size_t iLayer);
720
        const OGRLayer *operator[](const char *pszLayername);
721
    };
722
723
    ConstLayers GetLayers() const;
724
725
    virtual OGRLayer *GetLayerByName(const char *);
726
727
    int GetLayerIndex(const char *pszName) const;
728
729
    virtual OGRErr DeleteLayer(int iLayer);
730
731
    virtual void ResetReading();
732
    virtual OGRFeature *GetNextFeature(OGRLayer **ppoBelongingLayer,
733
                                       double *pdfProgressPct,
734
                                       GDALProgressFunc pfnProgress,
735
                                       void *pProgressData);
736
737
    /** Class returned by GetFeatures() that act as a container for vector
738
     * features. */
739
    class CPL_DLL Features
740
    {
741
      private:
742
        friend class GDALDataset;
743
        GDALDataset *m_poSelf;
744
745
0
        CPL_INTERNAL explicit Features(GDALDataset *poSelf) : m_poSelf(poSelf)
746
0
        {
747
0
        }
748
749
        class CPL_DLL Iterator
750
        {
751
            struct Private;
752
            std::unique_ptr<Private> m_poPrivate;
753
754
          public:
755
            Iterator(GDALDataset *poDS, bool bStart);
756
            Iterator(const Iterator &oOther);  // declared but not defined.
757
                                               // Needed for gcc 5.4 at least
758
            Iterator(Iterator &&oOther) noexcept;  // declared but not defined.
759
                // Needed for gcc 5.4 at least
760
            ~Iterator();
761
            const FeatureLayerPair &operator*() const;
762
            Iterator &operator++();
763
            bool operator!=(const Iterator &it) const;
764
        };
765
766
      public:
767
        const Iterator begin() const;
768
769
        const Iterator end() const;
770
    };
771
772
    Features GetFeatures();
773
774
    virtual int TestCapability(const char *) const;
775
776
    virtual std::vector<std::string>
777
    GetFieldDomainNames(CSLConstList papszOptions = nullptr) const;
778
779
    virtual const OGRFieldDomain *GetFieldDomain(const std::string &name) const;
780
781
    virtual bool AddFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
782
                                std::string &failureReason);
783
784
    virtual bool DeleteFieldDomain(const std::string &name,
785
                                   std::string &failureReason);
786
787
    virtual bool UpdateFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
788
                                   std::string &failureReason);
789
790
    virtual std::vector<std::string>
791
    GetRelationshipNames(CSLConstList papszOptions = nullptr) const;
792
793
    virtual const GDALRelationship *
794
    GetRelationship(const std::string &name) const;
795
796
    virtual bool
797
    AddRelationship(std::unique_ptr<GDALRelationship> &&relationship,
798
                    std::string &failureReason);
799
800
    virtual bool DeleteRelationship(const std::string &name,
801
                                    std::string &failureReason);
802
803
    virtual bool
804
    UpdateRelationship(std::unique_ptr<GDALRelationship> &&relationship,
805
                       std::string &failureReason);
806
807
    //! @cond Doxygen_Suppress
808
    OGRLayer *CreateLayer(const char *pszName);
809
810
    OGRLayer *CreateLayer(const char *pszName, std::nullptr_t);
811
    //! @endcond
812
813
    OGRLayer *CreateLayer(const char *pszName,
814
                          const OGRSpatialReference *poSpatialRef,
815
                          OGRwkbGeometryType eGType = wkbUnknown,
816
                          CSLConstList papszOptions = nullptr);
817
818
    OGRLayer *CreateLayer(const char *pszName,
819
                          const OGRGeomFieldDefn *poGeomFieldDefn,
820
                          CSLConstList papszOptions = nullptr);
821
822
    virtual OGRLayer *CopyLayer(OGRLayer *poSrcLayer, const char *pszNewName,
823
                                char **papszOptions = nullptr);
824
825
    virtual OGRStyleTable *GetStyleTable();
826
    virtual void SetStyleTableDirectly(OGRStyleTable *poStyleTable);
827
828
    virtual void SetStyleTable(OGRStyleTable *poStyleTable);
829
830
    virtual OGRLayer *ExecuteSQL(const char *pszStatement,
831
                                 OGRGeometry *poSpatialFilter,
832
                                 const char *pszDialect);
833
    virtual void ReleaseResultSet(OGRLayer *poResultsSet);
834
    virtual OGRErr AbortSQL();
835
836
    int GetRefCount() const;
837
    int GetSummaryRefCount() const;
838
    OGRErr Release();
839
840
    virtual OGRErr StartTransaction(int bForce = FALSE);
841
    virtual OGRErr CommitTransaction();
842
    virtual OGRErr RollbackTransaction();
843
844
    virtual std::shared_ptr<GDALGroup> GetRootGroup() const;
845
846
    static std::string BuildFilename(const char *pszFilename,
847
                                     const char *pszReferencePath,
848
                                     bool bRelativeToReferencePath);
849
850
    //! @cond Doxygen_Suppress
851
    static int IsGenericSQLDialect(const char *pszDialect);
852
853
    // Semi-public methods. Only to be used by in-tree drivers.
854
    GDALSQLParseInfo *
855
    BuildParseInfo(swq_select *psSelectInfo,
856
                   swq_select_parse_options *poSelectParseOptions);
857
    static void DestroyParseInfo(GDALSQLParseInfo *psParseInfo);
858
    OGRLayer *ExecuteSQL(const char *pszStatement, OGRGeometry *poSpatialFilter,
859
                         const char *pszDialect,
860
                         swq_select_parse_options *poSelectParseOptions);
861
862
    static constexpr const char *const apszSpecialSubDatasetSyntax[] = {
863
        "NITF_IM:{ANY}:{FILENAME}", "PDF:{ANY}:{FILENAME}",
864
        "RASTERLITE:{FILENAME},{ANY}", "TILEDB:\"{FILENAME}\":{ANY}",
865
        "TILEDB:{FILENAME}:{ANY}"};
866
867
    //! @endcond
868
869
  protected:
870
    virtual OGRLayer *ICreateLayer(const char *pszName,
871
                                   const OGRGeomFieldDefn *poGeomFieldDefn,
872
                                   CSLConstList papszOptions);
873
874
    //! @cond Doxygen_Suppress
875
    OGRErr ProcessSQLCreateIndex(const char *);
876
    OGRErr ProcessSQLDropIndex(const char *);
877
    OGRErr ProcessSQLDropTable(const char *);
878
    OGRErr ProcessSQLAlterTableAddColumn(const char *);
879
    OGRErr ProcessSQLAlterTableDropColumn(const char *);
880
    OGRErr ProcessSQLAlterTableAlterColumn(const char *);
881
    OGRErr ProcessSQLAlterTableRenameColumn(const char *);
882
883
    OGRStyleTable *m_poStyleTable = nullptr;
884
885
    friend class GDALProxyPoolDataset;
886
    //! @endcond
887
888
  private:
889
    CPL_DISALLOW_COPY_ASSIGN(GDALDataset)
890
};
891
892
//! @cond Doxygen_Suppress
893
struct CPL_DLL GDALDatasetUniquePtrDeleter
894
{
895
    void operator()(GDALDataset *poDataset) const
896
0
    {
897
0
        GDALClose(poDataset);
898
0
    }
899
};
900
901
//! @endcond
902
903
//! @cond Doxygen_Suppress
904
struct CPL_DLL GDALDatasetUniquePtrReleaser
905
{
906
    void operator()(GDALDataset *poDataset) const
907
0
    {
908
0
        if (poDataset)
909
0
            poDataset->Release();
910
0
    }
911
};
912
913
//! @endcond
914
915
/** Unique pointer type for GDALDataset.
916
 * Appropriate for use on datasets open in non-shared mode and onto which
917
 * reference counter has not been manually modified.
918
 */
919
using GDALDatasetUniquePtr =
920
    std::unique_ptr<GDALDataset, GDALDatasetUniquePtrDeleter>;
921
922
#endif