Coverage Report

Created: 2026-11-12 08:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/carto/ogrcartoresultlayer.cpp
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  Carto Translator
4
 * Purpose:  Implements OGRCARTOResultLayer class.
5
 * Author:   Even Rouault, <even dot rouault at spatialys.com>
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2013, Even Rouault <even dot rouault at spatialys.com>
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#include "ogr_carto.h"
14
15
/************************************************************************/
16
/*                        OGRCARTOResultLayer()                         */
17
/************************************************************************/
18
19
OGRCARTOResultLayer::OGRCARTOResultLayer(OGRCARTODataSource *poDSIn,
20
                                         const char *pszRawQueryIn)
21
453
    : OGRCARTOLayer(poDSIn), poFirstFeature(nullptr)
22
453
{
23
453
    osBaseSQL = pszRawQueryIn;
24
453
    SetDescription("result");
25
453
}
26
27
/************************************************************************/
28
/*                        ~OGRCARTOResultLayer()                        */
29
/************************************************************************/
30
31
OGRCARTOResultLayer::~OGRCARTOResultLayer()
32
33
453
{
34
453
    delete poFirstFeature;
35
453
}
36
37
/************************************************************************/
38
/*                        GetLayerDefnInternal()                        */
39
/************************************************************************/
40
41
OGRFeatureDefn *OGRCARTOResultLayer::GetLayerDefnInternal(json_object *poObjIn)
42
0
{
43
0
    if (poFeatureDefn != nullptr)
44
0
        return poFeatureDefn;
45
46
0
    EstablishLayerDefn("result", poObjIn);
47
48
0
    return poFeatureDefn;
49
0
}
50
51
/************************************************************************/
52
/*                         GetNextRawFeature()                          */
53
/************************************************************************/
54
55
OGRFeature *OGRCARTOResultLayer::GetNextRawFeature()
56
453
{
57
453
    if (poFirstFeature)
58
0
    {
59
0
        OGRFeature *poRet = poFirstFeature;
60
0
        poFirstFeature = nullptr;
61
0
        return poRet;
62
0
    }
63
453
    else
64
453
        return OGRCARTOLayer::GetNextRawFeature();
65
453
}
66
67
/************************************************************************/
68
/*                                IsOK()                                */
69
/************************************************************************/
70
71
bool OGRCARTOResultLayer::IsOK()
72
453
{
73
453
    CPLErrorReset();
74
453
    poFirstFeature = GetNextFeature();
75
453
    return CPLGetLastErrorType() == 0;
76
453
}
77
78
/************************************************************************/
79
/*                             GetSRS_SQL()                             */
80
/************************************************************************/
81
82
CPLString OGRCARTOResultLayer::GetSRS_SQL(const char *pszGeomCol)
83
0
{
84
0
    CPLString osSQL;
85
0
    CPLString osLimitedSQL;
86
87
0
    size_t nPos = osBaseSQL.ifind(" LIMIT ");
88
0
    if (nPos != std::string::npos)
89
0
    {
90
0
        osLimitedSQL = osBaseSQL;
91
0
        size_t nSize = osLimitedSQL.size();
92
0
        for (size_t i = nPos + strlen(" LIMIT "); i < nSize; i++)
93
0
        {
94
0
            if (osLimitedSQL[i] == ' ' && osLimitedSQL[i - 1] == '0')
95
0
            {
96
0
                osLimitedSQL[i - 1] = '1';
97
0
                break;
98
0
            }
99
0
            osLimitedSQL[i] = '0';
100
0
        }
101
0
    }
102
0
    else
103
0
        osLimitedSQL.Printf("%s LIMIT 1", osBaseSQL.c_str());
104
105
    /* Assuming that the SRID of the first non-NULL geometry applies */
106
    /* to geometries of all rows. */
107
0
    osSQL.Printf("SELECT srid, srtext FROM spatial_ref_sys WHERE srid IN "
108
0
                 "(SELECT ST_SRID(%s) FROM (%s) ogr_subselect)",
109
0
                 OGRCARTOEscapeIdentifier(pszGeomCol).c_str(),
110
0
                 osLimitedSQL.c_str());
111
112
0
    return osSQL;
113
0
}