int OGROCISession::EstablishSession( const char *pszUserid, const char *pszPassword, const char *pszDatabase ) { /* -------------------------------------------------------------------- */ /* Operational Systems's authentication option */ /* -------------------------------------------------------------------- */ ub4 eCred = OCI_CRED_RDBMS; if( EQUAL(pszDatabase, "") && EQUAL(pszPassword, "") && EQUAL(pszUserid, "/") ) { eCred = OCI_CRED_EXT; } /* -------------------------------------------------------------------- */ /* Initialize Environment handler */ /* -------------------------------------------------------------------- */ if( Failed( OCIInitialize((ub4) (OCI_DEFAULT | OCI_OBJECT), (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ) ) ) { return FALSE; } if( Failed( OCIEnvInit( (OCIEnv **) &hEnv, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 ) ) ) { return FALSE; } if( Failed( OCIHandleAlloc( (dvoid *) hEnv, (dvoid **) &hError, OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Server Context */ /* -------------------------------------------------------------------- */ if( Failed( OCIHandleAlloc( (dvoid *) hEnv, (dvoid **) &hServer, OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } if( Failed( OCIHandleAlloc( (dvoid *) hEnv, (dvoid **) &hSvcCtx, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } if( Failed( OCIServerAttach( hServer, hError, (text*) pszDatabase, strlen((char*) pszDatabase), 0) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Service Context */ /* -------------------------------------------------------------------- */ if( Failed( OCIAttrSet( (dvoid *) hSvcCtx, OCI_HTYPE_SVCCTX, (dvoid *)hServer, (ub4) 0, OCI_ATTR_SERVER, (OCIError *) hError) ) ) { return FALSE; } if( Failed( OCIHandleAlloc((dvoid *) hEnv, (dvoid **)&hSession, (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } if( Failed( OCIAttrSet((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION, (dvoid *) pszUserid, (ub4) strlen((char *) pszUserid), (ub4) OCI_ATTR_USERNAME, hError) ) ) { return FALSE; } if( Failed( OCIAttrSet((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION, (dvoid *) pszPassword, (ub4) strlen((char *) pszPassword), (ub4) OCI_ATTR_PASSWORD, hError) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Session */ /* -------------------------------------------------------------------- */ if( Failed( OCISessionBegin(hSvcCtx, hError, hSession, eCred, (ub4) OCI_DEFAULT) ) ) { CPLDebug("OCI", "OCISessionBegin() failed to intialize session"); return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Service */ /* -------------------------------------------------------------------- */ if( Failed( OCIAttrSet((dvoid *) hSvcCtx, (ub4) OCI_HTYPE_SVCCTX, (dvoid *) hSession, (ub4) 0, (ub4) OCI_ATTR_SESSION, hError) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Create a describe handle. */ /* -------------------------------------------------------------------- */ if( Failed( OCIHandleAlloc( hEnv, (dvoid **) &hDescribe, (ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0 ), "OCIHandleAlloc(Describe)" ) ) return FALSE; /* -------------------------------------------------------------------- */ /* Try to get the MDSYS.SDO_GEOMETRY type object. */ /* -------------------------------------------------------------------- */ /* If we have no MDSYS.SDO_GEOMETRY then we consider we are working along with the VRT driver and access non spatial tables. See #2202 for more details (Tamas Szekeres)*/ if (OCIDescribeAny(hSvcCtx, hError, (text *) SDO_GEOMETRY, (ub4) strlen(SDO_GEOMETRY), OCI_OTYPE_NAME, (ub1) OCI_DEFAULT, (ub1)OCI_PTYPE_TYPE, hDescribe ) != OCI_ERROR) { hGeometryTDO = PinTDO( SDO_GEOMETRY ); if( hGeometryTDO == NULL ) return FALSE; /* -------------------------------------------------------------------- */ /* Try to get the MDSYS.SDO_ORDINATE_ARRAY type object. */ /* -------------------------------------------------------------------- */ hOrdinatesTDO = PinTDO( "MDSYS.SDO_ORDINATE_ARRAY" ); if( hOrdinatesTDO == NULL ) return FALSE; /* -------------------------------------------------------------------- */ /* Try to get the MDSYS.SDO_ELEM_INFO_ARRAY type object. */ /* -------------------------------------------------------------------- */ hElemInfoTDO = PinTDO( "MDSYS.SDO_ELEM_INFO_ARRAY" ); if( hElemInfoTDO == NULL ) return FALSE; } /* -------------------------------------------------------------------- */ /* Record information about the session. */ /* -------------------------------------------------------------------- */ this->pszUserid = CPLStrdup(pszUserid); this->pszPassword = CPLStrdup(pszPassword); this->pszDatabase = CPLStrdup(pszDatabase); /* -------------------------------------------------------------------- */ /* Setting upt the OGR compatible time formating rules. */ /* -------------------------------------------------------------------- */ OGROCIStatement oSetNLSTimeFormat( this ); if( oSetNLSTimeFormat.Execute( "ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD' \ NLS_TIME_FORMAT='HH24:MI:SS' NLS_TIME_TZ_FORMAT='HH24:MI:SS TZHTZM' \ NLS_TIMESTAMP_FORMAT='YYYY/MM/DD HH24:MI:SS' \ NLS_TIMESTAMP_TZ_FORMAT='YYYY/MM/DD HH24:MI:SS TZHTZM'" ) != CE_None ) return OGRERR_FAILURE; return TRUE; }
int OGROCISession::EstablishSession( const char *pszUseridIn, const char *pszPasswordIn, const char *pszDatabaseIn ) { /* -------------------------------------------------------------------- */ /* Operational Systems's authentication option */ /* -------------------------------------------------------------------- */ ub4 eCred = OCI_CRED_RDBMS; if( EQUAL(pszDatabaseIn, "") && EQUAL(pszPasswordIn, "") && EQUAL(pszUseridIn, "/") ) { eCred = OCI_CRED_EXT; } /* -------------------------------------------------------------------- */ /* Initialize Environment handler */ /* -------------------------------------------------------------------- */ if( Failed( OCIInitialize((ub4) (OCI_DEFAULT | OCI_OBJECT), (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ) ) ) { return FALSE; } if( Failed( OCIEnvInit( (OCIEnv **) &hEnv, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 ) ) ) { return FALSE; } if( Failed( OCIHandleAlloc( (dvoid *) hEnv, (dvoid **) &hError, OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Server Context */ /* -------------------------------------------------------------------- */ if( Failed( OCIHandleAlloc( (dvoid *) hEnv, (dvoid **) &hServer, OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } if( Failed( OCIHandleAlloc( (dvoid *) hEnv, (dvoid **) &hSvcCtx, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } if( Failed( OCIServerAttach( hServer, hError, (text*) pszDatabaseIn, static_cast<int>(strlen((char*) pszDatabaseIn)), 0) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Service Context */ /* -------------------------------------------------------------------- */ if( Failed( OCIAttrSet( (dvoid *) hSvcCtx, OCI_HTYPE_SVCCTX, (dvoid *)hServer, (ub4) 0, OCI_ATTR_SERVER, (OCIError *) hError) ) ) { return FALSE; } if( Failed( OCIHandleAlloc((dvoid *) hEnv, (dvoid **)&hSession, (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0) ) ) { return FALSE; } if( Failed( OCIAttrSet((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION, (dvoid *) pszUseridIn, (ub4) strlen((char *) pszUseridIn), (ub4) OCI_ATTR_USERNAME, hError) ) ) { return FALSE; } if( Failed( OCIAttrSet((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION, (dvoid *) pszPasswordIn, (ub4) strlen((char *) pszPasswordIn), (ub4) OCI_ATTR_PASSWORD, hError) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Session */ /* -------------------------------------------------------------------- */ if( Failed( OCISessionBegin(hSvcCtx, hError, hSession, eCred, (ub4) OCI_DEFAULT) ) ) { CPLDebug("OCI", "OCISessionBegin() failed to initialize session"); return FALSE; } /* -------------------------------------------------------------------- */ /* Initialize Service */ /* -------------------------------------------------------------------- */ if( Failed( OCIAttrSet((dvoid *) hSvcCtx, (ub4) OCI_HTYPE_SVCCTX, (dvoid *) hSession, (ub4) 0, (ub4) OCI_ATTR_SESSION, hError) ) ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Create a describe handle. */ /* -------------------------------------------------------------------- */ if( Failed( OCIHandleAlloc( hEnv, (dvoid **) &hDescribe, (ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0 ), "OCIHandleAlloc(Describe)" ) ) return FALSE; /* -------------------------------------------------------------------- */ /* Try to get the MDSYS.SDO_GEOMETRY type object. */ /* -------------------------------------------------------------------- */ /* If we have no MDSYS.SDO_GEOMETRY then we consider we are working along with the VRT driver and access non spatial tables. See #2202 for more details (Tamas Szekeres)*/ if (OCIDescribeAny(hSvcCtx, hError, (text *) SDO_GEOMETRY, (ub4) strlen(SDO_GEOMETRY), OCI_OTYPE_NAME, (ub1) OCI_DEFAULT, (ub1)OCI_PTYPE_TYPE, hDescribe ) != OCI_ERROR) { hGeometryTDO = PinTDO( SDO_GEOMETRY ); if( hGeometryTDO == NULL ) return FALSE; /* -------------------------------------------------------------------- */ /* Try to get the MDSYS.SDO_ORDINATE_ARRAY type object. */ /* -------------------------------------------------------------------- */ hOrdinatesTDO = PinTDO( "MDSYS.SDO_ORDINATE_ARRAY" ); if( hOrdinatesTDO == NULL ) return FALSE; /* -------------------------------------------------------------------- */ /* Try to get the MDSYS.SDO_ELEM_INFO_ARRAY type object. */ /* -------------------------------------------------------------------- */ hElemInfoTDO = PinTDO( "MDSYS.SDO_ELEM_INFO_ARRAY" ); if( hElemInfoTDO == NULL ) return FALSE; } /* -------------------------------------------------------------------- */ /* Record information about the session. */ /* -------------------------------------------------------------------- */ pszUserid = CPLStrdup(pszUseridIn); pszPassword = CPLStrdup(pszPasswordIn); pszDatabase = CPLStrdup(pszDatabaseIn); /* -------------------------------------------------------------------- */ /* Get server version information */ /* -------------------------------------------------------------------- */ char szVersionTxt[256]; OCIServerVersion( hSvcCtx, hError, (text*) szVersionTxt, (ub4) sizeof(szVersionTxt), (ub1) OCI_HTYPE_SVCCTX ); char** papszNameValue = CSLTokenizeString2( szVersionTxt, " .", CSLT_STRIPLEADSPACES ); int count = CSLCount( papszNameValue); for( int i = 0; i < count; i++) { if( EQUAL(papszNameValue[i], "Release") ) { if( i + 1 < count ) { nServerVersion = atoi(papszNameValue[i + 1]); } if( i + 2 < count ) { nServerRelease = atoi(papszNameValue[i + 2]); } break; } } CPLDebug("OCI", "From '%s' :", szVersionTxt); CPLDebug("OCI", "Version:%d", nServerVersion); CPLDebug("OCI", "Release:%d", nServerRelease); /* -------------------------------------------------------------------- */ /* Set maximun name length (before 12.2 ? 30 : 128) */ /* -------------------------------------------------------------------- */ if( nServerVersion >= 12 && nServerRelease >= 2 ) { nMaxNameLength = 128; } CPLFree( papszNameValue ); /* -------------------------------------------------------------------- */ /* Setting up the OGR compatible time formatting rules. */ /* -------------------------------------------------------------------- */ OGROCIStatement oSetNLSTimeFormat( this ); if( oSetNLSTimeFormat.Execute( "ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD' \ NLS_TIME_FORMAT='HH24:MI:SS' NLS_TIME_TZ_FORMAT='HH24:MI:SS TZHTZM' \ NLS_TIMESTAMP_FORMAT='YYYY/MM/DD HH24:MI:SS' \ NLS_TIMESTAMP_TZ_FORMAT='YYYY/MM/DD HH24:MI:SS TZHTZM' \ NLS_NUMERIC_CHARACTERS = '. '" ) != CE_None ) return OGRERR_FAILURE; return TRUE; }