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