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 758 : OGRGeoPackageSelectLayer::OGRGeoPackageSelectLayer( 20 : GDALGeoPackageDataset *poDS, const CPLString &osSQLIn, 21 : sqlite3_stmt *hStmtIn, bool bUseStatementForGetNextFeature, 22 758 : bool bEmptyLayer) 23 758 : : OGRGeoPackageLayer(poDS) 24 : { 25 : // Cannot be moved to initializer list because of use of this, which MSVC 26 : // 2008 doesn't like 27 758 : poBehavior = new OGRSQLiteSelectLayerCommonBehaviour(poDS, this, osSQLIn, 28 758 : bEmptyLayer); 29 : 30 758 : BuildFeatureDefn("SELECT", hStmtIn); 31 : 32 758 : if (bUseStatementForGetNextFeature) 33 : { 34 629 : m_poQueryStatement = hStmtIn; 35 629 : m_bDoStep = false; 36 : } 37 : else 38 : { 39 129 : sqlite3_finalize(hStmtIn); 40 : } 41 758 : } 42 : 43 : /************************************************************************/ 44 : /* ~OGRGeoPackageSelectLayer() */ 45 : /************************************************************************/ 46 : 47 1516 : OGRGeoPackageSelectLayer::~OGRGeoPackageSelectLayer() 48 : { 49 758 : delete poBehavior; 50 1516 : } 51 : 52 : /************************************************************************/ 53 : /* ResetReading() */ 54 : /************************************************************************/ 55 : 56 133 : void OGRGeoPackageSelectLayer::ResetReading() 57 : { 58 133 : poBehavior->ResetReading(); 59 133 : } 60 : 61 : /************************************************************************/ 62 : /* GetNextFeature() */ 63 : /************************************************************************/ 64 : 65 1991 : OGRFeature *OGRGeoPackageSelectLayer::GetNextFeature() 66 : { 67 1991 : return poBehavior->GetNextFeature(); 68 : } 69 : 70 : /************************************************************************/ 71 : /* GetNextFeature() */ 72 : /************************************************************************/ 73 : 74 261 : GIntBig OGRGeoPackageSelectLayer::GetFeatureCount(int bForce) 75 : { 76 261 : return poBehavior->GetFeatureCount(bForce); 77 : } 78 : 79 : /************************************************************************/ 80 : /* ResetStatement() */ 81 : /************************************************************************/ 82 : 83 59 : OGRErr OGRGeoPackageSelectLayer::ResetStatement() 84 : 85 : { 86 59 : ClearStatement(); 87 : 88 59 : m_iNextShapeId = 0; 89 59 : m_bDoStep = true; 90 : 91 : #ifdef DEBUG 92 59 : CPLDebug("OGR_GPKG", "prepare_v2(%s)", poBehavior->m_osSQLCurrent.c_str()); 93 : #endif 94 : 95 : const int rc = 96 59 : sqlite3_prepare_v2(m_poDS->GetDB(), poBehavior->m_osSQLCurrent, 97 59 : static_cast<int>(poBehavior->m_osSQLCurrent.size()), 98 : &m_poQueryStatement, nullptr); 99 : 100 59 : if (rc == SQLITE_OK) 101 : { 102 59 : return OGRERR_NONE; 103 : } 104 : else 105 : { 106 0 : CPLError(CE_Failure, CPLE_AppDefined, 107 : "In ResetStatement(): sqlite3_prepare_v2(%s):\n %s", 108 0 : poBehavior->m_osSQLCurrent.c_str(), 109 0 : sqlite3_errmsg(m_poDS->GetDB())); 110 0 : m_poQueryStatement = nullptr; 111 0 : return OGRERR_FAILURE; 112 : } 113 : } 114 : 115 : /************************************************************************/ 116 : /* SetAttributeFilter() */ 117 : /************************************************************************/ 118 : 119 34 : OGRErr OGRGeoPackageSelectLayer::SetAttributeFilter(const char *pszQuery) 120 : { 121 34 : return poBehavior->SetAttributeFilter(pszQuery); 122 : } 123 : 124 : /************************************************************************/ 125 : /* SetSpatialFilter() */ 126 : /************************************************************************/ 127 : 128 47 : void OGRGeoPackageSelectLayer::SetSpatialFilter(int iGeomField, 129 : OGRGeometry *poGeomIn) 130 : 131 : { 132 47 : poBehavior->SetSpatialFilter(iGeomField, poGeomIn); 133 47 : } 134 : 135 : /************************************************************************/ 136 : /* TestCapability() */ 137 : /************************************************************************/ 138 : 139 26 : int OGRGeoPackageSelectLayer::TestCapability(const char *pszCap) 140 : { 141 26 : return poBehavior->TestCapability(pszCap); 142 : } 143 : 144 : /************************************************************************/ 145 : /* GetExtent() */ 146 : /************************************************************************/ 147 : 148 4 : OGRErr OGRGeoPackageSelectLayer::GetExtent(int iGeomField, 149 : OGREnvelope *psExtent, int bForce) 150 : { 151 4 : return poBehavior->GetExtent(iGeomField, psExtent, bForce); 152 : }