OGRLayer * OGRCARTODBDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* Skip leading spaces */ while(*pszSQLCommand == ' ') pszSQLCommand ++; /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Special case DELLAYER: command. */ /* -------------------------------------------------------------------- */ if( EQUALN(pszSQLCommand,"DELLAYER:",9) ) { const char *pszLayerName = pszSQLCommand + 9; while( *pszLayerName == ' ' ) pszLayerName++; for( int iLayer = 0; iLayer < nLayers; iLayer++ ) { if( EQUAL(papoLayers[iLayer]->GetName(), pszLayerName )) { DeleteLayer( iLayer ); break; } } return NULL; } OGRCARTODBResultLayer* poLayer = new OGRCARTODBResultLayer( this, pszSQLCommand ); if( poSpatialFilter != NULL ) poLayer->SetSpatialFilter( poSpatialFilter ); CPLErrorReset(); poLayer->GetLayerDefn(); if( CPLGetLastErrorNo() != 0 ) { delete poLayer; return NULL; } return poLayer; }
OGRLayer * OGRCARTODBDataSource::ExecuteSQLInternal( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect, int bRunDeferedActions ) { if( bRunDeferedActions ) { for( int iLayer = 0; iLayer < nLayers; iLayer++ ) { papoLayers[iLayer]->RunDeferedCreationIfNecessary(); papoLayers[iLayer]->FlushDeferedInsert(); } } /* Skip leading spaces */ while(*pszSQLCommand == ' ') pszSQLCommand ++; /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Special case DELLAYER: command. */ /* -------------------------------------------------------------------- */ if( EQUALN(pszSQLCommand,"DELLAYER:",9) ) { const char *pszLayerName = pszSQLCommand + 9; while( *pszLayerName == ' ' ) pszLayerName++; for( int iLayer = 0; iLayer < nLayers; iLayer++ ) { if( EQUAL(papoLayers[iLayer]->GetName(), pszLayerName )) { DeleteLayer( iLayer ); break; } } return NULL; } if( !EQUALN(pszSQLCommand, "SELECT", strlen("SELECT")) && !EQUALN(pszSQLCommand, "EXPLAIN", strlen("EXPLAIN")) && !EQUALN(pszSQLCommand, "WITH", strlen("WITH")) ) { RunSQL(pszSQLCommand); return NULL; } OGRCARTODBResultLayer* poLayer = new OGRCARTODBResultLayer( this, pszSQLCommand ); if( poSpatialFilter != NULL ) poLayer->SetSpatialFilter( poSpatialFilter ); if( !poLayer->IsOK() ) { delete poLayer; return NULL; } return poLayer; }