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 26 : 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 : ~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 0 : virtual const char *GetFIDColumn() override 85 : { 86 0 : return osFIDColName.c_str(); 87 : } 88 : 89 : virtual int TestCapability(const char *) override; 90 : 91 : GDALDataset *GetDataset() override; 92 : 93 132 : static int GetFeaturesToFetch() 94 : { 95 132 : return atoi(CPLGetConfigOption( 96 132 : "CARTO_PAGE_SIZE", CPLGetConfigOption("CARTODB_PAGE_SIZE", "500"))); 97 : } 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 8 : virtual const char *GetName() override 143 : { 144 8 : return osName.c_str(); 145 : } 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 4 : void SetLaunderFlag(bool bFlag) 178 : { 179 4 : bLaunderColumnNames = bFlag; 180 4 : } 181 : 182 : void SetDeferredCreation(OGRwkbGeometryType eGType, 183 : OGRSpatialReference *poSRS, bool bGeomNullable, 184 : bool bCartodbfy); 185 : OGRErr RunDeferredCreationIfNecessary(); 186 : 187 4 : bool GetDeferredCreation() const 188 : { 189 4 : return bDeferredCreation; 190 : } 191 : 192 4 : void CancelDeferredCreation() 193 : { 194 4 : bDeferredCreation = false; 195 4 : bCartodbfy = false; 196 4 : } 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 4 : void SetDropOnCreation(bool bFlag) 212 : { 213 4 : bDropOnCreation = bFlag; 214 4 : } 215 : 216 4 : bool GetDropOnCreation() const 217 : { 218 4 : return bDropOnCreation; 219 : } 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 5 : virtual int GetLayerCount() override 277 : { 278 5 : return nLayers; 279 : } 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 34 : bool IsReadWrite() const 298 : { 299 34 : return bReadWrite; 300 : } 301 : 302 22 : bool DoBatchInsert() const 303 : { 304 22 : return bBatchInsert; 305 : } 306 : 307 22 : bool DoCopyMode() const 308 : { 309 22 : return bCopyMode; 310 : } 311 : 312 : char **AddHTTPOptions(); 313 : json_object *RunSQL(const char *pszUnescapedSQL); 314 : json_object *RunCopyFrom(const char *pszSQL, const char *pszCopyFile); 315 : 316 16 : const CPLString &GetCurrentSchema() 317 : { 318 16 : return osCurrentSchema; 319 : } 320 : 321 : static int FetchSRSId(const OGRSpatialReference *poSRS); 322 : 323 45 : int IsAuthenticatedConnection() 324 : { 325 45 : return !osAPIKey.empty(); 326 : } 327 : 328 9 : int HasOGRMetadataFunction() 329 : { 330 9 : return bHasOGRMetadataFunction; 331 : } 332 : 333 3 : void SetOGRMetadataFunction(int bFlag) 334 : { 335 3 : bHasOGRMetadataFunction = bFlag; 336 3 : } 337 : 338 : OGRLayer *ExecuteSQLInternal(const char *pszSQLCommand, 339 : OGRGeometry *poSpatialFilter = nullptr, 340 : const char *pszDialect = nullptr, 341 : bool bRunDeferredActions = false); 342 : 343 7 : int GetPostGISMajor() const 344 : { 345 7 : return nPostGISMajor; 346 : } 347 : 348 7 : int GetPostGISMinor() const 349 : { 350 7 : return nPostGISMinor; 351 : } 352 : }; 353 : 354 : #endif /* ndef OGR_CARTO_H_INCLUDED */