Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GeoPackage Translator 4 : * Purpose: Implements OGRGeoPackageSelectLayer class 5 : * Author: Even Rouault <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2014, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "ogr_geopackage.h" 14 : 15 : /************************************************************************/ 16 : /* OGRGeoPackageSelectLayer() */ 17 : /************************************************************************/ 18 : 19 774 : OGRGeoPackageSelectLayer::OGRGeoPackageSelectLayer( 20 : GDALGeoPackageDataset *poDS, const CPLString &osSQLIn, 21 : sqlite3_stmt *hStmtIn, bool bUseStatementForGetNextFeature, 22 774 : bool bEmptyLayer) 23 774 : : OGRGeoPackageLayer(poDS) 24 : { 25 : // Cannot be moved to initializer list because of use of this, which MSVC 26 : // 2008 doesn't like 27 774 : poBehavior = new OGRSQLiteSelectLayerCommonBehaviour(poDS, this, osSQLIn, 28 774 : bEmptyLayer); 29 : 30 774 : BuildFeatureDefn("SELECT", hStmtIn); 31 : 32 774 : m_bEOF = bEmptyLayer; 33 774 : if (bUseStatementForGetNextFeature) 34 : { 35 639 : m_poQueryStatement = hStmtIn; 36 639 : m_bDoStep = false; 37 : } 38 : else 39 : { 40 135 : sqlite3_finalize(hStmtIn); 41 : } 42 774 : } 43 : 44 : /************************************************************************/ 45 : /* ~OGRGeoPackageSelectLayer() */ 46 : /************************************************************************/ 47 : 48 1548 : OGRGeoPackageSelectLayer::~OGRGeoPackageSelectLayer() 49 : { 50 774 : delete poBehavior; 51 1548 : } 52 : 53 : /************************************************************************/ 54 : /* ResetReading() */ 55 : /************************************************************************/ 56 : 57 137 : void OGRGeoPackageSelectLayer::ResetReading() 58 : { 59 137 : poBehavior->ResetReading(); 60 137 : } 61 : 62 : /************************************************************************/ 63 : /* GetNextFeature() */ 64 : /************************************************************************/ 65 : 66 2023 : OGRFeature *OGRGeoPackageSelectLayer::GetNextFeature() 67 : { 68 2023 : return poBehavior->GetNextFeature(); 69 : } 70 : 71 : /************************************************************************/ 72 : /* GetNextFeature() */ 73 : /************************************************************************/ 74 : 75 268 : GIntBig OGRGeoPackageSelectLayer::GetFeatureCount(int bForce) 76 : { 77 268 : return poBehavior->GetFeatureCount(bForce); 78 : } 79 : 80 : /************************************************************************/ 81 : /* ResetStatement() */ 82 : /************************************************************************/ 83 : 84 61 : OGRErr OGRGeoPackageSelectLayer::ResetStatement() 85 : 86 : { 87 61 : ClearStatement(); 88 : 89 61 : m_iNextShapeId = 0; 90 61 : m_bDoStep = true; 91 : 92 : #ifdef DEBUG 93 61 : CPLDebug("OGR_GPKG", "prepare_v2(%s)", poBehavior->m_osSQLCurrent.c_str()); 94 : #endif 95 : 96 : const int rc = 97 61 : sqlite3_prepare_v2(m_poDS->GetDB(), poBehavior->m_osSQLCurrent, 98 61 : static_cast<int>(poBehavior->m_osSQLCurrent.size()), 99 : &m_poQueryStatement, nullptr); 100 : 101 61 : if (rc == SQLITE_OK) 102 : { 103 61 : return OGRERR_NONE; 104 : } 105 : else 106 : { 107 0 : CPLError(CE_Failure, CPLE_AppDefined, 108 : "In ResetStatement(): sqlite3_prepare_v2(%s):\n %s", 109 0 : poBehavior->m_osSQLCurrent.c_str(), 110 0 : sqlite3_errmsg(m_poDS->GetDB())); 111 0 : m_poQueryStatement = nullptr; 112 0 : return OGRERR_FAILURE; 113 : } 114 : } 115 : 116 : /************************************************************************/ 117 : /* SetAttributeFilter() */ 118 : /************************************************************************/ 119 : 120 34 : OGRErr OGRGeoPackageSelectLayer::SetAttributeFilter(const char *pszQuery) 121 : { 122 34 : return poBehavior->SetAttributeFilter(pszQuery); 123 : } 124 : 125 : /************************************************************************/ 126 : /* ISetSpatialFilter() */ 127 : /************************************************************************/ 128 : 129 45 : OGRErr OGRGeoPackageSelectLayer::ISetSpatialFilter(int iGeomField, 130 : const OGRGeometry *poGeomIn) 131 : 132 : { 133 45 : return poBehavior->SetSpatialFilter(iGeomField, poGeomIn); 134 : } 135 : 136 : /************************************************************************/ 137 : /* TestCapability() */ 138 : /************************************************************************/ 139 : 140 27 : int OGRGeoPackageSelectLayer::TestCapability(const char *pszCap) const 141 : { 142 27 : return poBehavior->TestCapability(pszCap); 143 : } 144 : 145 : /************************************************************************/ 146 : /* IGetExtent() */ 147 : /************************************************************************/ 148 : 149 2 : OGRErr OGRGeoPackageSelectLayer::IGetExtent(int iGeomField, 150 : OGREnvelope *psExtent, bool bForce) 151 : { 152 2 : return poBehavior->GetExtent(iGeomField, psExtent, bForce); 153 : }