⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrdatasource.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                  pszSQLCommand );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      Attempt to drop the index.                                      *//* -------------------------------------------------------------------- */    eErr = poLayer->GetIndex()->DropIndex( i );    return eErr;}/************************************************************************//*                             ExecuteSQL()                             *//************************************************************************/OGRLayer * OGRDataSource::ExecuteSQL( const char *pszStatement,                                      OGRGeometry *poSpatialFilter,                                      const char *pszDialect ){    const char *pszError;    swq_select *psSelectInfo = NULL;    (void) pszDialect;/* -------------------------------------------------------------------- *//*      Handle CREATE INDEX statements specially.                       *//* -------------------------------------------------------------------- */    if( EQUALN(pszStatement,"CREATE INDEX",12) )    {        ProcessSQLCreateIndex( pszStatement );        return NULL;    }    /* -------------------------------------------------------------------- *//*      Handle DROP INDEX statements specially.                         *//* -------------------------------------------------------------------- */    if( EQUALN(pszStatement,"DROP INDEX",10) )    {        ProcessSQLDropIndex( pszStatement );        return NULL;    }    /* -------------------------------------------------------------------- *//*      Preparse the SQL statement.                                     *//* -------------------------------------------------------------------- */    pszError = swq_select_preparse( pszStatement, &psSelectInfo );    if( pszError != NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "SQL: %s", pszError );        return NULL;    }/* -------------------------------------------------------------------- *//*      Validate that all the source tables are recognised, count       *//*      fields.                                                         *//* -------------------------------------------------------------------- */    int  nFieldCount = 0, iTable;    for( iTable = 0; iTable < psSelectInfo->table_count; iTable++ )    {        swq_table_def *psTableDef = psSelectInfo->table_defs + iTable;        OGRLayer *poSrcLayer;        OGRDataSource *poTableDS = this;        if( psTableDef->data_source != NULL )        {            poTableDS = (OGRDataSource *)                 OGROpenShared( psTableDef->data_source, FALSE, NULL );            if( poTableDS == NULL )            {                if( strlen(CPLGetLastErrorMsg()) == 0 )                    CPLError( CE_Failure, CPLE_AppDefined,                               "Unable to open secondary datasource\n"                              "`%s' required by JOIN.",                              psTableDef->data_source );                swq_select_free( psSelectInfo );                return NULL;            }            // This drops explicit reference, but leave it open for use by            // code in ogr_gensql.cpp            poTableDS->Dereference();        }        poSrcLayer = poTableDS->GetLayerByName( psTableDef->table_name );        if( poSrcLayer == NULL )        {            CPLError( CE_Failure, CPLE_AppDefined,                       "SELECT from table %s failed, no such table/featureclass.",                      psTableDef->table_name );            swq_select_free( psSelectInfo );            return NULL;        }        nFieldCount += poSrcLayer->GetLayerDefn()->GetFieldCount();    }    /* -------------------------------------------------------------------- *//*      Build the field list for all indicated tables.                  *//* -------------------------------------------------------------------- */    swq_field_list sFieldList;    int            nFIDIndex = 0;    memset( &sFieldList, 0, sizeof(sFieldList) );    sFieldList.table_count = psSelectInfo->table_count;    sFieldList.table_defs = psSelectInfo->table_defs;    sFieldList.count = 0;    sFieldList.names = (char **) CPLMalloc( sizeof(char *) * (nFieldCount+1) );    sFieldList.types = (swq_field_type *)          CPLMalloc( sizeof(swq_field_type) * (nFieldCount+1) );    sFieldList.table_ids = (int *)         CPLMalloc( sizeof(int) * (nFieldCount+1) );    sFieldList.ids = (int *)         CPLMalloc( sizeof(int) * (nFieldCount+1) );        for( iTable = 0; iTable < psSelectInfo->table_count; iTable++ )    {        swq_table_def *psTableDef = psSelectInfo->table_defs + iTable;        OGRDataSource *poTableDS = this;        OGRLayer *poSrcLayer;        int      iField;        if( psTableDef->data_source != NULL )        {            poTableDS = (OGRDataSource *)                 OGROpenShared( psTableDef->data_source, FALSE, NULL );            CPLAssert( poTableDS != NULL );            poTableDS->Dereference();        }        poSrcLayer = poTableDS->GetLayerByName( psTableDef->table_name );        for( iField = 0;              iField < poSrcLayer->GetLayerDefn()->GetFieldCount();             iField++ )        {            OGRFieldDefn *poFDefn=poSrcLayer->GetLayerDefn()->GetFieldDefn(iField);            int iOutField = sFieldList.count++;            sFieldList.names[iOutField] = (char *) poFDefn->GetNameRef();            if( poFDefn->GetType() == OFTInteger )                sFieldList.types[iOutField] = SWQ_INTEGER;            else if( poFDefn->GetType() == OFTReal )                sFieldList.types[iOutField] = SWQ_FLOAT;            else if( poFDefn->GetType() == OFTString )                sFieldList.types[iOutField] = SWQ_STRING;            else                sFieldList.types[iOutField] = SWQ_OTHER;            sFieldList.table_ids[iOutField] = iTable;            sFieldList.ids[iOutField] = iField;        }        if( iTable == 0 )            nFIDIndex = poSrcLayer->GetLayerDefn()->GetFieldCount();    }/* -------------------------------------------------------------------- *//*      Expand '*' in 'SELECT *' now before we add the pseudo field     *//*      'FID'.                                                          *//* -------------------------------------------------------------------- */    pszError =         swq_select_expand_wildcard( psSelectInfo, &sFieldList );    if( pszError != NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "SQL: %s", pszError );        return NULL;    }    sFieldList.names[sFieldList.count] = "FID";    sFieldList.types[sFieldList.count] = SWQ_INTEGER;    sFieldList.table_ids[sFieldList.count] = 0;    sFieldList.ids[sFieldList.count] = nFIDIndex;        sFieldList.count++;/* -------------------------------------------------------------------- *//*      Finish the parse operation.                                     *//* -------------------------------------------------------------------- */        pszError = swq_select_parse( psSelectInfo, &sFieldList, 0 );    CPLFree( sFieldList.names );    CPLFree( sFieldList.types );    CPLFree( sFieldList.table_ids );    CPLFree( sFieldList.ids );    if( pszError != NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "SQL: %s", pszError );        return NULL;    }/* -------------------------------------------------------------------- *//*      Everything seems OK, try to instantiate a results layer.        *//* -------------------------------------------------------------------- */    OGRGenSQLResultsLayer *poResults;    poResults = new OGRGenSQLResultsLayer( this, psSelectInfo,                                            poSpatialFilter );    // Eventually, we should keep track of layers to cleanup.    return poResults;}/************************************************************************//*                         OGR_DS_ExecuteSQL()                          *//************************************************************************/OGRLayerH OGR_DS_ExecuteSQL( OGRDataSourceH hDS,                              const char *pszStatement,                             OGRGeometryH hSpatialFilter,                             const char *pszDialect ){    return (OGRLayerH)         ((OGRDataSource *)hDS)->ExecuteSQL( pszStatement,                                            (OGRGeometry *) hSpatialFilter,                                            pszDialect );}/************************************************************************//*                          ReleaseResultSet()                          *//************************************************************************/void OGRDataSource::ReleaseResultSet( OGRLayer * poResultsSet ){    delete poResultsSet;}/************************************************************************//*                      OGR_DS_ReleaseResultSet()                       *//************************************************************************/void OGR_DS_ReleaseResultSet( OGRDataSourceH hDS, OGRLayerH hLayer ){    ((OGRDataSource *) hDS)->ReleaseResultSet( (OGRLayer *) hLayer );}/************************************************************************//*                       OGR_DS_TestCapability()                        *//************************************************************************/int OGR_DS_TestCapability( OGRDataSourceH hDS, const char *pszCap ){    return ((OGRDataSource *) hDS)->TestCapability( pszCap );}/************************************************************************//*                        OGR_DS_GetLayerCount()                        *//************************************************************************/int OGR_DS_GetLayerCount( OGRDataSourceH hDS ){    return ((OGRDataSource *)hDS)->GetLayerCount();}/************************************************************************//*                          OGR_DS_GetLayer()                           *//************************************************************************/OGRLayerH OGR_DS_GetLayer( OGRDataSourceH hDS, int iLayer ){    return (OGRLayerH) ((OGRDataSource*)hDS)->GetLayer( iLayer );}/************************************************************************//*                           OGR_DS_GetName()                           *//************************************************************************/const char *OGR_DS_GetName( OGRDataSourceH hDS ){    return ((OGRDataSource*)hDS)->GetName();}/************************************************************************//*                             SyncToDisk()                             *//************************************************************************/OGRErr OGRDataSource::SyncToDisk(){    int i;    OGRErr eErr;    for( i = 0; i < GetLayerCount(); i++ )    {        OGRLayer *poLayer = GetLayer(i);        if( poLayer )        {            eErr = poLayer->SyncToDisk();            if( eErr != OGRERR_NONE )                return eErr;        }    }    return OGRERR_NONE;}/************************************************************************//*                         OGR_DS_SyncToDisk()                          *//************************************************************************/OGRErr OGR_DS_SyncToDisk( OGRDataSourceH hDS ){    return ((OGRDataSource *) hDS)->SyncToDisk();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -