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