Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Private definitions for OGR/ODBC driver. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_ODBC_H_INCLUDED 14 : #define OGR_ODBC_H_INCLUDED 15 : 16 : #include "ogrsf_frmts.h" 17 : #include "cpl_odbc.h" 18 : #include "cpl_error.h" 19 : 20 : #include <map> 21 : #include <unordered_set> 22 : 23 : /************************************************************************/ 24 : /* OGRODBCLayer */ 25 : /************************************************************************/ 26 : 27 : class OGRODBCDataSource; 28 : 29 : class OGRODBCLayer CPL_NON_FINAL : public OGRLayer 30 : { 31 : protected: 32 : OGRFeatureDefn *poFeatureDefn; 33 : 34 : int m_nStatementFlags = 0; 35 : CPLODBCStatement *poStmt; 36 : 37 : // Layer spatial reference system, and srid. 38 : OGRSpatialReference *poSRS; 39 : int nSRSId; 40 : 41 : GIntBig iNextShapeId; 42 : 43 : OGRODBCDataSource *poDS; 44 : 45 : int bGeomColumnWKB; 46 : char *pszGeomColumn; 47 : char *pszFIDColumn; 48 : 49 : int *panFieldOrdinals; 50 : 51 : bool m_bEOF = false; 52 : 53 : CPLErr BuildFeatureDefn(const char *pszLayerName, CPLODBCStatement *poStmt); 54 : 55 0 : virtual CPLODBCStatement *GetStatement() 56 : { 57 0 : return poStmt; 58 : } 59 : 60 : public: 61 : OGRODBCLayer(); 62 : virtual ~OGRODBCLayer(); 63 : 64 : virtual void ResetReading() override; 65 : virtual OGRFeature *GetNextRawFeature(); 66 : virtual OGRFeature *GetNextFeature() override; 67 : 68 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 69 : 70 0 : OGRFeatureDefn *GetLayerDefn() override 71 : { 72 0 : return poFeatureDefn; 73 : } 74 : 75 : virtual OGRSpatialReference *GetSpatialRef() override; 76 : 77 : virtual int TestCapability(const char *) override; 78 : }; 79 : 80 : /************************************************************************/ 81 : /* OGRODBCTableLayer */ 82 : /************************************************************************/ 83 : 84 : class OGRODBCTableLayer final : public OGRODBCLayer 85 : { 86 : char *pszQuery; 87 : 88 : int bHaveSpatialExtents; 89 : 90 : void ClearStatement(); 91 : OGRErr ResetStatement(); 92 : 93 : virtual CPLODBCStatement *GetStatement() override; 94 : 95 : char *pszTableName; 96 : char *pszSchemaName; 97 : 98 : public: 99 : explicit OGRODBCTableLayer(OGRODBCDataSource *, int); 100 : virtual ~OGRODBCTableLayer(); 101 : 102 : CPLErr Initialize(const char *pszTableName, const char *pszGeomCol); 103 : 104 : virtual void ResetReading() override; 105 : virtual GIntBig GetFeatureCount(int) override; 106 : 107 : virtual OGRErr SetAttributeFilter(const char *) override; 108 : #ifdef notdef 109 : virtual OGRErr ISetFeature(OGRFeature *poFeature); 110 : virtual OGRErr ICreateFeature(OGRFeature *poFeature); 111 : 112 : virtual OGRErr CreateField(OGRFieldDefn *poField, int bApproxOK = TRUE); 113 : #endif 114 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 115 : 116 : virtual OGRSpatialReference *GetSpatialRef() override; 117 : 118 : virtual int TestCapability(const char *) override; 119 : 120 : #ifdef notdef 121 : // follow methods are not base class overrides 122 : void SetLaunderFlag(int bFlag) 123 : { 124 : bLaunderColumnNames = bFlag; 125 : } 126 : 127 : void SetPrecisionFlag(int bFlag) 128 : { 129 : bPreservePrecision = bFlag; 130 : } 131 : #endif 132 : }; 133 : 134 : /************************************************************************/ 135 : /* OGRODBCSelectLayer */ 136 : /************************************************************************/ 137 : 138 : class OGRODBCSelectLayer final : public OGRODBCLayer 139 : { 140 : char *pszBaseStatement; 141 : 142 : void ClearStatement(); 143 : OGRErr ResetStatement(); 144 : 145 : virtual CPLODBCStatement *GetStatement() override; 146 : 147 : public: 148 : OGRODBCSelectLayer(OGRODBCDataSource *, CPLODBCStatement *); 149 : virtual ~OGRODBCSelectLayer(); 150 : 151 : virtual void ResetReading() override; 152 : virtual GIntBig GetFeatureCount(int) override; 153 : 154 : virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; 155 : 156 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; 157 : 158 0 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 159 : int bForce) override 160 : { 161 0 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce); 162 : } 163 : 164 : virtual int TestCapability(const char *) override; 165 : }; 166 : 167 : /************************************************************************/ 168 : /* OGRODBCDataSource */ 169 : /************************************************************************/ 170 : 171 : class OGRODBCDataSource final : public GDALDataset 172 : { 173 : OGRODBCLayer **papoLayers; 174 : int nLayers; 175 : 176 : CPLODBCSession oSession; 177 : 178 : #if 0 179 : // NOTE: nothing uses the SRS cache currently. Hence disabled. 180 : 181 : // We maintain a list of known SRID to reduce the number of trips to 182 : // the database to get SRSes. 183 : std::map<int, 184 : std::unique_ptr<OGRSpatialReference, OGRSpatialReferenceReleaser>> 185 : m_oSRSCache{}; 186 : #endif 187 : 188 : // set of all lowercase table names. Note that this is only used when 189 : // opening MDB datasources, not generic ODBC ones. 190 : std::unordered_set<std::string> m_aosAllLCTableNames; 191 : 192 : int m_nStatementFlags = 0; 193 : 194 : int OpenMDB(GDALOpenInfo *poOpenInfo); 195 : static bool IsPrivateLayerName(const CPLString &osName); 196 : 197 : public: 198 : OGRODBCDataSource(); 199 : virtual ~OGRODBCDataSource(); 200 : 201 : int Open(GDALOpenInfo *poOpenInfo); 202 : int OpenTable(const char *pszTableName, const char *pszGeomCol); 203 : 204 0 : int GetLayerCount() override 205 : { 206 0 : return nLayers; 207 : } 208 : 209 : OGRLayer *GetLayer(int) override; 210 : OGRLayer *GetLayerByName(const char *) override; 211 : bool IsLayerPrivate(int) const override; 212 : 213 : int TestCapability(const char *) override; 214 : 215 : virtual OGRLayer *ExecuteSQL(const char *pszSQLCommand, 216 : OGRGeometry *poSpatialFilter, 217 : const char *pszDialect) override; 218 : virtual void ReleaseResultSet(OGRLayer *poLayer) override; 219 : 220 : // Internal use 221 0 : CPLODBCSession *GetSession() 222 : { 223 0 : return &oSession; 224 : } 225 : }; 226 : 227 : #endif /* ndef OGR_ODBC_H_INCLUDED */