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