Coverage Report

Created: 2025-06-22 06:59

/src/gdal/ogr/ogrsf_frmts/generic/ogrlayerpool.h
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *
3
 * Project:  OpenGIS Simple Features Reference Implementation
4
 * Purpose:  Defines OGRLayerPool and OGRProxiedLayer class
5
 * Author:   Even Rouault, even dot rouault at spatialys.com
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2012-2013, Even Rouault <even dot rouault at spatialys.com>
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#ifndef OGRLAYERPOOL_H_INCLUDED
14
#define OGRLAYERPOOL_H_INCLUDED
15
16
#ifndef DOXYGEN_SKIP
17
18
#include "ogrsf_frmts.h"
19
20
typedef OGRLayer *(*OpenLayerFunc)(void *user_data);
21
typedef void (*ReleaseLayerFunc)(OGRLayer *, void *user_data);
22
typedef void (*FreeUserDataFunc)(void *user_data);
23
24
class OGRLayerPool;
25
26
/************************************************************************/
27
/*                      OGRAbstractProxiedLayer                         */
28
/************************************************************************/
29
30
class CPL_DLL OGRAbstractProxiedLayer : public OGRLayer
31
{
32
    CPL_DISALLOW_COPY_ASSIGN(OGRAbstractProxiedLayer)
33
34
    friend class OGRLayerPool;
35
36
    OGRAbstractProxiedLayer
37
        *poPrevLayer; /* Chain to a layer that was used more recently */
38
    OGRAbstractProxiedLayer
39
        *poNextLayer; /* Chain to a layer that was used less recently */
40
41
  protected:
42
    OGRLayerPool *poPool;
43
44
    virtual void CloseUnderlyingLayer() = 0;
45
46
  public:
47
    explicit OGRAbstractProxiedLayer(OGRLayerPool *poPool);
48
    virtual ~OGRAbstractProxiedLayer();
49
};
50
51
/************************************************************************/
52
/*                             OGRLayerPool                             */
53
/************************************************************************/
54
55
class CPL_DLL OGRLayerPool
56
{
57
    CPL_DISALLOW_COPY_ASSIGN(OGRLayerPool)
58
59
  protected:
60
    OGRAbstractProxiedLayer *poMRULayer; /* the most recently used layer */
61
    OGRAbstractProxiedLayer
62
        *poLRULayer;  /* the least recently used layer (still opened) */
63
    int nMRUListSize; /* the size of the list */
64
    int nMaxSimultaneouslyOpened;
65
66
  public:
67
    explicit OGRLayerPool(int nMaxSimultaneouslyOpened = 100);
68
    ~OGRLayerPool();
69
70
    void SetLastUsedLayer(OGRAbstractProxiedLayer *poProxiedLayer);
71
    void UnchainLayer(OGRAbstractProxiedLayer *poProxiedLayer);
72
73
    int GetMaxSimultaneouslyOpened() const
74
0
    {
75
0
        return nMaxSimultaneouslyOpened;
76
0
    }
77
78
    int GetSize() const
79
0
    {
80
0
        return nMRUListSize;
81
0
    }
82
};
83
84
/************************************************************************/
85
/*                           OGRProxiedLayer                            */
86
/************************************************************************/
87
88
class CPL_DLL OGRProxiedLayer : public OGRAbstractProxiedLayer
89
{
90
    CPL_DISALLOW_COPY_ASSIGN(OGRProxiedLayer)
91
92
    OpenLayerFunc pfnOpenLayer;
93
    ReleaseLayerFunc pfnReleaseLayer;
94
    FreeUserDataFunc pfnFreeUserData;
95
    void *pUserData;
96
    OGRLayer *poUnderlyingLayer;
97
    OGRFeatureDefn *poFeatureDefn;
98
    OGRSpatialReference *poSRS;
99
100
    int OpenUnderlyingLayer();
101
102
  protected:
103
    virtual void CloseUnderlyingLayer() override;
104
105
  public:
106
    OGRProxiedLayer(OGRLayerPool *poPool, OpenLayerFunc pfnOpenLayer,
107
                    FreeUserDataFunc pfnFreeUserData, void *pUserData);
108
    OGRProxiedLayer(OGRLayerPool *poPool, OpenLayerFunc pfnOpenLayer,
109
                    ReleaseLayerFunc pfnReleaseLayer,
110
                    FreeUserDataFunc pfnFreeUserData, void *pUserData);
111
    virtual ~OGRProxiedLayer();
112
113
    OGRLayer *GetUnderlyingLayer();
114
115
    virtual OGRGeometry *GetSpatialFilter() override;
116
    virtual OGRErr ISetSpatialFilter(int iGeomField,
117
                                     const OGRGeometry *) override;
118
119
    virtual OGRErr SetAttributeFilter(const char *) override;
120
121
    virtual void ResetReading() override;
122
    virtual OGRFeature *GetNextFeature() override;
123
    virtual OGRErr SetNextByIndex(GIntBig nIndex) override;
124
    virtual OGRFeature *GetFeature(GIntBig nFID) override;
125
    virtual OGRErr ISetFeature(OGRFeature *poFeature) override;
126
    virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
127
    virtual OGRErr IUpsertFeature(OGRFeature *poFeature) override;
128
    OGRErr IUpdateFeature(OGRFeature *poFeature, int nUpdatedFieldsCount,
129
                          const int *panUpdatedFieldsIdx,
130
                          int nUpdatedGeomFieldsCount,
131
                          const int *panUpdatedGeomFieldsIdx,
132
                          bool bUpdateStyleString) override;
133
    virtual OGRErr DeleteFeature(GIntBig nFID) override;
134
135
    virtual GDALDataset *GetDataset() override;
136
    virtual bool GetArrowStream(struct ArrowArrayStream *out_stream,
137
                                CSLConstList papszOptions = nullptr) override;
138
139
    virtual const char *GetName() override;
140
    virtual OGRwkbGeometryType GetGeomType() override;
141
    virtual OGRFeatureDefn *GetLayerDefn() override;
142
143
    virtual OGRSpatialReference *GetSpatialRef() override;
144
145
    virtual GIntBig GetFeatureCount(int bForce = TRUE) override;
146
    virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
147
                              bool bForce) override;
148
149
    virtual int TestCapability(const char *) override;
150
151
    virtual OGRErr CreateField(const OGRFieldDefn *poField,
152
                               int bApproxOK = TRUE) override;
153
    virtual OGRErr DeleteField(int iField) override;
154
    virtual OGRErr ReorderFields(int *panMap) override;
155
    virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
156
                                  int nFlags) override;
157
    virtual OGRErr
158
    AlterGeomFieldDefn(int iGeomField,
159
                       const OGRGeomFieldDefn *poNewGeomFieldDefn,
160
                       int nFlags) override;
161
162
    virtual OGRErr SyncToDisk() override;
163
164
    virtual OGRStyleTable *GetStyleTable() override;
165
    virtual void SetStyleTableDirectly(OGRStyleTable *poStyleTable) override;
166
167
    virtual void SetStyleTable(OGRStyleTable *poStyleTable) override;
168
169
    virtual OGRErr StartTransaction() override;
170
    virtual OGRErr CommitTransaction() override;
171
    virtual OGRErr RollbackTransaction() override;
172
173
    virtual const char *GetFIDColumn() override;
174
    virtual const char *GetGeometryColumn() override;
175
176
    virtual OGRErr SetIgnoredFields(CSLConstList papszFields) override;
177
178
    virtual OGRErr Rename(const char *pszNewName) override;
179
};
180
181
#endif /* #ifndef DOXYGEN_SKIP */
182
183
#endif  // OGRLAYERPOOL_H_INCLUDED