Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Implements OGRPGeoSelectLayer 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) 2005, Frank Warmerdam 10 : * Copyright (c) 2010-2014, Even Rouault <even dot rouault at spatialys.com> 11 : * 12 : * SPDX-License-Identifier: MIT 13 : ****************************************************************************/ 14 : 15 : #include "cpl_conv.h" 16 : #include "ogr_pgeo.h" 17 : 18 : /************************************************************************/ 19 : /* OGRPGeoSelectLayer() */ 20 : /************************************************************************/ 21 : 22 0 : OGRPGeoSelectLayer::OGRPGeoSelectLayer(OGRPGeoDataSource *poDSIn, 23 0 : CPLODBCStatement *poStmtIn) 24 0 : : pszBaseStatement(CPLStrdup(poStmtIn->GetCommand())) 25 : { 26 0 : poDS = poDSIn; 27 : 28 0 : iNextShapeId = 0; 29 0 : nSRSId = -1; 30 0 : poFeatureDefn = nullptr; 31 : 32 0 : poStmt = poStmtIn; 33 : 34 : // Just to make test_ogrsf happy, but would/could need be extended to 35 : // other cases. 36 0 : if (STARTS_WITH_CI(pszBaseStatement, "SELECT * FROM ")) 37 : { 38 : 39 : OGRLayer *poBaseLayer = 40 0 : poDSIn->GetLayerByName(pszBaseStatement + strlen("SELECT * FROM ")); 41 0 : if (poBaseLayer != nullptr) 42 : { 43 0 : poSRS = poBaseLayer->GetSpatialRef(); 44 0 : if (poSRS != nullptr) 45 0 : poSRS->Reference(); 46 : } 47 : } 48 : 49 0 : BuildFeatureDefn("SELECT", poStmt); 50 0 : } 51 : 52 : /************************************************************************/ 53 : /* ~OGRPGeoSelectLayer() */ 54 : /************************************************************************/ 55 : 56 0 : OGRPGeoSelectLayer::~OGRPGeoSelectLayer() 57 : 58 : { 59 0 : ClearStatement(); 60 0 : CPLFree(pszBaseStatement); 61 0 : } 62 : 63 : /************************************************************************/ 64 : /* ClearStatement() */ 65 : /************************************************************************/ 66 : 67 0 : void OGRPGeoSelectLayer::ClearStatement() 68 : 69 : { 70 0 : if (poStmt != nullptr) 71 : { 72 0 : delete poStmt; 73 0 : poStmt = nullptr; 74 : } 75 0 : } 76 : 77 : /************************************************************************/ 78 : /* GetStatement() */ 79 : /************************************************************************/ 80 : 81 0 : CPLODBCStatement *OGRPGeoSelectLayer::GetStatement() 82 : 83 : { 84 0 : if (poStmt == nullptr) 85 0 : ResetStatement(); 86 : 87 0 : return poStmt; 88 : } 89 : 90 : /************************************************************************/ 91 : /* ResetStatement() */ 92 : /************************************************************************/ 93 : 94 0 : OGRErr OGRPGeoSelectLayer::ResetStatement() 95 : 96 : { 97 0 : ClearStatement(); 98 : 99 0 : iNextShapeId = 0; 100 : 101 0 : CPLDebug("ODBC", "Recreating statement."); 102 0 : poStmt = new CPLODBCStatement(poDS->GetSession(), m_nStatementFlags); 103 0 : poStmt->Append(pszBaseStatement); 104 : 105 0 : if (poStmt->ExecuteSQL()) 106 0 : return OGRERR_NONE; 107 : else 108 : { 109 0 : delete poStmt; 110 0 : poStmt = nullptr; 111 0 : return OGRERR_FAILURE; 112 : } 113 : } 114 : 115 : /************************************************************************/ 116 : /* ResetReading() */ 117 : /************************************************************************/ 118 : 119 0 : void OGRPGeoSelectLayer::ResetReading() 120 : 121 : { 122 0 : if (iNextShapeId != 0) 123 0 : ClearStatement(); 124 : 125 0 : OGRPGeoLayer::ResetReading(); 126 0 : } 127 : 128 : /************************************************************************/ 129 : /* GetFeature() */ 130 : /************************************************************************/ 131 : 132 0 : OGRFeature *OGRPGeoSelectLayer::GetFeature(GIntBig nFeatureId) 133 : 134 : { 135 0 : return OGRPGeoLayer::GetFeature(nFeatureId); 136 : } 137 : 138 : /************************************************************************/ 139 : /* TestCapability() */ 140 : /************************************************************************/ 141 : 142 0 : int OGRPGeoSelectLayer::TestCapability(const char *pszCap) 143 : 144 : { 145 0 : return OGRPGeoLayer::TestCapability(pszCap); 146 : } 147 : 148 : /************************************************************************/ 149 : /* GetFeatureCount() */ 150 : /* */ 151 : /* If a spatial filter is in effect, we turn control over to */ 152 : /* the generic counter. Otherwise we return the total count. */ 153 : /* Eventually we should consider implementing a more efficient */ 154 : /* way of counting features matching a spatial query. */ 155 : /************************************************************************/ 156 : 157 0 : GIntBig OGRPGeoSelectLayer::GetFeatureCount(int bForce) 158 : 159 : { 160 0 : return OGRPGeoLayer::GetFeatureCount(bForce); 161 : }