• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

OSGeo / gdal / 15679268364

16 Jun 2025 11:14AM UTC coverage: 71.062% (-0.001%) from 71.063%
15679268364

Pull #12576

github

web-flow
Merge 865af5232 into c340e3766
Pull Request #12576: gdal vector rasterize: Improve error message for unsupported output format

7 of 7 new or added lines in 1 file covered. (100.0%)

90 existing lines in 32 files now uncovered.

571702 of 804513 relevant lines covered (71.06%)

251416.49 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.86
/ogr/ogrsf_frmts/sqlite/ogrsqlitedriver.cpp
1
/******************************************************************************
2
 *
3
 * Project:  OpenGIS Simple Features Reference Implementation
4
 * Purpose:  Implements OGRSQLiteDriver class.
5
 * Author:   Frank Warmerdam, warmerdam@pobox.com
6
 *
7
 ******************************************************************************
8
 *
9
 * Contributor: Alessandro Furieri, a.furieri@lqt.it
10
 * Portions of this module properly supporting SpatiaLite DB creation
11
 * Developed for Faunalia ( http://www.faunalia.it) with funding from
12
 * Regione Toscana - Settore SISTEMA INFORMATIVO TERRITORIALE ED AMBIENTALE
13
 *
14
 ******************************************************************************
15
 * Copyright (c) 2004, Frank Warmerdam <warmerdam@pobox.com>
16
 * Copyright (c) 2007-2013, Even Rouault <even dot rouault at spatialys.com>
17
 *
18
 * SPDX-License-Identifier: MIT
19
 ****************************************************************************/
20

21
#include "cpl_port.h"
22
#include "ogr_sqlite.h"
23

24
#include <cstring>
25
#include <string>
26

27
#include "cpl_conv.h"
28
#include "cpl_error.h"
29
#include "cpl_string.h"
30
#include "cpl_vsi.h"
31
#include "gdal.h"
32
#include "gdal_priv.h"
33
#include "ogr_core.h"
34
#include "sqlite3.h"
35

36
/************************************************************************/
37
/*                     OGRSQLiteDriverIdentify()                        */
38
/************************************************************************/
39

40
static int OGRSQLiteDriverIdentify(GDALOpenInfo *poOpenInfo)
53,031✔
41

42
{
43
    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "SQLITE:"))
53,031✔
44
    {
45
        return TRUE;
156✔
46
    }
47

48
    CPLString osExt(CPLGetExtensionSafe(poOpenInfo->pszFilename));
105,750✔
49
    if (EQUAL(osExt, "gpkg") && GDALGetDriverByName("GPKG") != nullptr)
52,875✔
50
    {
51
        return FALSE;
1,921✔
52
    }
53
    if (EQUAL(osExt, "mbtiles") && GDALGetDriverByName("MBTILES") != nullptr)
50,954✔
54
    {
55
        if (CSLCount(poOpenInfo->papszAllowedDrivers) == 1 &&
265✔
56
            EQUAL(poOpenInfo->papszAllowedDrivers[0], "SQLite"))
74✔
57
        {
58
            return TRUE;
74✔
59
        }
60
        return FALSE;
117✔
61
    }
62

63
    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "VirtualShape:") &&
50,764✔
64
        EQUAL(osExt, "shp"))
2✔
65
    {
66
        return TRUE;
2✔
67
    }
68

69
#ifdef HAVE_RASTERLITE2
70
    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "RASTERLITE2:"))
71
        return poOpenInfo->nOpenFlags & GDAL_OF_RASTER;
72
#endif
73

74
    if (EQUAL(poOpenInfo->pszFilename, ":memory:"))
50,760✔
75
        return TRUE;
94✔
76

77
#ifdef SQLITE_OPEN_URI
78
    // This code enables support for named memory databases in SQLite.
79
    // Named memory databases use file name format
80
    //   file:name?mode=memory&cache=shared
81
    // SQLITE_USE_URI is checked only to enable backward compatibility, in case
82
    // we accidentally hijacked some other format.
83
    if (STARTS_WITH(poOpenInfo->pszFilename, "file:") &&
50,668✔
84
        CPLTestBool(CPLGetConfigOption("SQLITE_USE_URI", "YES")))
2✔
85
    {
86
        char *queryparams = strchr(poOpenInfo->pszFilename, '?');
2✔
87
        if (queryparams)
2✔
88
        {
89
            if (strstr(queryparams, "mode=memory") != nullptr)
2✔
90
                return TRUE;
2✔
91
        }
92
    }
93
#endif
94

95
    /* -------------------------------------------------------------------- */
96
    /*      Verify that the target is a real file, and has an               */
97
    /*      appropriate magic string at the beginning.                      */
98
    /* -------------------------------------------------------------------- */
99
    if (poOpenInfo->nHeaderBytes < 100)
50,664✔
100
        return FALSE;
47,257✔
101

102
#ifdef ENABLE_SQL_SQLITE_FORMAT
103
    if (STARTS_WITH(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
3,407✔
104
                    "-- SQL SQLITE"))
105
    {
106
        return TRUE;
2✔
107
    }
108
    if (STARTS_WITH(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
3,405✔
109
                    "-- SQL RASTERLITE"))
110
    {
111
        return -1;
×
112
    }
113
    if (STARTS_WITH(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
3,405✔
114
                    "-- SQL MBTILES"))
115
    {
116
        if (GDALGetDriverByName("MBTILES") != nullptr)
×
117
            return FALSE;
×
118
        if (poOpenInfo->eAccess == GA_Update)
×
119
            return FALSE;
×
120
        return -1;
×
121
    }
122
#endif
123

124
    if (!STARTS_WITH(reinterpret_cast<const char *>(poOpenInfo->pabyHeader),
3,405✔
125
                     "SQLite format 3"))
126
        return FALSE;
2,937✔
127

128
    // In case we are opening /vsizip/foo.zip with a .gpkg inside
129
    if ((memcmp(poOpenInfo->pabyHeader + 68, "GP10", 4) == 0 ||
1,406✔
130
         memcmp(poOpenInfo->pabyHeader + 68, "GP11", 4) == 0 ||
469✔
131
         memcmp(poOpenInfo->pabyHeader + 68, "GPKG", 4) == 0) &&
938✔
UNCOV
132
        GDALGetDriverByName("GPKG") != nullptr)
×
133
    {
134
        return FALSE;
1✔
135
    }
136

137
    // Could be a Rasterlite or MBTiles file as well
138
    return -1;
468✔
139
}
140

141
/************************************************************************/
142
/*                                Open()                                */
143
/************************************************************************/
144

145
static GDALDataset *OGRSQLiteDriverOpen(GDALOpenInfo *poOpenInfo)
388✔
146

147
{
148
    if (OGRSQLiteDriverIdentify(poOpenInfo) == FALSE)
388✔
149
        return nullptr;
×
150

151
    /* -------------------------------------------------------------------- */
152
    /*      Check VirtualShape:xxx.shp syntax                               */
153
    /* -------------------------------------------------------------------- */
154
    const auto nLen = strlen(poOpenInfo->pszFilename);
388✔
155
    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "VirtualShape:") && nLen > 4 &&
388✔
156
        EQUAL(poOpenInfo->pszFilename + nLen - 4, ".SHP"))
1✔
157
    {
158
        auto poDS = std::make_unique<OGRSQLiteDataSource>();
2✔
159

160
        char **papszOptions = CSLAddString(nullptr, "SPATIALITE=YES");
1✔
161
        int nRet = poDS->Create(":memory:", papszOptions);
1✔
162
        poDS->SetDescription(poOpenInfo->pszFilename);
1✔
163
        CSLDestroy(papszOptions);
1✔
164
        if (!nRet)
1✔
165
        {
166
            return nullptr;
×
167
        }
168

169
        char *pszSQLiteFilename =
170
            CPLStrdup(poOpenInfo->pszFilename + strlen("VirtualShape:"));
1✔
171
        if (!std::unique_ptr<GDALDataset>(GDALDataset::Open(
2✔
172
                pszSQLiteFilename, GDAL_OF_VECTOR, nullptr, nullptr, nullptr)))
1✔
173
        {
174
            CPLFree(pszSQLiteFilename);
×
175
            return nullptr;
×
176
        }
177

178
        char *pszLastDot = strrchr(pszSQLiteFilename, '.');
1✔
179
        if (pszLastDot)
1✔
180
            *pszLastDot = '\0';
1✔
181

182
        const std::string osTableName = CPLGetBasenameSafe(pszSQLiteFilename);
2✔
183

184
        char *pszSQL = CPLStrdup(CPLSPrintf(
1✔
185
            "CREATE VIRTUAL TABLE %s USING VirtualShape(%s, CP1252, -1)",
186
            osTableName.c_str(), pszSQLiteFilename));
187
        poDS->ExecuteSQL(pszSQL, nullptr, nullptr);
1✔
188
        CPLFree(pszSQL);
1✔
189
        CPLFree(pszSQLiteFilename);
1✔
190
        poDS->DisableUpdate();
1✔
191
        return poDS.release();
1✔
192
    }
193

194
    /* -------------------------------------------------------------------- */
195
    /*      We think this is really an SQLite database, go ahead and try    */
196
    /*      and open it.                                                    */
197
    /* -------------------------------------------------------------------- */
198
    OGRSQLiteDataSource *poDS = new OGRSQLiteDataSource();
387✔
199

200
    if (!poDS->Open(poOpenInfo))
387✔
201
    {
202
        delete poDS;
4✔
203
        return nullptr;
4✔
204
    }
205
    else
206
        return poDS;
383✔
207
}
208

209
/************************************************************************/
210
/*                               Create()                               */
211
/************************************************************************/
212

213
static GDALDataset *OGRSQLiteDriverCreate(const char *pszName, int nBands,
241✔
214
                                          CPL_UNUSED int nXSize,
215
                                          CPL_UNUSED int nYSize,
216
                                          CPL_UNUSED GDALDataType eDT,
217
                                          char **papszOptions)
218
{
219
    if (nBands != 0)
241✔
220
    {
221
        CPLError(CE_Failure, CPLE_NotSupported,
×
222
                 "Raster creation through Create() interface is not supported. "
223
                 "Only CreateCopy() is supported");
224
        return nullptr;
×
225
    }
226

227
    /* -------------------------------------------------------------------- */
228
    /*      First, ensure there isn't any such file yet.                    */
229
    /* -------------------------------------------------------------------- */
230
    VSIStatBufL sStatBuf;
231

232
    if (VSIStatL(pszName, &sStatBuf) == 0)
241✔
233
    {
234
        CPLError(CE_Failure, CPLE_AppDefined,
×
235
                 "It seems a file system object called '%s' already exists.",
236
                 pszName);
237

238
        return nullptr;
×
239
    }
240

241
    /* -------------------------------------------------------------------- */
242
    /*      Try to create datasource.                                       */
243
    /* -------------------------------------------------------------------- */
244
    OGRSQLiteDataSource *poDS = new OGRSQLiteDataSource();
241✔
245

246
    if (!poDS->Create(pszName, papszOptions))
241✔
247
    {
248
        delete poDS;
2✔
249
        return nullptr;
2✔
250
    }
251

252
    return poDS;
239✔
253
}
254

255
/************************************************************************/
256
/*                             Delete()                                 */
257
/************************************************************************/
258

259
static CPLErr OGRSQLiteDriverDelete(const char *pszName)
86✔
260
{
261
    if (VSIUnlink(pszName) == 0)
86✔
262
        return CE_None;
64✔
263
    else
264
        return CE_Failure;
22✔
265
}
266

267
/************************************************************************/
268
/*                         RegisterOGRSQLite()                          */
269
/************************************************************************/
270

271
void RegisterOGRSQLite()
1,898✔
272

273
{
274
    if (!GDAL_CHECK_VERSION("SQLite driver"))
1,898✔
275
        return;
282✔
276

277
    if (GDALGetDriverByName("SQLite") != nullptr)
1,898✔
278
        return;
282✔
279

280
    GDALDriver *poDriver = new GDALDriver();
1,616✔
281

282
    poDriver->SetDescription("SQLite");
1,616✔
283
    poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
1,616✔
284
    poDriver->SetMetadataItem(GDAL_DCAP_CREATE_LAYER, "YES");
1,616✔
285
    poDriver->SetMetadataItem(GDAL_DCAP_DELETE_LAYER, "YES");
1,616✔
286
    poDriver->SetMetadataItem(GDAL_DCAP_CREATE_FIELD, "YES");
1,616✔
287
    poDriver->SetMetadataItem(GDAL_DCAP_DELETE_FIELD, "YES");
1,616✔
288
    poDriver->SetMetadataItem(GDAL_DCAP_REORDER_FIELDS, "YES");
1,616✔
289
    poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES");
1,616✔
290
    poDriver->SetMetadataItem(GDAL_DCAP_MEASURED_GEOMETRIES, "YES");
1,616✔
291
    poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES");
1,616✔
292
    poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "SQLITE OGRSQL");
1,616✔
293

294
#ifdef HAVE_RASTERLITE2
295
    poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
296
    poDriver->SetMetadataItem(GDAL_DMD_LONGNAME,
297
                              "SQLite / Spatialite / RasterLite2");
298
    poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES");
299
    poDriver->SetMetadataItem(GDAL_DCAP_CREATE_SUBDATASETS, "YES");
300
#else
301
    poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "SQLite / Spatialite");
1,616✔
302
#endif
303
    poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/sqlite.html");
1,616✔
304
    poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "sqlite db");
1,616✔
305

306
    poDriver->SetMetadataItem(
1,616✔
307
        GDAL_DMD_OPENOPTIONLIST,
308
        "<OpenOptionList>"
309
        "  <Option name='LIST_ALL_TABLES' type='boolean' description='Whether "
310
        "all tables, including non-spatial ones, should be listed' "
311
        "default='NO'/>"
312
        "  <Option name='LIST_VIRTUAL_OGR' type='boolean' description='Whether "
313
        "VirtualOGR virtual tables should be listed. Should only be enabled on "
314
        "trusted datasources to avoid potential safety issues' default='NO'/>"
315
        "  <Option name='PRELUDE_STATEMENTS' type='string' description='SQL "
316
        "statement(s) to send on the SQLite connection before any other ones'/>"
317
#ifdef HAVE_RASTERLITE2
318
        "  <Option name='1BIT_AS_8BIT' type='boolean' scope='raster' "
319
        "description='Whether to promote 1-bit monochrome raster as 8-bit, so "
320
        "as to have higher quality overviews' default='YES'/>"
321
#endif
322
        "  <Option name='OGR_SCHEMA' type='string' description='"
323
        "Partially or totally overrides the auto-detected schema to use for "
324
        "creating the layer. "
325
        "The overrides are defined as a JSON list of field definitions. "
326
        "This can be a filename or a JSON string or a URL.'/>"
327
        "</OpenOptionList>");
1,616✔
328

329
    CPLString osCreationOptions(
330
        "<CreationOptionList>"
331
#ifdef HAVE_SPATIALITE
332
        "  <Option name='SPATIALITE' type='boolean' description='Whether to "
333
        "create a Spatialite database' default='NO'/>"
334
#endif
335
        "  <Option name='METADATA' type='boolean' description='Whether to "
336
        "create the geometry_columns and spatial_ref_sys tables' "
337
        "default='YES'/>"
338
        "  <Option name='INIT_WITH_EPSG' type='boolean' description='Whether "
339
        "to insert the content of the EPSG CSV files into the spatial_ref_sys "
340
        "table ' default='NO'/>"
341
#ifdef HAVE_RASTERLITE2
342
        "  <Option name='APPEND_SUBDATASET' scope='raster' type='boolean' "
343
        "description='Whether to add the raster to the existing file' "
344
        "default='NO'/>"
345
        "  <Option name='COVERAGE' scope='raster' type='string' "
346
        "description='Coverage name'/>"
347
        "  <Option name='SECTION' scope='raster' type='string' "
348
        "description='Section name'/>"
349
        "  <Option name='COMPRESS' scope='raster' type='string-select' "
350
        "description='Raster compression' default='NONE'>"
351
        "    <Value>NONE</Value>"
352
#endif
353
    );
3,232✔
354
#ifdef HAVE_RASTERLITE2
355
    if (rl2_is_supported_codec(RL2_COMPRESSION_DEFLATE))
356
        osCreationOptions += "    <Value>DEFLATE</Value>";
357
    if (rl2_is_supported_codec(RL2_COMPRESSION_LZMA))
358
        osCreationOptions += "    <Value>LZMA</Value>";
359
    if (rl2_is_supported_codec(RL2_COMPRESSION_PNG))
360
        osCreationOptions += "    <Value>PNG</Value>";
361
    if (rl2_is_supported_codec(RL2_COMPRESSION_CCITTFAX4))
362
        osCreationOptions += "    <Value>CCITTFAX4</Value>";
363
    if (rl2_is_supported_codec(RL2_COMPRESSION_JPEG))
364
        osCreationOptions += "    <Value>JPEG</Value>";
365
    if (rl2_is_supported_codec(RL2_COMPRESSION_LOSSY_WEBP))
366
        osCreationOptions += "    <Value>WEBP</Value>";
367
    if (rl2_is_supported_codec(RL2_COMPRESSION_LOSSY_JP2))
368
        osCreationOptions += "    <Value>JPEG2000</Value>";
369
#endif
370
    osCreationOptions +=
371
#ifdef HAVE_RASTERLITE2
372
        "  </Option>"
373
        "  <Option name='QUALITY' scope='raster' type='int' description='Image "
374
        "quality for JPEG, WEBP and JPEG2000 compressions'/>"
375
        "  <Option name='PIXEL_TYPE' scope='raster' type='string-select' "
376
        "description='Raster pixel type. Determines photometric "
377
        "interpretation'>"
378
        "    <Value>MONOCHROME</Value>"
379
        "    <Value>PALETTE</Value>"
380
        "    <Value>GRAYSCALE</Value>"
381
        "    <Value>RGB</Value>"
382
        "    <Value>MULTIBAND</Value>"
383
        "    <Value>DATAGRID</Value>"
384
        "  </Option>"
385
        "  <Option name='BLOCKXSIZE' scope='raster' type='int' "
386
        "description='Block width' default='512'/>"
387
        "  <Option name='BLOCKYSIZE' scope='raster' type='int' "
388
        "description='Block height' default='512'/>"
389
        "  <Option name='NBITS' scope='raster' type='int' description='Force "
390
        "bit width. 1, 2 or 4 are supported'/>"
391
        "  <Option name='PYRAMIDIZE' scope='raster' type='boolean' "
392
        "description='Whether to automatically build relevant "
393
        "pyramids/overviews' default='NO'/>"
394
#endif
395
        "</CreationOptionList>";
1,616✔
396

397
    poDriver->SetMetadataItem(GDAL_DMD_CREATIONOPTIONLIST, osCreationOptions);
1,616✔
398

399
    poDriver->SetMetadataItem(
1,616✔
400
        GDAL_DS_LAYER_CREATIONOPTIONLIST,
401
        "<LayerCreationOptionList>"
402
        "  <Option name='FORMAT' type='string-select' description='Format of "
403
        "geometry columns'>"
404
        "    <Value>WKB</Value>"
405
        "    <Value>WKT</Value>"
406
#ifdef HAVE_SPATIALITE
407
        "    <Value>SPATIALITE</Value>"
408
#endif
409
        "  </Option>"
410
        "  <Option name='GEOMETRY_NAME' type='string' description='Name of "
411
        "geometry column. Defaults to WKT_GEOMETRY for FORMAT=WKT or GEOMETRY "
412
        "otherwise'/>"
413
        "  <Option name='LAUNDER' type='boolean' description='Whether layer "
414
        "and field names will be laundered' default='YES'/>"
415
#ifdef HAVE_SPATIALITE
416
        "  <Option name='SPATIAL_INDEX' type='boolean' description='Whether to "
417
        "create a spatial index for Spatialite databases' default='YES'/>"
418
        "  <Option name='COMPRESS_GEOM' type='boolean' description='Whether to "
419
        "use compressed format of Spatialite geometries' default='NO'/>"
420
#endif
421
        "  <Option name='SRID' type='int' description='Forced SRID of the "
422
        "layer'/>"
423
        "  <Option name='COMPRESS_COLUMNS' type='string' "
424
        "description='=column_name1[,column_name2, ...].  list of (String) "
425
        "columns that must be compressed with ZLib DEFLATE algorithm'/>"
426
        "  <Option name='OVERWRITE' type='boolean' description='Whether to "
427
        "overwrite an existing table with the layer name to be created' "
428
        "default='NO'/>"
429
        "  <Option name='FID' type='string' description='Name of the FID "
430
        "column to create' default='OGC_FID'/>"
431
#if SQLITE_VERSION_NUMBER >= 3037000
432
        "  <Option name='STRICT' type='boolean' description='Whether to create "
433
        "the table in STRICT mode (only compatible of readers with sqlite >= "
434
        "3.37)' default='NO'/>"
435
#endif
436
        "</LayerCreationOptionList>");
1,616✔
437

438
    poDriver->SetMetadataItem(GDAL_DMD_CREATIONFIELDDATATYPES,
1,616✔
439
                              "Integer Integer64 Real String Date DateTime "
440
                              "Time Binary IntegerList Integer64List "
441
                              "RealList StringList");
1,616✔
442
    poDriver->SetMetadataItem(GDAL_DMD_CREATIONFIELDDATASUBTYPES,
1,616✔
443
                              "Boolean Int16 Float32");
1,616✔
444
    poDriver->SetMetadataItem(GDAL_DMD_CREATION_FIELD_DEFN_FLAGS,
1,616✔
445
                              "WidthPrecision Nullable Default Unique");
1,616✔
446
    poDriver->SetMetadataItem(
1,616✔
447
        GDAL_DMD_ALTER_FIELD_DEFN_FLAGS,
448
        "Name Type WidthPrecision Nullable Default Unique");
1,616✔
449

450
#ifdef HAVE_RASTERLITE2
451
    poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES,
452
                              "Byte Int8 UInt16 Int16 UInt32 Int32 Float32 "
453
                              "Float64");
454
#endif
455
    poDriver->SetMetadataItem(GDAL_DCAP_NOTNULL_FIELDS, "YES");
1,616✔
456
    poDriver->SetMetadataItem(GDAL_DCAP_DEFAULT_FIELDS, "YES");
1,616✔
457
    poDriver->SetMetadataItem(GDAL_DCAP_UNIQUE_FIELDS, "YES");
1,616✔
458
    poDriver->SetMetadataItem(GDAL_DCAP_NOTNULL_GEOMFIELDS, "YES");
1,616✔
459
    poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
1,616✔
460
    poDriver->SetMetadataItem(GDAL_DCAP_MULTIPLE_VECTOR_LAYERS, "YES");
1,616✔
461
    poDriver->SetMetadataItem(GDAL_DCAP_RELATIONSHIPS, "YES");
1,616✔
462
    poDriver->SetMetadataItem(GDAL_DCAP_CREATE_RELATIONSHIP, "YES");
1,616✔
463
    poDriver->SetMetadataItem(GDAL_DMD_RELATIONSHIP_FLAGS,
1,616✔
464
                              "OneToMany Association Composite");
1,616✔
465
    poDriver->SetMetadataItem(GDAL_DMD_RELATIONSHIP_RELATED_TABLE_TYPES,
1,616✔
466
                              "features");
1,616✔
467

468
#ifdef ENABLE_SQL_SQLITE_FORMAT
469
    poDriver->SetMetadataItem("ENABLE_SQL_SQLITE_FORMAT", "YES");
1,616✔
470
#endif
471
#ifdef SQLITE_HAS_COLUMN_METADATA
472
    poDriver->SetMetadataItem("SQLITE_HAS_COLUMN_METADATA", "YES");
1,616✔
473
#endif
474

475
    poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES");
1,616✔
476
    poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, "Features");
1,616✔
477

478
    poDriver->pfnOpen = OGRSQLiteDriverOpen;
1,616✔
479
    poDriver->pfnIdentify = OGRSQLiteDriverIdentify;
1,616✔
480
    poDriver->pfnCreate = OGRSQLiteDriverCreate;
1,616✔
481
#ifdef HAVE_RASTERLITE2
482
    poDriver->pfnCreateCopy = OGRSQLiteDriverCreateCopy;
483
#endif
484
    poDriver->pfnDelete = OGRSQLiteDriverDelete;
1,616✔
485
    poDriver->pfnUnloadDriver = OGRSQLiteDriverUnload;
1,616✔
486

487
    GetGDALDriverManager()->RegisterDriver(poDriver);
1,616✔
488
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc