Coverage Report

Created: 2026-08-14 09:29

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