ogrodbcdatasource.cpp

来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 471 行 · 第 1/2 页

CPP
471
字号
/****************************************************************************** * $Id: ogrodbcdatasource.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  Implements OGRODBCDataSource class. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/#include "ogr_odbc.h"#include "cpl_conv.h"#include "cpl_string.h"CPL_CVSID("$Id: ogrodbcdatasource.cpp 10646 2007-01-18 02:38:10Z warmerdam $");/************************************************************************//*                         OGRODBCDataSource()                          *//************************************************************************/OGRODBCDataSource::OGRODBCDataSource(){    pszName = NULL;    papoLayers = NULL;    nLayers = 0;    nKnownSRID = 0;    panSRID = NULL;    papoSRS = NULL;}/************************************************************************//*                         ~OGRODBCDataSource()                         *//************************************************************************/OGRODBCDataSource::~OGRODBCDataSource(){    int         i;    CPLFree( pszName );    for( i = 0; i < nLayers; i++ )        delete papoLayers[i];        CPLFree( papoLayers );    for( i = 0; i < nKnownSRID; i++ )    {        if( papoSRS[i] != NULL )            papoSRS[i]->Release();    }    CPLFree( panSRID );    CPLFree( papoSRS );}/************************************************************************//*                                Open()                                *//************************************************************************/int OGRODBCDataSource::Open( const char * pszNewName, int bUpdate,                             int bTestOpen ){    CPLAssert( nLayers == 0 );/* -------------------------------------------------------------------- *//*      Start parsing dataset name from the end of string, fetching     *//*      the name of spatial reference table and names for SRID and      *//*      SRTEXT columns first.                                           *//* -------------------------------------------------------------------- */    char *pszWrkName = CPLStrdup( pszNewName + 5 ); // Skip the 'ODBC:' part    char **papszTables = NULL;    char **papszGeomCol = NULL;    char *pszSRSTableName = NULL;    char *pszSRIDCol = NULL, *pszSRTextCol = NULL;    char *pszDelimiter;    if ( (pszDelimiter = strrchr( pszWrkName, ':' )) != NULL )    {        char *pszOBracket = strchr( pszDelimiter + 1, '(' );        if( pszOBracket == NULL )            pszSRSTableName = CPLStrdup( pszDelimiter + 1 );        else        {            char *pszCBracket = strchr( pszOBracket, ')' );            if( pszCBracket != NULL )                *pszCBracket = '\0';            char *pszComma = strchr( pszOBracket, ',' );            if( pszComma != NULL )            {                *pszComma = '\0';                pszSRIDCol = CPLStrdup( pszComma + 1 );            }                        *pszOBracket = '\0';            pszSRSTableName = CPLStrdup( pszDelimiter + 1 );            pszSRTextCol = CPLStrdup( pszOBracket + 1 );        }        *pszDelimiter = '\0';    }/* -------------------------------------------------------------------- *//*      Strip off any comma delimeted set of tables names to access     *//*      from the end of the string first.  Also allow an optional       *//*      bracketed geometry column name after the table name.            *//* -------------------------------------------------------------------- */    while( (pszDelimiter = strrchr( pszWrkName, ',' )) != NULL )    {        char *pszOBracket = strstr( pszDelimiter + 1, "(" );        if( pszOBracket == NULL )        {            papszTables = CSLAddString( papszTables, pszDelimiter + 1 );            papszGeomCol = CSLAddString( papszGeomCol, "" );        }        else        {            char *pszCBracket = strstr(pszOBracket,")");                        if( pszCBracket != NULL )                *pszCBracket = '\0';                        *pszOBracket = '\0';            papszTables = CSLAddString( papszTables, pszDelimiter + 1 );            papszGeomCol = CSLAddString( papszGeomCol, pszOBracket+1 );        }        *pszDelimiter = '\0';    }/* -------------------------------------------------------------------- *//*      Split out userid, password and DSN.  The general form is        *//*      user/password@dsn.  But if there are no @ characters the        *//*      whole thing is assumed to be a DSN.                             *//* -------------------------------------------------------------------- */    char *pszUserid = NULL;    char *pszPassword = NULL;    char *pszDSN = NULL;    if( strstr(pszWrkName,"@") == NULL )    {        pszDSN = CPLStrdup( pszWrkName );    }    else    {        char *pszTarget;        pszDSN = CPLStrdup(strstr(pszWrkName, "@") + 1);        if( *pszWrkName == '/' )        {            pszPassword = CPLStrdup(pszWrkName + 1);            pszTarget = strstr(pszPassword,"@");            *pszTarget = '\0';        }        else        {            pszUserid = CPLStrdup(pszWrkName);            pszTarget = strstr(pszUserid,"@");            *pszTarget = '\0';            pszTarget = strstr(pszUserid,"/");            if( pszTarget != NULL )            {                *pszTarget = '\0';                pszPassword = CPLStrdup(pszTarget+1);            }        }    }    CPLFree( pszWrkName );/* -------------------------------------------------------------------- *//*      Initialize based on the DSN.                                    *//* -------------------------------------------------------------------- */    CPLDebug( "OGR_ODBC",              "EstablishSession(DSN:\"%s\", userid:\"%s\", password:\"%s\")",               pszDSN, pszUserid ? pszUserid : "",              pszPassword ? pszPassword : "" );    if( !oSession.EstablishSession( pszDSN, pszUserid, pszPassword ) )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "Unable to initialize ODBC connection to DSN for %s,\n"                  "%s",                   pszNewName+5, oSession.GetLastError() );        CSLDestroy( papszTables );        CSLDestroy( papszGeomCol );        CPLFree( pszDSN );        CPLFree( pszUserid );        CPLFree( pszPassword );        return FALSE;    }    CPLFree( pszDSN );    CPLFree( pszUserid );    CPLFree( pszPassword );    pszName = CPLStrdup( pszNewName );        bDSUpdate = bUpdate;/* -------------------------------------------------------------------- *//*      If no explicit list of tables was given, check for a list in    *//*      a geometry_columns table.                                       *//* -------------------------------------------------------------------- */    if( papszTables == NULL )    {        CPLODBCStatement oStmt( &oSession );                oStmt.Append( "SELECT f_table_name, f_geometry_column, geometry_type"                      " FROM geometry_columns" );        if( oStmt.ExecuteSQL() )        {            while( oStmt.Fetch() )            {                papszTables =                     CSLAddString( papszTables, oStmt.GetColData(0) );

⌨️ 快捷键说明

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