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 * OGRGeomediaDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* Use generic imlplementation for OGRSQL dialect. */ /* -------------------------------------------------------------------- */ if( pszDialect != NULL && EQUAL(pszDialect,"OGRSQL") ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Execute statement. */ /* -------------------------------------------------------------------- */ CPLODBCStatement *poStmt = new CPLODBCStatement( &oSession ); poStmt->Append( pszSQLCommand ); if( !poStmt->ExecuteSQL() ) { CPLError( CE_Failure, CPLE_AppDefined, "%s", oSession.GetLastError() ); 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. */ /* -------------------------------------------------------------------- */ OGRGeomediaSelectLayer *poLayer = NULL; poLayer = new OGRGeomediaSelectLayer( this, poStmt ); if( poSpatialFilter != NULL ) poLayer->SetSpatialFilter( poSpatialFilter ); return poLayer; }
int OGRMSSQLSpatialTableLayer::GetFeatureCount( int bForce ) { GetLayerDefn(); if( TestCapability(OLCFastFeatureCount) == FALSE ) return OGRMSSQLSpatialLayer::GetFeatureCount( bForce ); ClearStatement(); CPLODBCStatement* poStatement = BuildStatement( "count(*)" ); if (poStatement == NULL || !poStatement->Fetch()) { delete poStatement; return OGRMSSQLSpatialLayer::GetFeatureCount( bForce ); } int nRet = atoi(poStatement->GetColData( 0 )); delete poStatement; return nRet; }
int OGRMSSQLSpatialTableLayer::FetchSRSId() { CPLODBCStatement oStatement = CPLODBCStatement( poDS->GetSession() ); oStatement.Appendf( "select srid from geometry_columns " "where f_table_schema = '%s' and f_table_name = '%s'", pszSchemaName, pszTableName ); if( oStatement.ExecuteSQL() && oStatement.Fetch() ) { if ( oStatement.GetColData( 0 ) ) nSRSId = atoi( oStatement.GetColData( 0 ) ); } return nSRSId; }
CPLODBCStatement* OGRMSSQLSpatialTableLayer::BuildStatement(const char* pszColumns) { CPLODBCStatement* poStatement = new CPLODBCStatement( poDS->GetSession() ); poStatement->Append( "select " ); poStatement->Append( pszColumns ); poStatement->Append( " from " ); poStatement->Append( pszSchemaName ); poStatement->Append( "." ); poStatement->Append( pszTableName ); /* Append attribute query if we have it */ if( pszQuery != NULL ) poStatement->Appendf( " where (%s)", pszQuery ); /* If we have a spatial filter, query on it */ if ( m_poFilterGeom != NULL ) { if (nGeomColumnType == MSSQLCOLTYPE_GEOMETRY || nGeomColumnType == MSSQLCOLTYPE_GEOGRAPHY) { if( pszQuery == NULL ) poStatement->Append( " where" ); else poStatement->Append( " and" ); poStatement->Appendf(" [%s].STIntersects(", pszGeomColumn ); if (nGeomColumnType == MSSQLCOLTYPE_GEOGRAPHY) poStatement->Append( "geography::" ); else poStatement->Append( "geometry::" ); if ( m_sFilterEnvelope.MinX == m_sFilterEnvelope.MaxX || m_sFilterEnvelope.MinY == m_sFilterEnvelope.MaxY) poStatement->Appendf("STGeomFromText('POINT(%.15g %.15g)',%d)) = 1", m_sFilterEnvelope.MinX, m_sFilterEnvelope.MinY, nSRSId >= 0? nSRSId : 0); else poStatement->Appendf( "STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%d)) = 1", m_sFilterEnvelope.MinX, m_sFilterEnvelope.MinY, m_sFilterEnvelope.MaxX, m_sFilterEnvelope.MinY, m_sFilterEnvelope.MaxX, m_sFilterEnvelope.MaxY, m_sFilterEnvelope.MinX, m_sFilterEnvelope.MaxY, m_sFilterEnvelope.MinX, m_sFilterEnvelope.MinY, nSRSId >= 0? nSRSId : 0 ); } else { CPLError( CE_Failure, CPLE_AppDefined, "Spatial filter is supported only on geometry and geography column types." ); delete poStatement; return NULL; } } CPLDebug( "OGR_MSSQLSpatial", "ExecuteSQL(%s)", poStatement->GetCommand() ); if( poStatement->ExecuteSQL() ) return poStatement; else { delete poStatement; return NULL; } }
OGRLayer * OGRMSSQLSpatialDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { /* -------------------------------------------------------------------- */ /* Use generic imlplementation for OGRSQL dialect. */ /* -------------------------------------------------------------------- */ if( pszDialect != NULL && EQUAL(pszDialect,"OGRSQL") ) 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; } 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, 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, 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; }