Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Private definitions for OGR/VRT driver. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> 9 : * Copyright (c) 2009-2014, Even Rouault <even dot rouault at spatialys.com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #ifndef OGR_VRT_H_INCLUDED 15 : #define OGR_VRT_H_INCLUDED 16 : 17 : #include "cpl_error.h" 18 : #include "cpl_minixml.h" 19 : #include "cpl_string.h" 20 : #include "ogrlayerpool.h" 21 : #include "ogrsf_frmts.h" 22 : 23 : #include <set> 24 : #include <string> 25 : #include <vector> 26 : 27 : typedef enum 28 : { 29 : VGS_None, 30 : VGS_Direct, 31 : VGS_PointFromColumns, 32 : VGS_WKT, 33 : VGS_WKB, 34 : VGS_Shape 35 : } OGRVRTGeometryStyle; 36 : 37 : /************************************************************************/ 38 : /* OGRVRTGeomFieldProps */ 39 : /************************************************************************/ 40 : 41 : class OGRVRTGeomFieldProps 42 : { 43 : public: 44 : CPLString osName; // Name of the VRT geometry field */ 45 : OGRwkbGeometryType eGeomType; 46 : const OGRSpatialReference *poSRS; 47 : 48 : bool bSrcClip; 49 : OGRGeometry *poSrcRegion; 50 : 51 : // Geometry interpretation related. 52 : OGRVRTGeometryStyle eGeometryStyle; 53 : 54 : // Points to a OGRField for VGS_WKT, VGS_WKB, VGS_Shape and OGRGeomField 55 : // for VGS_Direct. 56 : int iGeomField; 57 : 58 : // VGS_PointFromColumn 59 : int iGeomXField; 60 : int iGeomYField; 61 : int iGeomZField; 62 : int iGeomMField; 63 : bool bReportSrcColumn; 64 : bool bUseSpatialSubquery; 65 : bool bNullable; 66 : 67 : OGREnvelope sStaticEnvelope; 68 : 69 : OGRGeomCoordinatePrecision sCoordinatePrecision{}; 70 : 71 : OGRVRTGeomFieldProps(); 72 : ~OGRVRTGeomFieldProps(); 73 : }; 74 : 75 : /************************************************************************/ 76 : /* OGRVRTLayer */ 77 : /************************************************************************/ 78 : 79 : class OGRVRTDataSource; 80 : 81 : class OGRVRTLayer final : public OGRLayer 82 : { 83 : protected: 84 : OGRVRTDataSource *poDS; 85 : std::vector<OGRVRTGeomFieldProps *> apoGeomFieldProps; 86 : 87 : bool bHasFullInitialized; 88 : CPLString osName; 89 : CPLXMLNode *psLTree; 90 : CPLString osVRTDirectory; 91 : 92 : OGRFeatureDefn *poFeatureDefn; 93 : 94 : GDALDataset *poSrcDS; 95 : OGRLayer *poSrcLayer; 96 : OGRFeatureDefn *poSrcFeatureDefn; 97 : bool bNeedReset; 98 : bool bSrcLayerFromSQL; 99 : bool bSrcDSShared; 100 : bool bAttrFilterPassThrough; 101 : 102 : char *pszAttrFilter; 103 : 104 : int iFIDField; // -1 means pass through. 105 : CPLString osFIDFieldName; 106 : int iStyleField; // -1 means pass through. 107 : 108 : // Attribute mapping. 109 : std::vector<int> anSrcField; 110 : std::vector<int> abDirectCopy; 111 : 112 : bool bUpdate; 113 : 114 : OGRFeature *TranslateFeature(OGRFeature *&, int bUseSrcRegion); 115 : OGRFeature *TranslateVRTFeatureToSrcFeature(OGRFeature *poVRTFeature); 116 : 117 : bool ResetSourceReading(); 118 : 119 : bool FullInitialize(); 120 : 121 : OGRFeatureDefn *GetSrcLayerDefn(); 122 : void ClipAndAssignSRS(OGRFeature *poFeature); 123 : 124 : GIntBig nFeatureCount; 125 : 126 : bool bError; 127 : 128 : bool m_bEmptyResultSet = false; 129 : 130 : bool ParseGeometryField(CPLXMLNode *psNode, CPLXMLNode *psNodeParent, 131 : OGRVRTGeomFieldProps *poProps); 132 : 133 : public: 134 : explicit OGRVRTLayer(OGRVRTDataSource *poDSIn); 135 : virtual ~OGRVRTLayer(); 136 : 137 : bool FastInitialize(CPLXMLNode *psLTree, const char *pszVRTDirectory, 138 : int bUpdate); 139 : 140 649 : virtual const char *GetName() override 141 : { 142 649 : return osName.c_str(); 143 : } 144 : 145 : virtual OGRwkbGeometryType GetGeomType() override; 146 : 147 : /* -------------------------------------------------------------------- */ 148 : /* Caution : all the below methods should care of calling */ 149 : /* FullInitialize() if not already done */ 150 : /* -------------------------------------------------------------------- */ 151 : 152 : virtual void ResetReading() override; 153 : virtual OGRFeature *GetNextFeature() override; 154 : 155 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 156 : 157 : virtual OGRErr SetNextByIndex(GIntBig nIndex) override; 158 : 159 : virtual OGRFeatureDefn *GetLayerDefn() override; 160 : 161 : virtual GIntBig GetFeatureCount(int) override; 162 : 163 : virtual OGRErr SetAttributeFilter(const char *) override; 164 : 165 : virtual int TestCapability(const char *) override; 166 : 167 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; 168 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 169 : int bForce = TRUE) override; 170 : 171 : virtual void SetSpatialFilter(OGRGeometry *poGeomIn) override; 172 : virtual void SetSpatialFilter(int iGeomField, 173 : OGRGeometry *poGeomIn) override; 174 : 175 : virtual OGRErr ICreateFeature(OGRFeature *poFeature) override; 176 : 177 : virtual OGRErr ISetFeature(OGRFeature *poFeature) override; 178 : 179 : virtual OGRErr DeleteFeature(GIntBig nFID) override; 180 : 181 : virtual OGRErr SyncToDisk() override; 182 : 183 : virtual const char *GetFIDColumn() override; 184 : 185 : virtual OGRErr StartTransaction() override; 186 : virtual OGRErr CommitTransaction() override; 187 : virtual OGRErr RollbackTransaction() override; 188 : 189 : virtual OGRErr SetIgnoredFields(CSLConstList papszFields) override; 190 : 191 : GDALDataset *GetSrcDataset(); 192 : }; 193 : 194 : /************************************************************************/ 195 : /* OGRVRTDataSource */ 196 : /************************************************************************/ 197 : 198 : typedef enum 199 : { 200 : OGR_VRT_PROXIED_LAYER, 201 : OGR_VRT_LAYER, 202 : OGR_VRT_OTHER_LAYER, 203 : } OGRLayerType; 204 : 205 : class OGRVRTDataSource final : public GDALDataset 206 : { 207 : OGRLayer **papoLayers; 208 : OGRLayerType *paeLayerType; 209 : int nLayers; 210 : 211 : CPLXMLNode *psTree; 212 : 213 : int nCallLevel; 214 : 215 : std::set<std::string> aosOtherDSNameSet; 216 : 217 : OGRLayer *InstantiateWarpedLayer(CPLXMLNode *psLTree, 218 : const char *pszVRTDirectory, int bUpdate, 219 : int nRecLevel); 220 : OGRLayer *InstantiateUnionLayer(CPLXMLNode *psLTree, 221 : const char *pszVRTDirectory, int bUpdate, 222 : int nRecLevel); 223 : 224 : OGRLayerPool *poLayerPool; 225 : 226 : OGRVRTDataSource *poParentDS; 227 : bool bRecursionDetected; 228 : 229 : public: 230 : explicit OGRVRTDataSource(GDALDriver *poDriver); 231 : virtual ~OGRVRTDataSource(); 232 : 233 : virtual int CloseDependentDatasets() override; 234 : 235 : OGRLayer *InstantiateLayer(CPLXMLNode *psLTree, const char *pszVRTDirectory, 236 : int bUpdate, int nRecLevel = 0); 237 : 238 : OGRLayer *InstantiateLayerInternal(CPLXMLNode *psLTree, 239 : const char *pszVRTDirectory, int bUpdate, 240 : int nRecLevel); 241 : 242 : bool Initialize(CPLXMLNode *psXML, const char *pszName, int bUpdate); 243 : 244 835 : int GetLayerCount() override 245 : { 246 835 : return nLayers; 247 : } 248 : 249 : OGRLayer *GetLayer(int) override; 250 : 251 : int TestCapability(const char *) override; 252 : 253 : virtual char **GetFileList() override; 254 : 255 : // Anti-recursion mechanism for standard Open. 256 66 : void SetCallLevel(int nCallLevelIn) 257 : { 258 66 : nCallLevel = nCallLevelIn; 259 66 : } 260 : 261 432 : int GetCallLevel() 262 : { 263 432 : return nCallLevel; 264 : } 265 : 266 66 : void SetParentDS(OGRVRTDataSource *poParentDSIn) 267 : { 268 66 : poParentDS = poParentDSIn; 269 66 : } 270 : 271 66 : OGRVRTDataSource *GetParentDS() 272 : { 273 66 : return poParentDS; 274 : } 275 : 276 70 : void SetRecursionDetected() 277 : { 278 70 : bRecursionDetected = true; 279 70 : } 280 : 281 34035 : bool GetRecursionDetected() const 282 : { 283 34035 : return bRecursionDetected; 284 : } 285 : 286 : // Anti-recursion mechanism for shared Open. 287 : void AddForbiddenNames(const char *pszOtherDSName); 288 : bool IsInForbiddenNames(const char *pszOtherDSName) const; 289 : }; 290 : 291 : #endif // ndef OGR_VRT_H_INCLUDED