Coverage Report

Created: 2025-08-11 09:23

/src/gdal/ogr/ogrsf_frmts/carto/ogr_carto.h
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *
3
 * Project:  CARTO Translator
4
 * Purpose:  Definition of classes for OGR Carto driver.
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
#ifndef OGR_CARTO_H_INCLUDED
14
#define OGR_CARTO_H_INCLUDED
15
16
#include "ogrsf_frmts.h"
17
18
#include "cpl_http.h"
19
#include "cpl_json_header.h"
20
21
#include <vector>
22
23
json_object *OGRCARTOGetSingleRow(json_object *poObj);
24
CPLString OGRCARTOEscapeIdentifier(const char *pszStr);
25
CPLString OGRCARTOEscapeLiteral(const char *pszStr);
26
CPLString OGRCARTOEscapeLiteralCopy(const char *pszStr);
27
28
/************************************************************************/
29
/*                      OGRCartoGeomFieldDefn                           */
30
/************************************************************************/
31
32
class OGRCartoGeomFieldDefn final : public OGRGeomFieldDefn
33
{
34
  public:
35
    int nSRID;
36
37
    OGRCartoGeomFieldDefn(const char *pszNameIn, OGRwkbGeometryType eType)
38
0
        : OGRGeomFieldDefn(pszNameIn, eType), nSRID(0)
39
0
    {
40
0
    }
41
42
    ~OGRCartoGeomFieldDefn() override;
43
};
44
45
/************************************************************************/
46
/*                           OGRCARTOLayer                            */
47
/************************************************************************/
48
class OGRCARTODataSource;
49
50
class OGRCARTOLayer CPL_NON_FINAL : public OGRLayer
51
{
52
  protected:
53
    OGRCARTODataSource *poDS;
54
55
    OGRFeatureDefn *poFeatureDefn;
56
    CPLString osBaseSQL;
57
    CPLString osFIDColName;
58
59
    bool bEOF;
60
    int nFetchedObjects;
61
    int iNextInFetchedObjects;
62
    GIntBig m_nNextFID;
63
    GIntBig m_nNextOffset;
64
    json_object *poCachedObj;
65
66
    virtual OGRFeature *GetNextRawFeature();
67
    OGRFeature *BuildFeature(json_object *poRowObj);
68
69
    void EstablishLayerDefn(const char *pszLayerName, json_object *poObjIn);
70
    OGRSpatialReference *GetSRS(const char *pszGeomCol, int *pnSRID);
71
    virtual CPLString GetSRS_SQL(const char *pszGeomCol) = 0;
72
73
  public:
74
    explicit OGRCARTOLayer(OGRCARTODataSource *poDS);
75
    virtual ~OGRCARTOLayer();
76
77
    virtual void ResetReading() override;
78
    virtual OGRFeature *GetNextFeature() override;
79
80
    virtual OGRFeatureDefn *GetLayerDefn() override;
81
    virtual OGRFeatureDefn *GetLayerDefnInternal(json_object *poObjIn) = 0;
82
    virtual json_object *FetchNewFeatures();
83
84
    virtual const char *GetFIDColumn() override
85
0
    {
86
0
        return osFIDColName.c_str();
87
0
    }
88
89
    virtual int TestCapability(const char *) override;
90
91
    GDALDataset *GetDataset() override;
92
93
    static int GetFeaturesToFetch()
94
240
    {
95
240
        return atoi(CPLGetConfigOption(
96
240
            "CARTO_PAGE_SIZE", CPLGetConfigOption("CARTODB_PAGE_SIZE", "500")));
97
240
    }
98
};
99
100
typedef enum
101
{
102
    INSERT_UNINIT,
103
    INSERT_SINGLE_FEATURE,
104
    INSERT_MULTIPLE_FEATURE
105
} InsertState;
106
107
/************************************************************************/
108
/*                        OGRCARTOTableLayer                          */
109
/************************************************************************/
110
111
class OGRCARTOTableLayer final : public OGRCARTOLayer
112
{
113
    CPLString osName;
114
    CPLString osQuery;
115
    CPLString osWHERE;
116
    CPLString osSELECTWithoutWHERE;
117
118
    bool bLaunderColumnNames;
119
120
    bool bInDeferredInsert;
121
    bool bCopyMode;
122
    InsertState eDeferredInsertState;
123
    CPLString osDeferredBuffer;
124
    CPLString osCopySQL;
125
    GIntBig m_nNextFIDWrite;
126
127
    bool bDeferredCreation;
128
    bool bCartodbfy;
129
    int nMaxChunkSize;
130
131
    bool bDropOnCreation;
132
133
    void BuildWhere();
134
    std::vector<bool> m_abFieldSetForInsert;
135
136
    virtual CPLString GetSRS_SQL(const char *pszGeomCol) override;
137
138
  public:
139
    OGRCARTOTableLayer(OGRCARTODataSource *poDS, const char *pszName);
140
    virtual ~OGRCARTOTableLayer();
141
142
    virtual const char *GetName() override
143
0
    {
144
0
        return osName.c_str();
145
0
    }
146
147
    virtual OGRFeatureDefn *GetLayerDefnInternal(json_object *poObjIn) override;
148
    virtual json_object *FetchNewFeatures() override;
149
150
    virtual GIntBig GetFeatureCount(int bForce = TRUE) override;
151
    virtual OGRFeature *GetFeature(GIntBig nFeatureId) override;
152
153
    virtual int TestCapability(const char *) override;
154
155
    virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomFieldIn,
156
                                   int bApproxOK = TRUE) override;
157
158
    virtual OGRErr CreateField(const OGRFieldDefn *poField,
159
                               int bApproxOK = TRUE) override;
160
161
    virtual OGRErr DeleteField(int iField) override;
162
163
    virtual OGRFeature *GetNextRawFeature() override;
164
165
    virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
166
    virtual OGRErr ISetFeature(OGRFeature *poFeature) override;
167
    virtual OGRErr DeleteFeature(GIntBig nFID) override;
168
169
    OGRErr ISetSpatialFilter(int iGeomField,
170
                             const OGRGeometry *poGeom) override;
171
172
    virtual OGRErr SetAttributeFilter(const char *) override;
173
174
    OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
175
                      bool bForce) override;
176
177
    void SetLaunderFlag(bool bFlag)
178
0
    {
179
0
        bLaunderColumnNames = bFlag;
180
0
    }
181
182
    void SetDeferredCreation(OGRwkbGeometryType eGType,
183
                             OGRSpatialReference *poSRS, bool bGeomNullable,
184
                             bool bCartodbfy);
185
    OGRErr RunDeferredCreationIfNecessary();
186
187
    bool GetDeferredCreation() const
188
0
    {
189
0
        return bDeferredCreation;
190
0
    }
191
192
    void CancelDeferredCreation()
193
0
    {
194
0
        bDeferredCreation = false;
195
0
        bCartodbfy = false;
196
0
    }
197
198
    OGRErr FlushDeferredBuffer(bool bReset = true);
199
    void RunDeferredCartofy();
200
201
    OGRErr FlushDeferredInsert(bool bReset = true);
202
    OGRErr FlushDeferredCopy(bool bReset = true);
203
    OGRErr ICreateFeatureInsert(OGRFeature *poFeature,
204
                                bool bHasUserFieldMatchingFID,
205
                                bool bHasJustGotNextFID);
206
    OGRErr ICreateFeatureCopy(OGRFeature *poFeature,
207
                              bool bHasUserFieldMatchingFID,
208
                              bool bHasJustGotNextFID);
209
    char *OGRCARTOGetHexGeometry(OGRGeometry *poGeom, int i);
210
211
    void SetDropOnCreation(bool bFlag)
212
0
    {
213
0
        bDropOnCreation = bFlag;
214
0
    }
215
216
    bool GetDropOnCreation() const
217
0
    {
218
0
        return bDropOnCreation;
219
0
    }
220
};
221
222
/************************************************************************/
223
/*                       OGRCARTOResultLayer                            */
224
/************************************************************************/
225
226
class OGRCARTOResultLayer final : public OGRCARTOLayer
227
{
228
    OGRFeature *poFirstFeature;
229
230
    virtual CPLString GetSRS_SQL(const char *pszGeomCol) override;
231
232
  public:
233
    OGRCARTOResultLayer(OGRCARTODataSource *poDS, const char *pszRawStatement);
234
    virtual ~OGRCARTOResultLayer();
235
236
    virtual OGRFeatureDefn *GetLayerDefnInternal(json_object *poObjIn) override;
237
    virtual OGRFeature *GetNextRawFeature() override;
238
239
    bool IsOK();
240
};
241
242
/************************************************************************/
243
/*                           OGRCARTODataSource                         */
244
/************************************************************************/
245
246
class OGRCARTODataSource final : public GDALDataset
247
{
248
    char *pszAccount;
249
250
    OGRCARTOTableLayer **papoLayers;
251
    int nLayers;
252
253
    bool bReadWrite;
254
    bool bBatchInsert;
255
    bool bCopyMode;
256
257
    bool bUseHTTPS;
258
259
    CPLString osAPIKey;
260
261
    bool bMustCleanPersistent;
262
263
    CPLString osCurrentSchema;
264
265
    int bHasOGRMetadataFunction;
266
267
    int nPostGISMajor;
268
    int nPostGISMinor;
269
270
  public:
271
    OGRCARTODataSource();
272
    virtual ~OGRCARTODataSource();
273
274
    int Open(const char *pszFilename, char **papszOpenOptions, int bUpdate);
275
276
    virtual int GetLayerCount() override
277
0
    {
278
0
        return nLayers;
279
0
    }
280
281
    virtual OGRLayer *GetLayer(int) override;
282
283
    virtual int TestCapability(const char *) override;
284
285
    OGRLayer *ICreateLayer(const char *pszName,
286
                           const OGRGeomFieldDefn *poGeomFieldDefn,
287
                           CSLConstList papszOptions) override;
288
    virtual OGRErr DeleteLayer(int) override;
289
290
    virtual OGRLayer *ExecuteSQL(const char *pszSQLCommand,
291
                                 OGRGeometry *poSpatialFilter,
292
                                 const char *pszDialect) override;
293
    virtual void ReleaseResultSet(OGRLayer *poLayer) override;
294
295
    const char *GetAPIURL() const;
296
297
    bool IsReadWrite() const
298
0
    {
299
0
        return bReadWrite;
300
0
    }
301
302
    bool DoBatchInsert() const
303
0
    {
304
0
        return bBatchInsert;
305
0
    }
306
307
    bool DoCopyMode() const
308
0
    {
309
0
        return bCopyMode;
310
0
    }
311
312
    char **AddHTTPOptions();
313
    json_object *RunSQL(const char *pszUnescapedSQL);
314
    json_object *RunCopyFrom(const char *pszSQL, const char *pszCopyFile);
315
316
    const CPLString &GetCurrentSchema()
317
0
    {
318
0
        return osCurrentSchema;
319
0
    }
320
321
    static int FetchSRSId(const OGRSpatialReference *poSRS);
322
323
    int IsAuthenticatedConnection()
324
0
    {
325
0
        return !osAPIKey.empty();
326
0
    }
327
328
    int HasOGRMetadataFunction()
329
0
    {
330
0
        return bHasOGRMetadataFunction;
331
0
    }
332
333
    void SetOGRMetadataFunction(int bFlag)
334
0
    {
335
0
        bHasOGRMetadataFunction = bFlag;
336
0
    }
337
338
    OGRLayer *ExecuteSQLInternal(const char *pszSQLCommand,
339
                                 OGRGeometry *poSpatialFilter = nullptr,
340
                                 const char *pszDialect = nullptr,
341
                                 bool bRunDeferredActions = false);
342
343
    int GetPostGISMajor() const
344
0
    {
345
0
        return nPostGISMajor;
346
0
    }
347
348
    int GetPostGISMinor() const
349
0
    {
350
0
        return nPostGISMinor;
351
0
    }
352
};
353
354
#endif /* ndef OGR_CARTO_H_INCLUDED */