Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Implements OGRODBCSelectLayer class, layer access to the results 5 : * of a SELECT statement executed via ExecuteSQL(). 6 : * Author: Frank Warmerdam, warmerdam@pobox.com 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2004, Frank Warmerdam 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #include "cpl_conv.h" 15 : #include "ogr_odbc.h" 16 : 17 : /************************************************************************/ 18 : /* OGRODBCSelectLayer() */ 19 : /************************************************************************/ 20 : 21 0 : OGRODBCSelectLayer::OGRODBCSelectLayer(OGRODBCDataSource *poDSIn, 22 0 : CPLODBCStatement *poStmtIn) 23 0 : : pszBaseStatement(CPLStrdup(poStmtIn->GetCommand())) 24 : { 25 0 : poDS = poDSIn; 26 : 27 0 : iNextShapeId = 0; 28 0 : nSRSId = -1; 29 0 : poFeatureDefn = nullptr; 30 : 31 0 : poStmt = poStmtIn; 32 : 33 0 : BuildFeatureDefn("SELECT", poStmt); 34 0 : } 35 : 36 : /************************************************************************/ 37 : /* ~OGRODBCSelectLayer() */ 38 : /************************************************************************/ 39 : 40 0 : OGRODBCSelectLayer::~OGRODBCSelectLayer() 41 : 42 : { 43 0 : ClearStatement(); 44 0 : } 45 : 46 : /************************************************************************/ 47 : /* ClearStatement() */ 48 : /************************************************************************/ 49 : 50 0 : void OGRODBCSelectLayer::ClearStatement() 51 : 52 : { 53 0 : if (poStmt != nullptr) 54 : { 55 0 : delete poStmt; 56 0 : poStmt = nullptr; 57 : } 58 0 : } 59 : 60 : /************************************************************************/ 61 : /* GetStatement() */ 62 : /************************************************************************/ 63 : 64 0 : CPLODBCStatement *OGRODBCSelectLayer::GetStatement() 65 : 66 : { 67 0 : if (poStmt == nullptr) 68 0 : ResetStatement(); 69 : 70 0 : return poStmt; 71 : } 72 : 73 : /************************************************************************/ 74 : /* ResetStatement() */ 75 : /************************************************************************/ 76 : 77 0 : OGRErr OGRODBCSelectLayer::ResetStatement() 78 : 79 : { 80 0 : ClearStatement(); 81 : 82 0 : iNextShapeId = 0; 83 : 84 0 : CPLDebug("OGR_ODBC", "Recreating statement."); 85 0 : poStmt = new CPLODBCStatement(poDS->GetSession()); 86 0 : poStmt->Append(pszBaseStatement); 87 : 88 0 : if (poStmt->ExecuteSQL()) 89 0 : return OGRERR_NONE; 90 : else 91 : { 92 0 : delete poStmt; 93 0 : poStmt = nullptr; 94 0 : return OGRERR_FAILURE; 95 : } 96 : } 97 : 98 : /************************************************************************/ 99 : /* ResetReading() */ 100 : /************************************************************************/ 101 : 102 0 : void OGRODBCSelectLayer::ResetReading() 103 : 104 : { 105 0 : if (iNextShapeId != 0) 106 0 : ClearStatement(); 107 : 108 0 : OGRODBCLayer::ResetReading(); 109 0 : } 110 : 111 : /************************************************************************/ 112 : /* GetFeature() */ 113 : /************************************************************************/ 114 : 115 0 : OGRFeature *OGRODBCSelectLayer::GetFeature(GIntBig nFeatureId) 116 : 117 : { 118 0 : return OGRODBCLayer::GetFeature(nFeatureId); 119 : } 120 : 121 : /************************************************************************/ 122 : /* TestCapability() */ 123 : /************************************************************************/ 124 : 125 0 : int OGRODBCSelectLayer::TestCapability(const char *pszCap) 126 : 127 : { 128 0 : return OGRODBCLayer::TestCapability(pszCap); 129 : } 130 : 131 : /************************************************************************/ 132 : /* GetExtent() */ 133 : /* */ 134 : /* Since SELECT layers currently cannot ever have geometry, we */ 135 : /* can optimize the GetExtent() method! */ 136 : /************************************************************************/ 137 : 138 0 : OGRErr OGRODBCSelectLayer::GetExtent(OGREnvelope *, int) 139 : 140 : { 141 0 : return OGRERR_FAILURE; 142 : } 143 : 144 : /************************************************************************/ 145 : /* GetFeatureCount() */ 146 : /* */ 147 : /* If a spatial filter is in effect, we turn control over to */ 148 : /* the generic counter. Otherwise we return the total count. */ 149 : /* Eventually we should consider implementing a more efficient */ 150 : /* way of counting features matching a spatial query. */ 151 : /************************************************************************/ 152 : 153 0 : GIntBig OGRODBCSelectLayer::GetFeatureCount(int bForce) 154 : 155 : { 156 0 : return OGRODBCLayer::GetFeatureCount(bForce); 157 : }