📄 ogrdatasource.cpp
字号:
/* Transfer features. *//* -------------------------------------------------------------------- */ OGRFeature *poFeature; poSrcLayer->ResetReading(); while( TRUE ) { OGRFeature *poDstFeature = NULL; poFeature = poSrcLayer->GetNextFeature(); if( poFeature == NULL ) break; CPLErrorReset(); poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() ); if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ) { delete poFeature; CPLError( CE_Failure, CPLE_AppDefined, "Unable to translate feature %d from layer %s.\n", poFeature->GetFID(), poSrcDefn->GetName() ); return poDstLayer; } poDstFeature->SetFID( poFeature->GetFID() ); OGRFeature::DestroyFeature( poFeature ); CPLErrorReset(); if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE ) { OGRFeature::DestroyFeature( poDstFeature ); return poDstLayer; } OGRFeature::DestroyFeature( poDstFeature ); } return poDstLayer;}/************************************************************************//* OGR_DS_CopyLayer() *//************************************************************************/OGRLayerH OGR_DS_CopyLayer( OGRDataSourceH hDS, OGRLayerH hSrcLayer, const char *pszNewName, char **papszOptions ){ return ((OGRDataSource *) hDS)->CopyLayer( (OGRLayer *) hSrcLayer, pszNewName, papszOptions );}/************************************************************************//* DeleteLayer() *//************************************************************************/OGRErr OGRDataSource::DeleteLayer( int iLayer ){ (void) iLayer; CPLError( CE_Failure, CPLE_NotSupported, "DeleteLayer() not supported by this data source." ); return OGRERR_UNSUPPORTED_OPERATION;}/************************************************************************//* OGR_DS_DeleteLayer() *//************************************************************************/OGRErr OGR_DS_DeleteLayer( OGRDataSourceH hDS, int iLayer ){ return ((OGRDataSource *) hDS)->DeleteLayer( iLayer );}/************************************************************************//* GetLayerByName() *//************************************************************************/OGRLayer *OGRDataSource::GetLayerByName( const char *pszName ){ int i; /* first a case sensitive check */ for( i = 0; i < GetLayerCount(); i++ ) { OGRLayer *poLayer = GetLayer(i); if( strcmp( pszName, poLayer->GetLayerDefn()->GetName() ) == 0 ) return poLayer; } /* then case insensitive */ for( i = 0; i < GetLayerCount(); i++ ) { OGRLayer *poLayer = GetLayer(i); if( EQUAL( pszName, poLayer->GetLayerDefn()->GetName() ) ) return poLayer; } return NULL;}/************************************************************************//* OGR_DS_GetLayerByName() *//************************************************************************/OGRLayerH OGR_DS_GetLayerByName( OGRDataSourceH hDS, const char *pszName ){ return (OGRLayerH) ((OGRDataSource *) hDS)->GetLayerByName( pszName );}/************************************************************************//* ProcessSQLCreateIndex() *//* *//* The correct syntax for creating an index in our dialect of *//* SQL is: *//* *//* CREATE INDEX ON <layername> USING <columnname> *//************************************************************************/OGRErr OGRDataSource::ProcessSQLCreateIndex( const char *pszSQLCommand ){ char **papszTokens = CSLTokenizeString( pszSQLCommand );/* -------------------------------------------------------------------- *//* Do some general syntax checking. *//* -------------------------------------------------------------------- */ if( CSLCount(papszTokens) != 6 || !EQUAL(papszTokens[0],"CREATE") || !EQUAL(papszTokens[1],"INDEX") || !EQUAL(papszTokens[2],"ON") || !EQUAL(papszTokens[4],"USING") ) { CSLDestroy( papszTokens ); CPLError( CE_Failure, CPLE_AppDefined, "Syntax error in CREATE INDEX command.\n" "Was '%s'\n" "Should be of form 'CREATE INDEX ON <table> USING <field>'", pszSQLCommand ); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* Find the named layer. *//* -------------------------------------------------------------------- */ int i; OGRLayer *poLayer = NULL; for( i = 0; i < GetLayerCount(); i++ ) { poLayer = GetLayer(i); if( EQUAL(poLayer->GetLayerDefn()->GetName(),papszTokens[3]) ) break; } if( i >= GetLayerCount() ) { CPLError( CE_Failure, CPLE_AppDefined, "CREATE INDEX ON failed, no such layer as `%s'.", papszTokens[3] ); CSLDestroy( papszTokens ); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* Does this layer even support attribute indexes? *//* -------------------------------------------------------------------- */ if( poLayer->GetIndex() == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "CREATE INDEX ON not supported by this driver." ); CSLDestroy( papszTokens ); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* Find the named field. *//* -------------------------------------------------------------------- */ for( i = 0; i < poLayer->GetLayerDefn()->GetFieldCount(); i++ ) { if( EQUAL(papszTokens[5], poLayer->GetLayerDefn()->GetFieldDefn(i)->GetNameRef()) ) break; } CSLDestroy( papszTokens ); if( i >= poLayer->GetLayerDefn()->GetFieldCount() ) { CPLError( CE_Failure, CPLE_AppDefined, "`%s' failed, field not found.", pszSQLCommand ); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* Attempt to create the index. *//* -------------------------------------------------------------------- */ OGRErr eErr; eErr = poLayer->GetIndex()->CreateIndex( i ); if( eErr == OGRERR_NONE ) eErr = poLayer->GetIndex()->IndexAllFeatures( i ); return eErr;}/************************************************************************//* ProcessSQLDropIndex() *//* *//* The correct syntax for droping one or more indexes in *//* the OGR SQL dialect is: *//* *//* DROP INDEX ON <layername> [USING <columnname>] *//************************************************************************/OGRErr OGRDataSource::ProcessSQLDropIndex( const char *pszSQLCommand ){ char **papszTokens = CSLTokenizeString( pszSQLCommand );/* -------------------------------------------------------------------- *//* Do some general syntax checking. *//* -------------------------------------------------------------------- */ if( (CSLCount(papszTokens) != 4 && CSLCount(papszTokens) != 6) || !EQUAL(papszTokens[0],"DROP") || !EQUAL(papszTokens[1],"INDEX") || !EQUAL(papszTokens[2],"ON") || (CSLCount(papszTokens) == 6 && !EQUAL(papszTokens[4],"USING")) ) { CSLDestroy( papszTokens ); CPLError( CE_Failure, CPLE_AppDefined, "Syntax error in DROP INDEX command.\n" "Was '%s'\n" "Should be of form 'DROP INDEX ON <table> [USING <field>]'", pszSQLCommand ); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* Find the named layer. *//* -------------------------------------------------------------------- */ int i; OGRLayer *poLayer=NULL; for( i = 0; i < GetLayerCount(); i++ ) { poLayer = GetLayer(i); if( EQUAL(poLayer->GetLayerDefn()->GetName(),papszTokens[3]) ) break; } if( i >= GetLayerCount() ) { CPLError( CE_Failure, CPLE_AppDefined, "CREATE INDEX ON failed, no such layer as `%s'.", papszTokens[3] ); CSLDestroy( papszTokens ); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* Does this layer even support attribute indexes? *//* -------------------------------------------------------------------- */ if( poLayer->GetIndex() == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "Indexes not supported by this driver." ); CSLDestroy( papszTokens ); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* If we weren't given a field name, drop all indexes. *//* -------------------------------------------------------------------- */ OGRErr eErr; if( CSLCount(papszTokens) == 4 ) { for( i = 0; i < poLayer->GetLayerDefn()->GetFieldCount(); i++ ) { OGRAttrIndex *poAttrIndex; poAttrIndex = poLayer->GetIndex()->GetFieldIndex(i); if( poAttrIndex != NULL ) { eErr = poLayer->GetIndex()->DropIndex( i ); if( eErr != OGRERR_NONE ) return eErr; } } CSLDestroy(papszTokens); return OGRERR_NONE; }/* -------------------------------------------------------------------- *//* Find the named field. *//* -------------------------------------------------------------------- */ for( i = 0; i < poLayer->GetLayerDefn()->GetFieldCount(); i++ ) { if( EQUAL(papszTokens[5], poLayer->GetLayerDefn()->GetFieldDefn(i)->GetNameRef()) ) break; } CSLDestroy( papszTokens ); if( i >= poLayer->GetLayerDefn()->GetFieldCount() ) { CPLError( CE_Failure, CPLE_AppDefined, "`%s' failed, field not found.",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -