LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/sqlite - ogr_sqlite.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 84 97 86.6 %
Date: 2024-11-25 13:07:18 Functions: 37 43 86.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * $Id$
       3             :  *
       4             :  * Project:  OpenGIS Simple Features Reference Implementation
       5             :  * Purpose:  Private definitions for OGR/SQLite driver.
       6             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2004, Frank Warmerdam <warmerdam@pobox.com>
      10             :  * Copyright (c) 2009-2014, Even Rouault <even dot rouault at spatialys.com>
      11             :  *
      12             :  * SPDX-License-Identifier: MIT
      13             :  ****************************************************************************/
      14             : 
      15             : #ifndef OGR_SQLITE_H_INCLUDED
      16             : #define OGR_SQLITE_H_INCLUDED
      17             : 
      18             : #include <cstddef>
      19             : #include <map>
      20             : #include <set>
      21             : #include <utility>
      22             : #include <vector>
      23             : 
      24             : #include "cpl_error.h"
      25             : #include "gdal_pam.h"
      26             : #include "ogrsf_frmts.h"
      27             : #include "ogrsf_frmts.h"
      28             : #include "rasterlite2_header.h"
      29             : 
      30             : #ifdef SPATIALITE_AMALGAMATION
      31             : /*
      32             : / using an AMALGAMATED version of SpatiaLite
      33             : / a private internal copy of SQLite is included:
      34             : / so we are required including the SpatiaLite's
      35             : / own header
      36             : /
      37             : / IMPORTANT NOTICE: using AMALAGATION is only
      38             : / useful on Windows (to skip DLL hell related oddities)
      39             : /
      40             : / You MUST NOT use AMALGAMATION on Linux or any
      41             : / other "sane" operating system !!!!
      42             : */
      43             : #include <spatialite/sqlite3.h>
      44             : #else
      45             : #include <sqlite3.h>
      46             : #endif
      47             : 
      48             : #define UNINITIALIZED_SRID -2
      49             : 
      50             : #if defined(DEBUG) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) ||     \
      51             :     defined(ALLOW_FORMAT_DUMPS)
      52             : // Enable accepting a SQL dump (starting with a "-- SQL SQLITE" or
      53             : // "-- SQL RASTERLITE" or "--SQL MBTILES" line) as a valid
      54             : // file. This makes fuzzer life easier
      55             : #define ENABLE_SQL_SQLITE_FORMAT
      56             : #endif
      57             : 
      58             : #include "ogrsqlitebase.h"
      59             : 
      60             : /************************************************************************/
      61             : /*      SpatiaLite's own Geometry type IDs.                             */
      62             : /************************************************************************/
      63             : 
      64             : enum OGRSpatialiteGeomType
      65             : {
      66             :     // 2D [XY]
      67             :     OGRSplitePointXY = 1,
      68             :     OGRSpliteLineStringXY = 2,
      69             :     OGRSplitePolygonXY = 3,
      70             :     OGRSpliteMultiPointXY = 4,
      71             :     OGRSpliteMultiLineStringXY = 5,
      72             :     OGRSpliteMultiPolygonXY = 6,
      73             :     OGRSpliteGeometryCollectionXY = 7,
      74             :     // 3D [XYZ]
      75             :     OGRSplitePointXYZ = 1001,
      76             :     OGRSpliteLineStringXYZ = 1002,
      77             :     OGRSplitePolygonXYZ = 1003,
      78             :     OGRSpliteMultiPointXYZ = 1004,
      79             :     OGRSpliteMultiLineStringXYZ = 1005,
      80             :     OGRSpliteMultiPolygonXYZ = 1006,
      81             :     OGRSpliteGeometryCollectionXYZ = 1007,
      82             :     // 2D with Measure [XYM]
      83             :     OGRSplitePointXYM = 2001,
      84             :     OGRSpliteLineStringXYM = 2002,
      85             :     OGRSplitePolygonXYM = 2003,
      86             :     OGRSpliteMultiPointXYM = 2004,
      87             :     OGRSpliteMultiLineStringXYM = 2005,
      88             :     OGRSpliteMultiPolygonXYM = 2006,
      89             :     OGRSpliteGeometryCollectionXYM = 2007,
      90             :     // 3D with Measure [XYZM]
      91             :     OGRSplitePointXYZM = 3001,
      92             :     OGRSpliteLineStringXYZM = 3002,
      93             :     OGRSplitePolygonXYZM = 3003,
      94             :     OGRSpliteMultiPointXYZM = 3004,
      95             :     OGRSpliteMultiLineStringXYZM = 3005,
      96             :     OGRSpliteMultiPolygonXYZM = 3006,
      97             :     OGRSpliteGeometryCollectionXYZM = 3007,
      98             :     // COMPRESSED: 2D [XY]
      99             :     OGRSpliteComprLineStringXY = 1000002,
     100             :     OGRSpliteComprPolygonXY = 1000003,
     101             :     OGRSpliteComprMultiPointXY = 1000004,
     102             :     OGRSpliteComprMultiLineStringXY = 1000005,
     103             :     OGRSpliteComprMultiPolygonXY = 1000006,
     104             :     OGRSpliteComprGeometryCollectionXY = 1000007,
     105             :     // COMPRESSED: 3D [XYZ]
     106             :     OGRSpliteComprLineStringXYZ = 1001002,
     107             :     OGRSpliteComprPolygonXYZ = 1001003,
     108             :     OGRSpliteComprMultiPointXYZ = 1001004,
     109             :     OGRSpliteComprMultiLineStringXYZ = 1001005,
     110             :     OGRSpliteComprMultiPolygonXYZ = 1001006,
     111             :     OGRSpliteComprGeometryCollectionXYZ = 1001007,
     112             :     // COMPRESSED: 2D with Measure [XYM]
     113             :     OGRSpliteComprLineStringXYM = 1002002,
     114             :     OGRSpliteComprPolygonXYM = 1002003,
     115             :     OGRSpliteComprMultiPointXYM = 1002004,
     116             :     OGRSpliteComprMultiLineStringXYM = 1002005,
     117             :     OGRSpliteComprMultiPolygonXYM = 1002006,
     118             :     OGRSpliteComprGeometryCollectionXYM = 1002007,
     119             :     // COMPRESSED: 3D with Measure [XYZM]
     120             :     OGRSpliteComprLineStringXYZM = 1003002,
     121             :     OGRSpliteComprPolygonXYZM = 1003003,
     122             :     OGRSpliteComprMultiPointXYZM = 1003004,
     123             :     OGRSpliteComprMultiLineStringXYZM = 1003005,
     124             :     OGRSpliteComprMultiPolygonXYZM = 1003006,
     125             :     OGRSpliteComprGeometryCollectionXYZM = 1003007
     126             : };
     127             : 
     128             : /************************************************************************/
     129             : /*                            OGRSQLiteLayer                            */
     130             : /************************************************************************/
     131             : 
     132             : class OGRSQLiteDataSource;
     133             : 
     134             : class OGRSQLiteLayer CPL_NON_FINAL : public OGRLayer,
     135             :                                      public IOGRSQLiteGetSpatialWhere
     136             : {
     137             :   private:
     138             :     static OGRErr
     139             :     createFromSpatialiteInternal(const GByte *pabyData, OGRGeometry **ppoReturn,
     140             :                                  int nBytes, OGRwkbByteOrder eByteOrder,
     141             :                                  int *pnBytesConsumed, int nRecLevel);
     142             : 
     143             :     static int CanBeCompressedSpatialiteGeometry(const OGRGeometry *poGeometry);
     144             : 
     145             :     static int ComputeSpatiaLiteGeometrySize(const OGRGeometry *poGeometry,
     146             :                                              bool bSpatialite2D,
     147             :                                              bool bUseComprGeom);
     148             : 
     149             :     static int GetSpatialiteGeometryCode(const OGRGeometry *poGeometry,
     150             :                                          bool bSpatialite2D, bool bUseComprGeom,
     151             :                                          bool bAcceptMultiGeom);
     152             : 
     153             :     static int ExportSpatiaLiteGeometryInternal(const OGRGeometry *poGeometry,
     154             :                                                 OGRwkbByteOrder eByteOrder,
     155             :                                                 bool bSpatialite2D,
     156             :                                                 bool bUseComprGeom,
     157             :                                                 GByte *pabyData);
     158             : 
     159             :     CPL_DISALLOW_COPY_ASSIGN(OGRSQLiteLayer)
     160             : 
     161             :   protected:
     162             :     OGRSQLiteFeatureDefn *m_poFeatureDefn = nullptr;
     163             : 
     164             :     GIntBig m_iNextShapeId = 0;
     165             : 
     166             :     sqlite3_stmt *m_hStmt = nullptr;
     167             :     bool m_bDoStep = true;
     168             :     bool m_bEOF = false;
     169             : 
     170             :     OGRSQLiteDataSource *m_poDS = nullptr;
     171             : 
     172             :     char *m_pszFIDColumn = nullptr;
     173             : 
     174             :     int *m_panFieldOrdinals = nullptr;
     175             :     int m_iFIDCol = -1;
     176             :     int m_iOGRNativeDataCol = -1;
     177             :     int m_iOGRNativeMediaTypeCol = -1;
     178             : 
     179             :     bool m_bIsVirtualShape = false;
     180             : 
     181             :     void BuildFeatureDefn(const char *pszLayerName, bool bIsSelect,
     182             :                           sqlite3_stmt *hStmt,
     183             :                           const std::set<CPLString> *paosGeomCols,
     184             :                           const std::set<CPLString> &aosIgnoredCols);
     185             : 
     186             :     void ClearStatement();
     187             :     virtual OGRErr ResetStatement() = 0;
     188             : 
     189             :     bool m_bUseComprGeom = false;
     190             : 
     191             :     char **m_papszCompressedColumns = nullptr;
     192             : 
     193             :     bool m_bAllowMultipleGeomFields = false;
     194             : 
     195             :     static CPLString FormatSpatialFilterFromRTree(
     196             :         OGRGeometry *poFilterGeom, const char *pszRowIDName,
     197             :         const char *pszEscapedTable, const char *pszEscapedGeomCol);
     198             : 
     199             :     static CPLString
     200             :     FormatSpatialFilterFromMBR(OGRGeometry *poFilterGeom,
     201             :                                const char *pszEscapedGeomColName);
     202             : 
     203             :     explicit OGRSQLiteLayer(OGRSQLiteDataSource *poDSIn);
     204             : 
     205             :   public:
     206             :     virtual ~OGRSQLiteLayer();
     207             : 
     208             :     void Finalize();
     209             : 
     210             :     GDALDataset *GetDataset() override;
     211             : 
     212             :     virtual void ResetReading() override;
     213             :     virtual OGRFeature *GetNextRawFeature();
     214             :     virtual OGRFeature *GetNextFeature() override;
     215             : 
     216             :     virtual OGRFeature *GetFeature(GIntBig nFeatureId) override;
     217             : 
     218        2136 :     virtual OGRFeatureDefn *GetLayerDefn() override
     219             :     {
     220        2136 :         return m_poFeatureDefn;
     221             :     }
     222             : 
     223          26 :     virtual OGRSQLiteFeatureDefn *myGetLayerDefn()
     224             :     {
     225          26 :         return m_poFeatureDefn;
     226             :     }
     227             : 
     228             :     virtual const char *GetFIDColumn() override;
     229             : 
     230             :     virtual int TestCapability(const char *) override;
     231             : 
     232             :     virtual OGRErr StartTransaction() override;
     233             :     virtual OGRErr CommitTransaction() override;
     234             :     virtual OGRErr RollbackTransaction() override;
     235             : 
     236           1 :     virtual void InvalidateCachedFeatureCountAndExtent()
     237             :     {
     238           1 :     }
     239             : 
     240          17 :     virtual bool IsTableLayer()
     241             :     {
     242          17 :         return false;
     243             :     }
     244             : 
     245           0 :     virtual bool HasSpatialIndex(CPL_UNUSED int iGeomField)
     246             :     {
     247           0 :         return false;
     248             :     }
     249             : 
     250           0 :     virtual bool HasFastSpatialFilter(CPL_UNUSED int iGeomCol) override
     251             :     {
     252           0 :         return false;
     253             :     }
     254             : 
     255             :     virtual CPLString
     256           0 :     GetSpatialWhere(CPL_UNUSED int iGeomCol,
     257             :                     CPL_UNUSED OGRGeometry *poFilterGeom) override
     258             :     {
     259           0 :         return "";
     260             :     }
     261             : 
     262             :     static OGRErr GetSpatialiteGeometryHeader(const GByte *pabyData, int nBytes,
     263             :                                               int *pnSRID,
     264             :                                               OGRwkbGeometryType *peType,
     265             :                                               bool *pbIsEmpty, double *pdfMinX,
     266             :                                               double *pdfMinY, double *pdfMaxX,
     267             :                                               double *pdfMaxY);
     268             :     static OGRErr ImportSpatiaLiteGeometry(const GByte *, int, OGRGeometry **);
     269             :     static OGRErr ImportSpatiaLiteGeometry(const GByte *, int, OGRGeometry **,
     270             :                                            int *pnSRID);
     271             :     static OGRErr ExportSpatiaLiteGeometry(const OGRGeometry *, GInt32,
     272             :                                            OGRwkbByteOrder, bool,
     273             :                                            bool bUseComprGeom, GByte **, int *);
     274             : };
     275             : 
     276             : /************************************************************************/
     277             : /*                         OGRSQLiteTableLayer                          */
     278             : /************************************************************************/
     279             : 
     280             : class OGRSQLiteTableLayer final : public OGRSQLiteLayer
     281             : {
     282             :     bool m_bIsTable = true;
     283             : 
     284             :     bool m_bLaunderColumnNames = true;
     285             :     bool m_bSpatialite2D = false;
     286             :     bool m_bStrict = false;
     287             : 
     288             :     CPLString m_osWHERE{};
     289             :     CPLString m_osQuery{};
     290             :     bool m_bDeferredSpatialIndexCreation = false;
     291             : 
     292             :     char *m_pszTableName = nullptr;
     293             :     char *m_pszEscapedTableName = nullptr;
     294             : 
     295             :     bool m_bLayerDefnError = false;
     296             : 
     297             :     sqlite3_stmt *m_hInsertStmt = nullptr;
     298             :     CPLString m_osLastInsertStmt{};
     299             : 
     300             :     bool m_bHasCheckedTriggers = false;
     301             :     bool m_bHasTriedDetectingFID64 = false;
     302             : 
     303             :     bool m_bStatisticsNeedsToBeFlushed = false;
     304             :     GIntBig m_nFeatureCount = -1; /* if -1, means not up-to-date */
     305             : 
     306             :     int m_bDeferredCreation = false;
     307             : 
     308             :     char *m_pszCreationGeomFormat = nullptr;
     309             :     int m_iFIDAsRegularColumnIndex = -1;
     310             : 
     311             :     void ClearInsertStmt();
     312             : 
     313             :     void BuildWhere();
     314             : 
     315             :     virtual OGRErr ResetStatement() override;
     316             : 
     317             :     OGRErr RecomputeOrdinals();
     318             : 
     319             :     void AddColumnDef(char *pszNewFieldList, size_t nBufLen,
     320             :                       OGRFieldDefn *poFldDefn);
     321             : 
     322             :     void InitFieldListForRecrerate(char *&pszNewFieldList,
     323             :                                    char *&pszFieldListForSelect,
     324             :                                    size_t &nBufLenOut, int nExtraSpace = 0);
     325             :     OGRErr RecreateTable(const char *pszFieldListForSelect,
     326             :                          const char *pszNewFieldList,
     327             :                          const char *pszGenericErrorMessage,
     328             :                          const char *pszAdditionalDef = nullptr);
     329             :     OGRErr BindValues(OGRFeature *poFeature, sqlite3_stmt *hStmt,
     330             :                       bool bBindUnsetAsNull);
     331             : 
     332             :     bool CheckSpatialIndexTable(int iGeomCol);
     333             : 
     334             :     CPLErr EstablishFeatureDefn(const char *pszGeomCol, bool bMayEmitError);
     335             : 
     336             :     void LoadStatistics();
     337             :     void LoadStatisticsSpatialite4DB();
     338             : 
     339             :     CPLString FieldDefnToSQliteFieldDefn(OGRFieldDefn *poFieldDefn);
     340             : 
     341             :     OGRErr RunAddGeometryColumn(const OGRSQLiteGeomFieldDefn *poGeomField,
     342             :                                 bool bAddColumnsForNonSpatialite);
     343             : 
     344             :     CPL_DISALLOW_COPY_ASSIGN(OGRSQLiteTableLayer)
     345             : 
     346             :   public:
     347             :     explicit OGRSQLiteTableLayer(OGRSQLiteDataSource *);
     348             :     virtual ~OGRSQLiteTableLayer();
     349             : 
     350             :     CPLErr Initialize(const char *pszTableName, bool bIsTable,
     351             :                       bool bIsVirtualShapeIn, bool bDeferredCreation,
     352             :                       bool bMayEmitError);
     353             :     void SetCreationParameters(const char *pszFIDColumnName,
     354             :                                OGRwkbGeometryType eGeomType,
     355             :                                const char *pszGeomFormat,
     356             :                                const char *pszGeometryName,
     357             :                                OGRSpatialReference *poSRS, int nSRSId);
     358             :     virtual const char *GetName() override;
     359             : 
     360             :     virtual GIntBig GetFeatureCount(int) override;
     361             :     virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
     362             :     virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
     363             :                              int bForce) override;
     364             : 
     365             :     virtual OGRFeatureDefn *GetLayerDefn() override;
     366             : 
     367        6034 :     bool HasLayerDefnError()
     368             :     {
     369        6034 :         GetLayerDefn();
     370        6034 :         return m_bLayerDefnError;
     371             :     }
     372             : 
     373             :     virtual void SetSpatialFilter(OGRGeometry *) override;
     374             :     virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override;
     375             :     virtual OGRErr SetAttributeFilter(const char *) override;
     376             :     virtual OGRErr ISetFeature(OGRFeature *poFeature) override;
     377             :     virtual OGRErr DeleteFeature(GIntBig nFID) override;
     378             :     virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
     379             : 
     380             :     virtual OGRErr CreateField(const OGRFieldDefn *poField,
     381             :                                int bApproxOK = TRUE) override;
     382             :     virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomFieldIn,
     383             :                                    int bApproxOK = TRUE) override;
     384             :     virtual OGRErr DeleteField(int iField) override;
     385             :     virtual OGRErr ReorderFields(int *panMap) override;
     386             :     virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
     387             :                                   int nFlags) override;
     388             :     OGRErr AddForeignKeysToTable(const char *pszKeys);
     389             : 
     390             :     virtual OGRFeature *GetNextFeature() override;
     391             :     virtual OGRFeature *GetFeature(GIntBig nFeatureId) override;
     392             : 
     393             :     virtual int TestCapability(const char *) override;
     394             : 
     395             :     virtual char **GetMetadata(const char *pszDomain = "") override;
     396             :     virtual const char *GetMetadataItem(const char *pszName,
     397             :                                         const char *pszDomain = "") override;
     398             : 
     399             :     // follow methods are not base class overrides
     400         384 :     void SetLaunderFlag(bool bFlag)
     401             :     {
     402         384 :         m_bLaunderColumnNames = bFlag;
     403         384 :     }
     404             : 
     405          47 :     void SetUseCompressGeom(bool bFlag)
     406             :     {
     407          47 :         m_bUseComprGeom = bFlag;
     408          47 :     }
     409             : 
     410         148 :     void SetDeferredSpatialIndexCreation(bool bFlag)
     411             :     {
     412         148 :         m_bDeferredSpatialIndexCreation = bFlag;
     413         148 :     }
     414             : 
     415             :     void SetCompressedColumns(const char *pszCompressedColumns);
     416             : 
     417         384 :     void SetStrictFlag(bool bFlag)
     418             :     {
     419         384 :         m_bStrict = bFlag;
     420         384 :     }
     421             : 
     422             :     int CreateSpatialIndex(int iGeomCol);
     423             : 
     424             :     void CreateSpatialIndexIfNecessary();
     425             : 
     426             :     void InitFeatureCount();
     427             :     bool DoStatisticsNeedToBeFlushed();
     428             :     void ForceStatisticsToBeFlushed();
     429             :     bool AreStatisticsValid();
     430             :     int SaveStatistics();
     431             : 
     432             :     virtual void InvalidateCachedFeatureCountAndExtent() override;
     433             : 
     434       13658 :     virtual bool IsTableLayer() override
     435             :     {
     436       13658 :         return true;
     437             :     }
     438             : 
     439             :     virtual bool HasSpatialIndex(int iGeomField) override;
     440             :     virtual bool HasFastSpatialFilter(int iGeomCol) override;
     441             :     virtual CPLString GetSpatialWhere(int iGeomCol,
     442             :                                       OGRGeometry *poFilterGeom) override;
     443             : 
     444             :     OGRErr RunDeferredCreationIfNecessary();
     445             : };
     446             : 
     447             : /************************************************************************/
     448             : /*                         OGRSQLiteViewLayer                           */
     449             : /************************************************************************/
     450             : 
     451             : class OGRSQLiteViewLayer final : public OGRSQLiteLayer
     452             : {
     453             :     CPLString m_osWHERE{};
     454             :     CPLString m_osQuery{};
     455             :     bool m_bHasCheckedSpatialIndexTable = false;
     456             : 
     457             :     OGRSQLiteGeomFormat m_eGeomFormat = OSGF_None;
     458             :     CPLString m_osGeomColumn{};
     459             :     bool m_bHasSpatialIndex = false;
     460             : 
     461             :     char *m_pszViewName = nullptr;
     462             :     char *m_pszEscapedTableName = nullptr;
     463             :     char *m_pszEscapedUnderlyingTableName = nullptr;
     464             : 
     465             :     bool m_bLayerDefnError = false;
     466             : 
     467             :     CPLString m_osUnderlyingTableName{};
     468             :     CPLString m_osUnderlyingGeometryColumn{};
     469             : 
     470             :     OGRSQLiteLayer *m_poUnderlyingLayer = nullptr;
     471             : 
     472             :     OGRSQLiteLayer *GetUnderlyingLayer();
     473             : 
     474             :     void BuildWhere();
     475             : 
     476             :     virtual OGRErr ResetStatement() override;
     477             : 
     478             :     CPLErr EstablishFeatureDefn();
     479             : 
     480             :     CPL_DISALLOW_COPY_ASSIGN(OGRSQLiteViewLayer)
     481             : 
     482             :   public:
     483             :     explicit OGRSQLiteViewLayer(OGRSQLiteDataSource *);
     484             :     virtual ~OGRSQLiteViewLayer();
     485             : 
     486          27 :     virtual const char *GetName() override
     487             :     {
     488          27 :         return m_pszViewName;
     489             :     }
     490             : 
     491             :     virtual OGRwkbGeometryType GetGeomType() override;
     492             : 
     493             :     CPLErr Initialize(const char *pszViewName, const char *pszViewGeometry,
     494             :                       const char *pszViewRowid, const char *pszTableName,
     495             :                       const char *pszGeometryColumn);
     496             : 
     497             :     virtual OGRFeatureDefn *GetLayerDefn() override;
     498             : 
     499          19 :     bool HasLayerDefnError()
     500             :     {
     501          19 :         GetLayerDefn();
     502          19 :         return m_bLayerDefnError;
     503             :     }
     504             : 
     505             :     virtual OGRFeature *GetNextFeature() override;
     506             :     virtual GIntBig GetFeatureCount(int) override;
     507             : 
     508             :     virtual void SetSpatialFilter(OGRGeometry *) override;
     509             : 
     510           0 :     virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override
     511             :     {
     512           0 :         OGRSQLiteLayer::SetSpatialFilter(iGeomField, poGeom);
     513           0 :     }
     514             : 
     515             :     virtual OGRErr SetAttributeFilter(const char *) override;
     516             : 
     517             :     virtual OGRFeature *GetFeature(GIntBig nFeatureId) override;
     518             : 
     519             :     virtual int TestCapability(const char *) override;
     520             : 
     521           0 :     virtual bool HasSpatialIndex(CPL_UNUSED int iGeomField) override
     522             :     {
     523           0 :         return m_bHasSpatialIndex;
     524             :     }
     525             : 
     526             :     virtual CPLString GetSpatialWhere(int iGeomCol,
     527             :                                       OGRGeometry *poFilterGeom) override;
     528             : };
     529             : 
     530             : /************************************************************************/
     531             : /*                         OGRSQLiteSelectLayer                         */
     532             : /************************************************************************/
     533             : 
     534             : class OGRSQLiteSelectLayer CPL_NON_FINAL : public OGRSQLiteLayer,
     535             :                                            public IOGRSQLiteSelectLayer
     536             : {
     537             :     OGRSQLiteSelectLayerCommonBehaviour *m_poBehavior = nullptr;
     538             :     bool m_bCanReopenBaseDS = false;
     539             : 
     540             :     virtual OGRErr ResetStatement() override;
     541             : 
     542             :     CPL_DISALLOW_COPY_ASSIGN(OGRSQLiteSelectLayer)
     543             : 
     544             :   public:
     545             :     OGRSQLiteSelectLayer(OGRSQLiteDataSource *, const CPLString &osSQL,
     546             :                          sqlite3_stmt *, bool bUseStatementForGetNextFeature,
     547             :                          bool bEmptyLayer, bool bAllowMultipleGeomFields,
     548             :                          bool bCanReopenBaseDS);
     549             :     virtual ~OGRSQLiteSelectLayer();
     550             : 
     551             :     virtual void ResetReading() override;
     552             : 
     553             :     virtual OGRFeature *GetNextFeature() override;
     554             :     virtual GIntBig GetFeatureCount(int) override;
     555             : 
     556         117 :     virtual void SetSpatialFilter(OGRGeometry *poGeom) override
     557             :     {
     558         117 :         SetSpatialFilter(0, poGeom);
     559         117 :     }
     560             : 
     561             :     virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override;
     562             :     virtual OGRErr SetAttributeFilter(const char *) override;
     563             : 
     564             :     virtual int TestCapability(const char *) override;
     565             : 
     566           2 :     virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override
     567             :     {
     568           2 :         return GetExtent(0, psExtent, bForce);
     569             :     }
     570             : 
     571             :     virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
     572             :                              int bForce = TRUE) override;
     573             : 
     574        2136 :     virtual OGRFeatureDefn *GetLayerDefn() override
     575             :     {
     576        2136 :         return OGRSQLiteLayer::GetLayerDefn();
     577             :     }
     578             : 
     579         725 :     virtual char *&GetAttrQueryString() override
     580             :     {
     581         725 :         return m_pszAttrQueryString;
     582             :     }
     583             : 
     584         279 :     virtual OGRFeatureQuery *&GetFeatureQuery() override
     585             :     {
     586         279 :         return m_poAttrQuery;
     587             :     }
     588             : 
     589         532 :     virtual OGRGeometry *&GetFilterGeom() override
     590             :     {
     591         532 :         return m_poFilterGeom;
     592             :     }
     593             : 
     594         270 :     virtual int &GetIGeomFieldFilter() override
     595             :     {
     596         270 :         return m_iGeomFieldFilter;
     597             :     }
     598             : 
     599         348 :     virtual OGRSpatialReference *GetSpatialRef() override
     600             :     {
     601         348 :         return OGRSQLiteLayer::GetSpatialRef();
     602             :     }
     603             : 
     604         163 :     virtual int InstallFilter(OGRGeometry *poGeomIn) override
     605             :     {
     606         163 :         return OGRSQLiteLayer::InstallFilter(poGeomIn);
     607             :     }
     608             : 
     609         627 :     virtual int HasReadFeature() override
     610             :     {
     611         627 :         return m_iNextShapeId > 0;
     612             :     }
     613             : 
     614         402 :     virtual void BaseResetReading() override
     615             :     {
     616         402 :         OGRSQLiteLayer::ResetReading();
     617         402 :     }
     618             : 
     619        3186 :     virtual OGRFeature *BaseGetNextFeature() override
     620             :     {
     621        3186 :         return OGRSQLiteLayer::GetNextFeature();
     622             :     }
     623             : 
     624           2 :     virtual OGRErr BaseSetAttributeFilter(const char *pszQuery) override
     625             :     {
     626           2 :         return OGRSQLiteLayer::SetAttributeFilter(pszQuery);
     627             :     }
     628             : 
     629          47 :     virtual GIntBig BaseGetFeatureCount(int bForce) override
     630             :     {
     631          47 :         return OGRSQLiteLayer::GetFeatureCount(bForce);
     632             :     }
     633             : 
     634          50 :     virtual int BaseTestCapability(const char *pszCap) override
     635             :     {
     636          50 :         return OGRSQLiteLayer::TestCapability(pszCap);
     637             :     }
     638             : 
     639           5 :     virtual OGRErr BaseGetExtent(OGREnvelope *psExtent, int bForce) override
     640             :     {
     641           5 :         return OGRSQLiteLayer::GetExtent(psExtent, bForce);
     642             :     }
     643             : 
     644           0 :     virtual OGRErr BaseGetExtent(int iGeomField, OGREnvelope *psExtent,
     645             :                                  int bForce) override
     646             :     {
     647           0 :         return OGRSQLiteLayer::GetExtent(iGeomField, psExtent, bForce);
     648             :     }
     649             : 
     650             :     bool
     651         171 :     ValidateGeometryFieldIndexForSetSpatialFilter(int iGeomField,
     652             :                                                   const OGRGeometry *poGeomIn,
     653             :                                                   bool bIsSelectLayer) override
     654             :     {
     655         171 :         return OGRSQLiteLayer::ValidateGeometryFieldIndexForSetSpatialFilter(
     656         171 :             iGeomField, poGeomIn, bIsSelectLayer);
     657             :     }
     658             : };
     659             : 
     660             : /************************************************************************/
     661             : /*                         OGRSQLiteDataSource                          */
     662             : /************************************************************************/
     663             : 
     664             : class OGR2SQLITEModule;
     665             : 
     666             : class OGRSQLiteDataSource final : public OGRSQLiteBaseDataSource
     667             : {
     668             :     std::vector<std::unique_ptr<OGRSQLiteLayer>> m_apoLayers{};
     669             : 
     670             :     // We maintain a list of known SRID to reduce the number of trips to
     671             :     // the database to get SRSes.
     672             :     std::map<int,
     673             :              std::unique_ptr<OGRSpatialReference, OGRSpatialReferenceReleaser>>
     674             :         m_oSRSCache{};
     675             : 
     676             :     OGRSpatialReference *AddSRIDToCache(
     677             :         int nId,
     678             :         std::unique_ptr<OGRSpatialReference, OGRSpatialReferenceReleaser>
     679             :             &&poSRS);
     680             : 
     681             :     bool m_bHaveGeometryColumns = false;
     682             :     bool m_bIsSpatiaLiteDB = false;
     683             :     bool m_bSpatialite4Layout = false;
     684             : 
     685             :     int m_nUndefinedSRID = -1;
     686             : 
     687             :     virtual void DeleteLayer(const char *pszLayer);
     688             : 
     689             :     const char *GetSRTEXTColName();
     690             : 
     691             :     bool InitWithEPSG();
     692             : 
     693             :     bool OpenVirtualTable(const char *pszName, const char *pszSQL);
     694             : 
     695             :     GIntBig m_nFileTimestamp = 0;
     696             :     bool m_bLastSQLCommandIsUpdateLayerStatistics = false;
     697             : 
     698             :     std::map<CPLString, std::set<CPLString>> m_aoMapTableToSetOfGeomCols{};
     699             : 
     700             :     void SaveStatistics();
     701             : 
     702             :     std::vector<std::unique_ptr<OGRLayer>> m_apoInvisibleLayers{};
     703             : 
     704             : #ifdef HAVE_RASTERLITE2
     705             :     void *m_hRL2Ctxt = nullptr;
     706             :     bool InitRasterLite2();
     707             :     void FinishRasterLite2();
     708             : 
     709             :     CPLString m_osCoverageName{};
     710             :     GIntBig m_nSectionId = -1;
     711             :     rl2CoveragePtr m_pRL2Coverage = nullptr;
     712             :     bool m_bRL2MixedResolutions = false;
     713             : #endif
     714             :     CPLStringList m_aosSubDatasets{};
     715             :     bool m_bGeoTransformValid = false;
     716             :     double m_adfGeoTransform[6];
     717             :     OGRSpatialReference m_oSRS{};
     718             :     bool m_bPromote1BitAs8Bit = false;
     719             :     bool OpenRaster();
     720             :     bool OpenRasterSubDataset(const char *pszConnectionId);
     721             :     OGRSQLiteDataSource *m_poParentDS = nullptr;
     722             :     std::vector<OGRSQLiteDataSource *> m_apoOverviewDS{};
     723             : 
     724             :     OGR2SQLITEModule *m_poSQLiteModule = nullptr;
     725             : 
     726             : #ifdef HAVE_RASTERLITE2
     727             :     void ListOverviews();
     728             :     void CreateRL2OverviewDatasetIfNeeded(double dfXRes, double dfYRes);
     729             : #endif
     730             : 
     731             :     bool OpenOrCreateDB(int flags, bool bRegisterOGR2SQLiteExtensions);
     732             : 
     733             :     CPLErr Close() override;
     734             : 
     735             :     void PostInitSpatialite();
     736             : 
     737             :     CPL_DISALLOW_COPY_ASSIGN(OGRSQLiteDataSource)
     738             : 
     739             :   public:
     740             :     OGRSQLiteDataSource();
     741             :     virtual ~OGRSQLiteDataSource();
     742             : 
     743             :     bool Open(GDALOpenInfo *poOpenInfo);
     744             :     bool Create(const char *, char **papszOptions);
     745             : 
     746             :     bool OpenTable(const char *pszTableName, bool IsTable, bool bIsVirtualShape,
     747             :                    bool bMayEmitError);
     748             :     bool OpenView(const char *pszViewName, const char *pszViewGeometry,
     749             :                   const char *pszViewRowid, const char *pszTableName,
     750             :                   const char *pszGeometryColumn);
     751             : 
     752       19376 :     virtual int GetLayerCount() override
     753             :     {
     754       19376 :         return static_cast<int>(m_apoLayers.size());
     755             :     }
     756             : 
     757             :     virtual OGRLayer *GetLayer(int) override;
     758             :     virtual OGRLayer *GetLayerByName(const char *) override;
     759             :     virtual bool IsLayerPrivate(int) const override;
     760             :     OGRLayer *GetLayerByNameNotVisible(const char *);
     761             :     virtual std::pair<OGRLayer *, IOGRSQLiteGetSpatialWhere *>
     762             :     GetLayerWithGetSpatialWhereByName(const char *pszName) override;
     763             : 
     764             :     virtual OGRLayer *ICreateLayer(const char *pszName,
     765             :                                    const OGRGeomFieldDefn *poGeomFieldDefn,
     766             :                                    CSLConstList papszOptions) override;
     767             :     virtual OGRErr DeleteLayer(int) override;
     768             : 
     769             :     virtual int TestCapability(const char *) override;
     770             : 
     771             :     virtual OGRLayer *ExecuteSQL(const char *pszSQLCommand,
     772             :                                  OGRGeometry *poSpatialFilter,
     773             :                                  const char *pszDialect) override;
     774             :     virtual void ReleaseResultSet(OGRLayer *poLayer) override;
     775             : 
     776             :     virtual CPLErr FlushCache(bool bAtClosing) override;
     777             : 
     778             :     virtual OGRErr StartTransaction(int bForce = FALSE) override;
     779             :     virtual OGRErr CommitTransaction() override;
     780             :     virtual OGRErr RollbackTransaction() override;
     781             : 
     782             :     virtual char **GetMetadata(const char *pszDomain = "") override;
     783             : 
     784             :     virtual CPLErr GetGeoTransform(double *padfGeoTransform) override;
     785             :     const OGRSpatialReference *GetSpatialRef() const override;
     786             : 
     787             :     static char *LaunderName(const char *);
     788             :     int FetchSRSId(const OGRSpatialReference *poSRS);
     789             :     OGRSpatialReference *FetchSRS(int nSRID);
     790             : 
     791           1 :     void DisableUpdate()
     792             :     {
     793           1 :         eAccess = GA_ReadOnly;
     794           1 :     }
     795             : 
     796             :     void SetName(const char *pszNameIn);
     797             : 
     798         751 :     const std::set<CPLString> &GetGeomColsForTable(const char *pszTableName)
     799             :     {
     800         751 :         return m_aoMapTableToSetOfGeomCols[pszTableName];
     801             :     }
     802             : 
     803          10 :     GIntBig GetFileTimestamp() const
     804             :     {
     805          10 :         return m_nFileTimestamp;
     806             :     }
     807             : 
     808        3652 :     bool IsSpatialiteDB() const
     809             :     {
     810        3652 :         return m_bIsSpatiaLiteDB;
     811             :     }
     812             : 
     813        3238 :     bool HasSpatialite4Layout() const
     814             :     {
     815        3238 :         return m_bSpatialite4Layout;
     816             :     }
     817             : 
     818         860 :     int GetUndefinedSRID() const
     819             :     {
     820         860 :         return m_nUndefinedSRID;
     821             :     }
     822             : 
     823         384 :     bool HasGeometryColumns() const
     824             :     {
     825         384 :         return m_bHaveGeometryColumns;
     826             :     }
     827             : 
     828             :     bool AddRelationship(std::unique_ptr<GDALRelationship> &&relationship,
     829             :                          std::string &failureReason) override;
     830             :     bool ValidateRelationship(const GDALRelationship *poRelationship,
     831             :                               std::string &failureReason);
     832             : 
     833             :     void ReloadLayers();
     834             : 
     835             : #ifdef HAVE_RASTERLITE2
     836             :     void *GetRL2Context() const
     837             :     {
     838             :         return m_hRL2Ctxt;
     839             :     }
     840             : 
     841             :     rl2CoveragePtr GetRL2CoveragePtr() const
     842             :     {
     843             :         return m_pRL2Coverage;
     844             :     }
     845             : 
     846             :     GIntBig GetSectionId() const
     847             :     {
     848             :         return m_nSectionId;
     849             :     }
     850             : 
     851             :     const double *GetGeoTransform() const
     852             :     {
     853             :         return m_adfGeoTransform;
     854             :     }
     855             : 
     856             :     bool IsRL2MixedResolutions() const
     857             :     {
     858             :         return m_bRL2MixedResolutions;
     859             :     }
     860             : 
     861             :     virtual CPLErr IBuildOverviews(const char *, int, const int *, int,
     862             :                                    const int *, GDALProgressFunc, void *,
     863             :                                    CSLConstList papszOptions) override;
     864             : 
     865             : #endif
     866             :     OGRSQLiteDataSource *GetParentDS() const
     867             :     {
     868             :         return m_poParentDS;
     869             :     }
     870             : 
     871             :     const std::vector<OGRSQLiteDataSource *> &GetOverviews() const
     872             :     {
     873             :         return m_apoOverviewDS;
     874             :     }
     875             : 
     876             :     bool HasPromote1BitAS8Bit() const
     877             :     {
     878             :         return m_bPromote1BitAs8Bit;
     879             :     }
     880             : };
     881             : 
     882             : #ifdef HAVE_RASTERLITE2
     883             : /************************************************************************/
     884             : /*                           RL2RasterBand                              */
     885             : /************************************************************************/
     886             : 
     887             : class RL2RasterBand final : public GDALPamRasterBand
     888             : {
     889             :     bool m_bHasNoData = false;
     890             :     double m_dfNoDataValue = 0;
     891             :     GDALColorInterp m_eColorInterp = GCI_Undefined;
     892             :     GDALColorTable *m_poCT = nullptr;
     893             : 
     894             :     CPL_DISALLOW_COPY_ASSIGN(RL2RasterBand)
     895             : 
     896             :   public:
     897             :     RL2RasterBand(int nBandIn, int nPixelType, GDALDataType eDT, int nBits,
     898             :                   bool bPromote1BitAs8Bit, int nBlockXSizeIn, int nBlockYSizeIn,
     899             :                   bool bHasNoDataIn, double dfNoDataValueIn);
     900             :     explicit RL2RasterBand(const RL2RasterBand *poOther);
     901             : 
     902             :     virtual ~RL2RasterBand();
     903             : 
     904             :   protected:
     905             :     virtual CPLErr IReadBlock(int, int, void *) override;
     906             : 
     907             :     virtual GDALColorInterp GetColorInterpretation() override
     908             :     {
     909             :         return m_eColorInterp;
     910             :     }
     911             : 
     912             :     virtual double GetNoDataValue(int *pbSuccess = nullptr) override;
     913             :     virtual GDALColorTable *GetColorTable() override;
     914             :     virtual int GetOverviewCount() override;
     915             :     virtual GDALRasterBand *GetOverview(int) override;
     916             : };
     917             : #endif  // HAVE_RASTERLITE2
     918             : 
     919             : CPLString OGRSQLiteFieldDefnToSQliteFieldDefn(OGRFieldDefn *poFieldDefn,
     920             :                                               bool bSQLiteDialectInternalUse,
     921             :                                               bool bStrict);
     922             : 
     923             : void OGRSQLiteRegisterInflateDeflate(sqlite3 *hDB);
     924             : 
     925             : void OGRSQLiteDriverUnload(GDALDriver *);
     926             : 
     927             : #ifdef HAVE_RASTERLITE2
     928             : GDALDataset *OGRSQLiteDriverCreateCopy(const char *, GDALDataset *, int,
     929             :                                        char **, GDALProgressFunc pfnProgress,
     930             :                                        void *pProgressData);
     931             : #endif
     932             : 
     933             : #endif /* ndef OGR_SQLITE_H_INCLUDED */

Generated by: LCOV version 1.14