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 * OGRWalkDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Execute normal SQL statement in Walk. */ /* Table_name = Layer_name + Postfix */ /* Postfix: "Features", "Annotations" or "Styles" */ /* -------------------------------------------------------------------- */ CPLODBCStatement *poStmt = new CPLODBCStatement( &oSession ); CPLDebug( "Walk", "ExecuteSQL(%s) called.", pszSQLCommand ); poStmt->Append( pszSQLCommand ); if( !poStmt->ExecuteSQL() ) { CPLError( CE_Failure, CPLE_AppDefined, "%s", oSession.GetLastError() ); delete poStmt; return NULL; } /* -------------------------------------------------------------------- */ /* Are there result columns for this statement? */ /* -------------------------------------------------------------------- */ if( poStmt->GetColCount() == 0 ) { delete poStmt; CPLErrorReset(); return NULL; } /* -------------------------------------------------------------------- */ /* Create a results layer. It will take ownership of the */ /* statement. */ /* -------------------------------------------------------------------- */ OGRWalkSelectLayer *poLayer = NULL; poLayer = new OGRWalkSelectLayer( this, poStmt ); if( poSpatialFilter != NULL ) poLayer->SetSpatialFilter( poSpatialFilter ); return poLayer; }
OGRLayer * OGRODBCDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Execute statement. */ /* -------------------------------------------------------------------- */ CPLODBCStatement *poStmt = new CPLODBCStatement( &oSession ); CPLDebug( "ODBC", "ExecuteSQL(%s) called.", pszSQLCommand ); poStmt->Append( pszSQLCommand ); if( !poStmt->ExecuteSQL() ) { CPLError( CE_Failure, CPLE_AppDefined, "%s", oSession.GetLastError() ); delete poStmt; return nullptr; } /* -------------------------------------------------------------------- */ /* Are there result columns for this statement? */ /* -------------------------------------------------------------------- */ if( poStmt->GetColCount() == 0 ) { delete poStmt; CPLErrorReset(); return nullptr; } /* -------------------------------------------------------------------- */ /* Create a results layer. It will take ownership of the */ /* statement. */ /* -------------------------------------------------------------------- */ OGRODBCSelectLayer* poLayer = new OGRODBCSelectLayer( this, poStmt ); if( poSpatialFilter != nullptr ) poLayer->SetSpatialFilter( poSpatialFilter ); return poLayer; }
OGRLayer * OGRGFTDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* 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++; DeleteLayer( pszLayerName ); return NULL; } /* -------------------------------------------------------------------- */ /* Create layer. */ /* -------------------------------------------------------------------- */ OGRGFTResultLayer *poLayer = NULL; CPLString osSQL = pszSQLCommand; poLayer = new OGRGFTResultLayer( this, osSQL ); if (!poLayer->RunSQL()) { delete poLayer; return NULL; } if( poSpatialFilter != NULL ) poLayer->SetSpatialFilter( poSpatialFilter ); return poLayer; }
OGRLayer * OGRIngresDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); if( poSpatialFilter != NULL ) { CPLDebug( "OGR_INGRES", "Spatial filter ignored for now in OGRIngresDataSource::ExecuteSQL()" ); } /* -------------------------------------------------------------------- */ /* Execute the statement. */ /* -------------------------------------------------------------------- */ EstablishActiveLayer( NULL ); OGRIngresStatement *poStatement = new OGRIngresStatement( hConn ); if( !poStatement->ExecuteSQL( pszSQLCommand ) ) { delete poStatement; return NULL; } /* -------------------------------------------------------------------- */ /* Do we have a tuple result? If so, instantiate a results */ /* layer for it. */ /* -------------------------------------------------------------------- */ OGRIngresResultLayer *poLayer = NULL; poLayer = new OGRIngresResultLayer( this, pszSQLCommand, poStatement ); EstablishActiveLayer( poLayer ); return poLayer; }
OGRLayer * OGRCouchDBDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Special case DELLAYER: command. */ /* -------------------------------------------------------------------- */ if( STARTS_WITH_CI(pszSQLCommand, "DELLAYER:") ) { const char *pszLayerName = pszSQLCommand + 9; while( *pszLayerName == ' ' ) pszLayerName++; DeleteLayer( pszLayerName ); return NULL; } /* -------------------------------------------------------------------- */ /* Special case 'COMPACT ON ' command. */ /* -------------------------------------------------------------------- */ if( STARTS_WITH_CI(pszSQLCommand, "COMPACT ON ") ) { const char *pszLayerName = pszSQLCommand + 11; while( *pszLayerName == ' ' ) pszLayerName++; CPLString osURI("/"); osURI += pszLayerName; osURI += "/_compact"; json_object* poAnswerObj = POST(osURI, NULL); IsError(poAnswerObj, "Database compaction failed"); json_object_put(poAnswerObj); return NULL; } /* -------------------------------------------------------------------- */ /* Special case 'VIEW CLEANUP ON ' command. */ /* -------------------------------------------------------------------- */ if( STARTS_WITH_CI(pszSQLCommand, "VIEW CLEANUP ON ") ) { const char *pszLayerName = pszSQLCommand + 16; while( *pszLayerName == ' ' ) pszLayerName++; CPLString osURI("/"); osURI += pszLayerName; osURI += "/_view_cleanup"; json_object* poAnswerObj = POST(osURI, NULL); IsError(poAnswerObj, "View cleanup failed"); json_object_put(poAnswerObj); return NULL; } /* -------------------------------------------------------------------- */ /* Deal with "DELETE FROM layer_name WHERE expression" statement */ /* -------------------------------------------------------------------- */ if( STARTS_WITH_CI(pszSQLCommand, "DELETE FROM ") ) { const char* pszIter = pszSQLCommand + 12; while(*pszIter && *pszIter != ' ') pszIter ++; if (*pszIter == 0) { CPLError(CE_Failure, CPLE_AppDefined, "Invalid statement"); return NULL; } CPLString osName = pszSQLCommand + 12; osName.resize(pszIter - (pszSQLCommand + 12)); OGRCouchDBLayer* poLayer = (OGRCouchDBLayer*)GetLayerByName(osName); if (poLayer == NULL) { CPLError(CE_Failure, CPLE_AppDefined, "Unknown layer : %s", osName.c_str()); return NULL; } if (poLayer->GetLayerType() != COUCHDB_TABLE_LAYER) return NULL; OGRCouchDBTableLayer* poTableLayer = (OGRCouchDBTableLayer*)poLayer; while( *pszIter == ' ' ) pszIter ++; if (!STARTS_WITH_CI(pszIter, "WHERE ")) { CPLError(CE_Failure, CPLE_AppDefined, "WHERE clause missing"); return NULL; } pszIter += 5; const char* pszQuery = pszIter; /* Check with the generic SQL engine that this is a valid WHERE clause */ OGRFeatureQuery oQuery; OGRErr eErr = oQuery.Compile( poLayer->GetLayerDefn(), pszQuery ); if( eErr != OGRERR_NONE ) { return NULL; } swq_expr_node * pNode = (swq_expr_node *) oQuery.GetSWQExpr(); if (pNode->eNodeType == SNT_OPERATION && pNode->nOperation == SWQ_EQ && pNode->nSubExprCount == 2 && pNode->papoSubExpr[0]->eNodeType == SNT_COLUMN && pNode->papoSubExpr[1]->eNodeType == SNT_CONSTANT && pNode->papoSubExpr[0]->field_index == COUCHDB_ID_FIELD && pNode->papoSubExpr[1]->field_type == SWQ_STRING) { poTableLayer->DeleteFeature(pNode->papoSubExpr[1]->string_value); } else { CPLError(CE_Failure, CPLE_AppDefined, "Invalid WHERE clause. Expecting '_id' = 'a_value'"); return NULL; } return NULL; } /* -------------------------------------------------------------------- */ /* Try an optimized implementation when doing only stats */ /* -------------------------------------------------------------------- */ if (poSpatialFilter == NULL && STARTS_WITH_CI(pszSQLCommand, "SELECT")) { OGRLayer* poRet = ExecuteSQLStats(pszSQLCommand); if (poRet) return poRet; } return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); }
OGRLayer * OGROCIDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Ensure any pending stuff is flushed to the database. */ /* -------------------------------------------------------------------- */ FlushCache(); CPLDebug( "OCI", "ExecuteSQL(%s)", pszSQLCommand ); /* -------------------------------------------------------------------- */ /* Special case DELLAYER: command. */ /* -------------------------------------------------------------------- */ if( STARTS_WITH_CI(pszSQLCommand, "DELLAYER:") ) { const char *pszLayerName = pszSQLCommand + 9; while( *pszLayerName == ' ' ) pszLayerName++; DeleteLayer( pszLayerName ); return NULL; } /* -------------------------------------------------------------------- */ /* Special case VALLAYER: command. */ /* -------------------------------------------------------------------- */ if( STARTS_WITH_CI(pszSQLCommand, "VALLAYER:") ) { const char *pszLayerName = pszSQLCommand + 9; while( *pszLayerName == ' ' ) pszLayerName++; ValidateLayer( pszLayerName ); return NULL; } /* -------------------------------------------------------------------- */ /* Just execute simple command. */ /* -------------------------------------------------------------------- */ if( !STARTS_WITH_CI(pszSQLCommand, "SELECT") ) { OGROCIStatement oCommand( poSession ); oCommand.Execute( pszSQLCommand, OCI_COMMIT_ON_SUCCESS ); return NULL; } /* -------------------------------------------------------------------- */ /* Otherwise instantiate a layer. */ /* -------------------------------------------------------------------- */ else { OGROCIStatement oCommand( poSession ); if( oCommand.Execute( pszSQLCommand, OCI_DESCRIBE_ONLY ) == CE_None ) return new OGROCISelectLayer( this, pszSQLCommand, &oCommand ); else return NULL; } }
OGRLayer * OGRMSSQLSpatialDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* 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++; OGRLayer* poLayer = GetLayerByName(pszLayerName); for( int iLayer = 0; iLayer < nLayers; iLayer++ ) { if( papoLayers[iLayer] == poLayer ) { DeleteLayer( iLayer ); break; } } return NULL; } CPLDebug( "MSSQLSpatial", "ExecuteSQL(%s) called.", pszSQLCommand ); if( EQUALN(pszSQLCommand, "DROP SPATIAL INDEX ON ", 22) ) { /* Handle command to drop a spatial index. */ OGRMSSQLSpatialTableLayer *poLayer = new OGRMSSQLSpatialTableLayer( this ); if (poLayer) { if( poLayer->Initialize( "dbo", pszSQLCommand + 22, NULL, 0, 0, NULL, wkbUnknown ) != CE_None ) { CPLError( CE_Failure, CPLE_AppDefined, "Failed to initialize layer '%s'", pszSQLCommand + 22 ); } poLayer->DropSpatialIndex(); delete poLayer; } return NULL; } else if( EQUALN(pszSQLCommand, "CREATE SPATIAL INDEX ON ", 24) ) { /* Handle command to create a spatial index. */ OGRMSSQLSpatialTableLayer *poLayer = new OGRMSSQLSpatialTableLayer( this ); if (poLayer) { if( poLayer->Initialize( "dbo", pszSQLCommand + 24, NULL, 0, 0, NULL, wkbUnknown ) != CE_None ) { CPLError( CE_Failure, CPLE_AppDefined, "Failed to initialize layer '%s'", pszSQLCommand + 24 ); } poLayer->CreateSpatialIndex(); delete poLayer; } return NULL; } /* Execute the command natively */ CPLODBCStatement *poStmt = new CPLODBCStatement( &oSession ); poStmt->Append( pszSQLCommand ); if( !poStmt->ExecuteSQL() ) { CPLError( CE_Failure, CPLE_AppDefined, "%s", oSession.GetLastError() ); delete poStmt; return NULL; } /* -------------------------------------------------------------------- */ /* Are there result columns for this statement? */ /* -------------------------------------------------------------------- */ if( poStmt->GetColCount() == 0 ) { delete poStmt; CPLErrorReset(); return NULL; } /* -------------------------------------------------------------------- */ /* Create a results layer. It will take ownership of the */ /* statement. */ /* -------------------------------------------------------------------- */ OGRMSSQLSpatialSelectLayer *poLayer = NULL; poLayer = new OGRMSSQLSpatialSelectLayer( this, poStmt ); if( poSpatialFilter != NULL ) poLayer->SetSpatialFilter( poSpatialFilter ); return poLayer; }
OGRLayer * OGRCARTODataSource::ExecuteSQLInternal( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect, int bRunDeferredActions ) { if( bRunDeferredActions ) { for( int iLayer = 0; iLayer < nLayers; iLayer++ ) { papoLayers[iLayer]->RunDeferredCreationIfNecessary(); CPL_IGNORE_RET_VAL(papoLayers[iLayer]->FlushDeferredInsert()); papoLayers[iLayer]->RunDeferredCartofy(); } } /* 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( STARTS_WITH_CI(pszSQLCommand, "DELLAYER:") ) { 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( !STARTS_WITH_CI(pszSQLCommand, "SELECT") && !STARTS_WITH_CI(pszSQLCommand, "EXPLAIN") && !STARTS_WITH_CI(pszSQLCommand, "WITH") ) { RunSQL(pszSQLCommand); return NULL; } OGRCARTOResultLayer* poLayer = new OGRCARTOResultLayer( this, pszSQLCommand ); if( poSpatialFilter != NULL ) poLayer->SetSpatialFilter( poSpatialFilter ); if( !poLayer->IsOK() ) { delete poLayer; return NULL; } return poLayer; }
OGRLayer * OGRMySQLDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { if( poSpatialFilter != NULL ) { CPLDebug( "OGR_MYSQL", "Spatial filter ignored for now in OGRMySQLDataSource::ExecuteSQL()" ); } /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Special case DELLAYER: command. */ /* -------------------------------------------------------------------- */ #ifdef notdef if( STARTS_WITH_CI(pszSQLCommand, "DELLAYER:") ) { const char *pszLayerName = pszSQLCommand + 9; while( *pszLayerName == ' ' ) pszLayerName++; DeleteLayer( pszLayerName ); return NULL; } #endif /* -------------------------------------------------------------------- */ /* Make sure there isn't an active transaction already. */ /* -------------------------------------------------------------------- */ InterruptLongResult(); /* -------------------------------------------------------------------- */ /* Execute the statement. */ /* -------------------------------------------------------------------- */ MYSQL_RES *hResultSet; if( mysql_query( hConn, pszSQLCommand ) ) { ReportError( pszSQLCommand ); return NULL; } hResultSet = mysql_use_result( hConn ); if( hResultSet == NULL ) { if( mysql_field_count( hConn ) == 0 ) { CPLDebug( "MYSQL", "Command '%s' succeeded, %d rows affected.", pszSQLCommand, (int) mysql_affected_rows(hConn) ); return NULL; } else { ReportError( pszSQLCommand ); return NULL; } } /* -------------------------------------------------------------------- */ /* Do we have a tuple result? If so, instantiate a results */ /* layer for it. */ /* -------------------------------------------------------------------- */ OGRMySQLResultLayer *poLayer = NULL; poLayer = new OGRMySQLResultLayer( this, pszSQLCommand, hResultSet ); return poLayer; }