Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Private definitions for Personal Geodatabase driver. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2005, Frank Warmerdam <warmerdam@pobox.com> 9 : * Copyright (c) 2009-2013, Even Rouault <even dot rouault at spatialys.com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #ifndef OGR_ODBC_H_INCLUDED 15 : #define OGR_ODBC_H_INCLUDED 16 : 17 : #include "ogrsf_frmts.h" 18 : #include "cpl_odbc.h" 19 : #include "cpl_error.h" 20 : 21 : #include <unordered_set> 22 : 23 : /************************************************************************/ 24 : /* OGRPGeoLayer */ 25 : /************************************************************************/ 26 : 27 : class OGRPGeoDataSource; 28 : 29 : constexpr const char *pszRelationshipTypeUUID = 30 : "{B606A7E1-FA5B-439C-849C6E9C2481537B}"; 31 : 32 : class OGRPGeoLayer CPL_NON_FINAL : public OGRLayer 33 : { 34 : protected: 35 : OGRFeatureDefn *poFeatureDefn; 36 : 37 : int m_nStatementFlags = 0; 38 : 39 : CPLODBCStatement *poStmt; 40 : 41 : // Layer spatial reference system, and srid. 42 : OGRSpatialReference *poSRS; 43 : int nSRSId; 44 : 45 : GIntBig iNextShapeId; 46 : 47 : OGRPGeoDataSource *poDS; 48 : 49 : char *pszGeomColumn; 50 : char *pszFIDColumn; 51 : 52 : int *panFieldOrdinals; 53 : 54 : bool m_bEOF = false; 55 : 56 : CPLErr BuildFeatureDefn(const char *pszLayerName, CPLODBCStatement *poStmt); 57 : 58 0 : virtual CPLODBCStatement *GetStatement() 59 : { 60 0 : return poStmt; 61 : } 62 : 63 : void LookupSRID(int); 64 : 65 : public: 66 : OGRPGeoLayer(); 67 : virtual ~OGRPGeoLayer(); 68 : 69 : virtual void ResetReading() override; 70 : virtual OGRFeature *GetNextRawFeature(); 71 : virtual OGRFeature *GetNextFeature() override; 72 : 73 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 74 : 75 0 : OGRFeatureDefn *GetLayerDefn() override 76 : { 77 0 : return poFeatureDefn; 78 : } 79 : 80 : virtual int TestCapability(const char *) override; 81 : 82 : virtual const char *GetFIDColumn() override; 83 : virtual const char *GetGeometryColumn() override; 84 : }; 85 : 86 : /************************************************************************/ 87 : /* OGRPGeoTableLayer */ 88 : /************************************************************************/ 89 : 90 : class OGRPGeoTableLayer final : public OGRPGeoLayer 91 : { 92 : char *pszQuery; 93 : 94 : void ClearStatement(); 95 : OGRErr ResetStatement(); 96 : 97 : virtual CPLODBCStatement *GetStatement() override; 98 : 99 : OGREnvelope sExtent; 100 : std::string m_osDefinition; 101 : std::string m_osDocumentation; 102 : 103 : public: 104 : explicit OGRPGeoTableLayer(OGRPGeoDataSource *, int); 105 : virtual ~OGRPGeoTableLayer(); 106 : 107 : CPLErr Initialize(const char *pszTableName, const char *pszGeomCol, 108 : int nShapeType, double dfExtentLeft, double dfExtentRight, 109 : double dfExtentBottom, double dfExtentTop, int nSRID, 110 : int bHasZ, int nHasM); 111 : 112 : virtual void ResetReading() override; 113 : virtual GIntBig GetFeatureCount(int) override; 114 : 115 : virtual OGRErr SetAttributeFilter(const char *) override; 116 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 117 : 118 : virtual int TestCapability(const char *) override; 119 : 120 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; 121 : 122 0 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 123 : int bForce) override 124 : { 125 0 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce); 126 : } 127 : 128 0 : const std::string &GetXMLDefinition() 129 : { 130 0 : return m_osDefinition; 131 : } 132 : 133 0 : const std::string &GetXMLDocumentation() 134 : { 135 0 : return m_osDocumentation; 136 : } 137 : }; 138 : 139 : /************************************************************************/ 140 : /* OGRPGeoSelectLayer */ 141 : /************************************************************************/ 142 : 143 : class OGRPGeoSelectLayer final : public OGRPGeoLayer 144 : { 145 : char *pszBaseStatement; 146 : 147 : void ClearStatement(); 148 : OGRErr ResetStatement(); 149 : 150 : virtual CPLODBCStatement *GetStatement() override; 151 : 152 : public: 153 : OGRPGeoSelectLayer(OGRPGeoDataSource *, CPLODBCStatement *); 154 : virtual ~OGRPGeoSelectLayer(); 155 : 156 : virtual void ResetReading() override; 157 : virtual GIntBig GetFeatureCount(int) override; 158 : 159 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 160 : 161 : virtual int TestCapability(const char *) override; 162 : }; 163 : 164 : /************************************************************************/ 165 : /* OGRPGeoDataSource */ 166 : /************************************************************************/ 167 : 168 : class OGRPGeoDataSource final : public GDALDataset 169 : { 170 : OGRPGeoLayer **papoLayers; 171 : int nLayers; 172 : 173 : mutable CPLODBCSession oSession; 174 : 175 : std::unordered_set<std::string> m_aosAllLCTableNames; 176 : bool m_bHasGdbItemsTable = false; 177 : 178 : std::vector<std::unique_ptr<OGRLayer>> m_apoInvisibleLayers; 179 : 180 : std::map<std::string, std::unique_ptr<GDALRelationship>> 181 : m_osMapRelationships{}; 182 : 183 : #ifndef _WIN32 184 : mutable bool m_COUNT_STAR_state_known = false; 185 : mutable bool m_COUNT_STAR_working = false; 186 : #endif 187 : 188 : int m_nStatementFlags = 0; 189 : 190 : static bool IsPrivateLayerName(const CPLString &osName); 191 : 192 : public: 193 : OGRPGeoDataSource(); 194 : virtual ~OGRPGeoDataSource(); 195 : 196 : int Open(GDALOpenInfo *poOpenInfo); 197 : int OpenTable(const char *pszTableName, const char *pszGeomCol, 198 : int bUpdate); 199 : 200 0 : int GetLayerCount() override 201 : { 202 0 : return nLayers; 203 : } 204 : 205 : OGRLayer *GetLayer(int) override; 206 : OGRLayer *GetLayerByName(const char *) override; 207 : bool IsLayerPrivate(int) const override; 208 : 209 : int TestCapability(const char *) override; 210 : 211 : virtual OGRLayer *ExecuteSQL(const char *pszSQLCommand, 212 : OGRGeometry *poSpatialFilter, 213 : const char *pszDialect) override; 214 : virtual void ReleaseResultSet(OGRLayer *poLayer) override; 215 : 216 : std::vector<std::string> 217 : GetRelationshipNames(CSLConstList papszOptions = nullptr) const override; 218 : 219 : const GDALRelationship * 220 : GetRelationship(const std::string &name) const override; 221 : 222 : // Internal use 223 0 : CPLODBCSession *GetSession() 224 : { 225 0 : return &oSession; 226 : } 227 : 228 : bool CountStarWorking() const; 229 : 230 0 : bool HasGdbItemsTable() const 231 : { 232 0 : return m_bHasGdbItemsTable; 233 : } 234 : }; 235 : 236 : #endif /* ndef _OGR_PGeo_H_INCLUDED */