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 : 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 223825 : int GetMaxSimultaneouslyOpened() const 74 : { 75 223825 : return nMaxSimultaneouslyOpened; 76 : } 77 : 78 5 : int GetSize() const 79 : { 80 5 : return nMRUListSize; 81 : } 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