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