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 : ~OGRODBCLayer() override; 63 : 64 : void ResetReading() override; 65 : virtual OGRFeature *GetNextRawFeature(); 66 : OGRFeature *GetNextFeature() override; 67 : 68 : OGRFeature *GetFeature(GIntBig nFeatureId) override; 69 : 70 0 : const OGRFeatureDefn *GetLayerDefn() const override 71 : { 72 0 : return poFeatureDefn; 73 : } 74 : 75 : const OGRSpatialReference *GetSpatialRef() const override; 76 : 77 : int TestCapability(const char *) const 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 : CPLODBCStatement *GetStatement() override; 94 : 95 : char *pszTableName; 96 : char *pszSchemaName; 97 : 98 : public: 99 : explicit OGRODBCTableLayer(OGRODBCDataSource *, int); 100 : ~OGRODBCTableLayer() override; 101 : 102 : CPLErr Initialize(const char *pszTableName, const char *pszGeomCol); 103 : 104 : void ResetReading() override; 105 : GIntBig GetFeatureCount(int) override; 106 : 107 : 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 : OGRFeature *GetFeature(GIntBig nFeatureId) override; 115 : 116 : const OGRSpatialReference *GetSpatialRef() const override; 117 : 118 : int TestCapability(const char *) const 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 : CPLODBCStatement *GetStatement() override; 146 : 147 : public: 148 : OGRODBCSelectLayer(OGRODBCDataSource *, CPLODBCStatement *); 149 : ~OGRODBCSelectLayer() override; 150 : 151 : void ResetReading() override; 152 : GIntBig GetFeatureCount(int) override; 153 : 154 : OGRFeature *GetFeature(GIntBig nFeatureId) override; 155 : 156 : OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, 157 : bool bForce) override; 158 : 159 : int TestCapability(const char *) const override; 160 : }; 161 : 162 : /************************************************************************/ 163 : /* OGRODBCDataSource */ 164 : /************************************************************************/ 165 : 166 : class OGRODBCDataSource final : public GDALDataset 167 : { 168 : OGRODBCLayer **papoLayers; 169 : int nLayers; 170 : 171 : CPLODBCSession oSession; 172 : 173 : #if 0 174 : // NOTE: nothing uses the SRS cache currently. Hence disabled. 175 : 176 : // We maintain a list of known SRID to reduce the number of trips to 177 : // the database to get SRSes. 178 : std::map<int, OGRSpatialReferenceRefCountedPtr> m_oSRSCache{}; 179 : #endif 180 : 181 : // set of all lowercase table names. Note that this is only used when 182 : // opening MDB datasources, not generic ODBC ones. 183 : std::unordered_set<std::string> m_aosAllLCTableNames; 184 : 185 : int m_nStatementFlags = 0; 186 : 187 : int OpenMDB(GDALOpenInfo *poOpenInfo); 188 : static bool IsPrivateLayerName(const CPLString &osName); 189 : 190 : public: 191 : OGRODBCDataSource(); 192 : ~OGRODBCDataSource() override; 193 : 194 : int Open(GDALOpenInfo *poOpenInfo); 195 : int OpenTable(const char *pszTableName, const char *pszGeomCol); 196 : 197 0 : int GetLayerCount() const override 198 : { 199 0 : return nLayers; 200 : } 201 : 202 : const OGRLayer *GetLayer(int) const override; 203 : OGRLayer *GetLayerByName(const char *) override; 204 : bool IsLayerPrivate(int) const override; 205 : 206 : int TestCapability(const char *) const override; 207 : 208 : OGRLayer *ExecuteSQL(const char *pszSQLCommand, 209 : OGRGeometry *poSpatialFilter, 210 : const char *pszDialect) override; 211 : void ReleaseResultSet(OGRLayer *poLayer) override; 212 : 213 : // Internal use 214 0 : CPLODBCSession *GetSession() 215 : { 216 0 : return &oSession; 217 : } 218 : }; 219 : 220 : #endif /* ndef OGR_ODBC_H_INCLUDED */