?? ogrodbcdatasource.cpp
字號(hào):
/****************************************************************************** * $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) );
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -