OGRLayer * FGdbDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { size_t count = m_layers.size(); for(size_t i = 0; i < count; ++i ) { m_layers[i]->EndBulkLoad(); } /* -------------------------------------------------------------------- */ /* Use generic implementation for recognized dialects */ /* -------------------------------------------------------------------- */ if( IsGenericSQLDialect(pszDialect) ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Special case GetLayerDefinition */ /* -------------------------------------------------------------------- */ if (EQUALN(pszSQLCommand, "GetLayerDefinition ", strlen("GetLayerDefinition "))) { FGdbLayer* poLayer = (FGdbLayer*) GetLayerByName(pszSQLCommand + strlen("GetLayerDefinition ")); if (poLayer) { char* pszVal = NULL; poLayer->GetLayerXML(&pszVal); OGRLayer* poRet = new OGRFGdbSingleFeatureLayer( "LayerDefinition", pszVal ); CPLFree(pszVal); return poRet; } else return NULL; } /* -------------------------------------------------------------------- */ /* Special case GetLayerMetadata */ /* -------------------------------------------------------------------- */ if (EQUALN(pszSQLCommand, "GetLayerMetadata ", strlen("GetLayerMetadata "))) { FGdbLayer* poLayer = (FGdbLayer*) GetLayerByName(pszSQLCommand + strlen("GetLayerMetadata ")); if (poLayer) { char* pszVal = NULL; poLayer->GetLayerMetadataXML(&pszVal); OGRLayer* poRet = new OGRFGdbSingleFeatureLayer( "LayerMetadata", pszVal ); CPLFree(pszVal); return poRet; } else return NULL; } /* TODO: remove that workaround when the SDK has finally a decent */ /* SQL support ! */ if( EQUALN(pszSQLCommand, "SELECT ", 7) && pszDialect == NULL ) { CPLDebug("FGDB", "Support for SELECT is known to be partially " "non-compliant with FileGDB SDK API v1.2.\n" "So for now, we use default OGR SQL engine. " "Explicitly specify -dialect FileGDB\n" "to use the SQL engine from the FileGDB SDK API"); return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); } /* -------------------------------------------------------------------- */ /* Run the SQL */ /* -------------------------------------------------------------------- */ EnumRows* pEnumRows = new EnumRows; long hr; try { hr = m_pGeodatabase->ExecuteSQL( StringToWString(pszSQLCommand), true, *pEnumRows); } catch(...) { CPLError(CE_Failure, CPLE_AppDefined, "Exception occured at executing '%s'. Application may become unstable", pszSQLCommand); delete pEnumRows; return NULL; } if (FAILED(hr)) { GDBErr(hr, CPLSPrintf("Failed at executing '%s'", pszSQLCommand)); delete pEnumRows; return NULL; } if( EQUALN(pszSQLCommand, "SELECT ", 7) ) { return new FGdbResultLayer(this, pszSQLCommand, pEnumRows); } else { delete pEnumRows; return NULL; } }
OGRLayer * FGdbDataSource::ExecuteSQL( const char *pszSQLCommand, OGRGeometry *poSpatialFilter, const char *pszDialect ) { if ( pszDialect != NULL && EQUAL(pszDialect, "OGRSQL") ) return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); /* -------------------------------------------------------------------- */ /* Special case GetLayerDefinition */ /* -------------------------------------------------------------------- */ if (EQUALN(pszSQLCommand, "GetLayerDefinition ", strlen("GetLayerDefinition "))) { FGdbLayer* poLayer = (FGdbLayer*) GetLayerByName(pszSQLCommand + strlen("GetLayerDefinition ")); if (poLayer) { char* pszVal = NULL; poLayer->GetLayerXML(&pszVal); OGRLayer* poRet = new OGRFGdbSingleFeatureLayer( "LayerDefinition", pszVal ); CPLFree(pszVal); return poRet; } else return NULL; } /* -------------------------------------------------------------------- */ /* Special case GetLayerMetadata */ /* -------------------------------------------------------------------- */ if (EQUALN(pszSQLCommand, "GetLayerMetadata ", strlen("GetLayerMetadata "))) { FGdbLayer* poLayer = (FGdbLayer*) GetLayerByName(pszSQLCommand + strlen("GetLayerMetadata ")); if (poLayer) { char* pszVal = NULL; poLayer->GetLayerMetadataXML(&pszVal); OGRLayer* poRet = new OGRFGdbSingleFeatureLayer( "LayerMetadata", pszVal ); CPLFree(pszVal); return poRet; } else return NULL; } /* TODO: remove that workaround when the SDK has finally a decent */ /* SQL support ! */ if( EQUALN(pszSQLCommand, "SELECT ", 7) && pszDialect == NULL ) { CPLDebug("FGDB", "Support for SELECT is known to be partially " "non-compliant with FileGDB SDK API v1.2.\n" "So for now, we use default OGR SQL engine. " "Explicitely specify -dialect FileGDB\n" "to use the SQL engine from the FileGDB SDK API"); return OGRDataSource::ExecuteSQL( pszSQLCommand, poSpatialFilter, pszDialect ); } /* -------------------------------------------------------------------- */ /* Run the SQL */ /* -------------------------------------------------------------------- */ EnumRows* pEnumRows = new EnumRows; long hr; if (FAILED(hr = m_pGeodatabase->ExecuteSQL( StringToWString(pszSQLCommand), true, *pEnumRows))) { GDBErr(hr, CPLSPrintf("Failed at executing '%s'", pszSQLCommand)); delete pEnumRows; return NULL; } if( EQUALN(pszSQLCommand, "SELECT ", 7) ) { return new FGdbResultLayer(this, pszSQLCommand, pEnumRows); } else { delete pEnumRows; return NULL; } }