extern SQLRETURN ODBC::NativeSql( SQLHDBC ConnectionHandle, SQLCHAR *InStatementText, SQLINTEGER TextLength1, SQLCHAR *OutStatementText, SQLINTEGER BufferLength, SQLINTEGER *TextLength2Ptr) { SQLRETURN rc = SQL_SUCCESS; CConnect *pConnect; SQLINTEGER InStatementTextLen; int OutStatementTextTransLen; char errorMsg[MAX_TRANSLATE_ERROR_MSG_LEN]; short InStrLen; if (! gDrvrGlobal.gHandle.validateHandle(SQL_HANDLE_DBC, ConnectionHandle)) return SQL_INVALID_HANDLE; pConnect = (CConnect *)ConnectionHandle; InStatementTextLen = pConnect->m_ICUConv->FindStrLength((const char *)InStatementText, TextLength1); if(pConnect->m_ICUConv->isAppUTF16()) BufferLength = BufferLength*2; if (OutStatementText != NULL) { //SQLRETURN ICUConverter::OutArgTranslationHelper(SQLCHAR* arg, int argLen, char * dest, int destLen, int *transLen, char *errorMsg, bool LengthInUChars) if(pConnect->m_ICUConv->m_AppUnicodeType == APP_UNICODE_TYPE_UTF16) rc = pConnect->m_ICUConv->InputArgToWCharHelper(InStatementText, InStatementTextLen, (UChar*)OutStatementText, BufferLength, &OutStatementTextTransLen, errorMsg); else rc = pConnect->m_ICUConv->InArgTranslationHelper(InStatementText, InStatementTextLen, (char *)OutStatementText, BufferLength, &OutStatementTextTransLen, errorMsg); if(rc != SQL_ERROR) { if(rc == SQL_SUCCESS_WITH_INFO) pConnect->setDiagRec(DRIVER_ERROR, IDS_01_004); } } if (TextLength2Ptr != NULL) *TextLength2Ptr = OutStatementTextTransLen; return rc; }
extern "C" void odbc_SQLSvc_EndTransaction_ccf_ ( CEE_tag_def cmptag_ , const struct odbc_SQLSvc_EndTransaction_exc_ *exception_ , const ERROR_DESC_LIST_def *sqlWarning ) { SRVR_CALL_CONTEXT *srvrCallContext = (SRVR_CALL_CONTEXT *)cmptag_; CConnect *pConnection = (CConnect *)srvrCallContext->sqlHandle; pConnection->setExceptionErrors(exception_->exception_nr, exception_->exception_detail); switch (exception_->exception_nr) { case CEE_SUCCESS: if (sqlWarning->_length > 0) pConnection->setDiagRec(sqlWarning); break; case odbc_SQLSvc_EndTransaction_SQLError_exn_: pConnection->setDiagRec(&exception_->u.SQLError); break; case odbc_SQLSvc_EndTransaction_ParamError_exn_: pConnection->setDiagRec(SERVER_ERROR, IDS_PROGRAM_ERROR, exception_->exception_nr, exception_->u.ParamError.ParamDesc, NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1, pConnection->getSrvrIdentity()); break; case odbc_SQLSvc_EndTransaction_SQLInvalidHandle_exn_: break; case odbc_SQLSvc_EndTransaction_InvalidConnection_exn_: pConnection->setDiagRec(SERVER_ERROR, IDS_08_S01); break; case odbc_SQLSvc_EndTransaction_TransactionError_exn_: char tmpNumBuffer[16]; _itoa (exception_->exception_detail, tmpNumBuffer, 10); pConnection->setDiagRec(SERVER_ERROR, IDS_TRANSACTION_ERROR, exception_->exception_nr, tmpNumBuffer, NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1, pConnection->getSrvrIdentity()); break; default: pConnection->sendCDInfo(exception_->exception_nr); pConnection->setDiagRec(exception_->exception_nr, ENDTRANSACT_PROCNAME, pConnection->getSrvrIdentity()); break; } } // odbc_SQLSvc_EndTransaction_ccf_()
// Call Completion function for operation 'odbc_SQLSvc_SetConnectionOption' extern "C" void odbc_SQLSvc_SetConnectionOption_ccf_ ( CEE_tag_def cmptag_ , const struct odbc_SQLSvc_SetConnectionOption_exc_ *exception_ , const ERROR_DESC_LIST_def *sqlWarning ) { SRVR_CALL_CONTEXT *srvrCallContext = (SRVR_CALL_CONTEXT *)cmptag_; CConnect *pConnection = (CConnect *)srvrCallContext->sqlHandle; pConnection->setExceptionErrors(exception_->exception_nr, exception_->exception_detail); switch (exception_->exception_nr) { case CEE_SUCCESS: if (sqlWarning->_length > 0) pConnection->setDiagRec(sqlWarning); break; case odbc_SQLSvc_SetConnectionOption_SQLError_exn_: pConnection->setDiagRec(&exception_->u.SQLError); break; case odbc_SQLSvc_SetConnectionOption_ParamError_exn_: pConnection->setDiagRec(SERVER_ERROR, IDS_PROGRAM_ERROR, exception_->exception_nr, exception_->u.ParamError.ParamDesc, NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1, pConnection->getSrvrIdentity()); break; case odbc_SQLSvc_SetConnectionOption_SQLInvalidHandle_exn_: //This error code is used tempororily pConnection->setDiagRec(SERVER_ERROR, IDS_HY_000, 0, " SQL_ATTR_AUTOCOMMIT can not be changed when transaction is in progress"); break; case odbc_SQLSvc_SetConnectionOption_InvalidConnection_exn_: pConnection->setDiagRec(SERVER_ERROR, IDS_08_S01); break; default: pConnection->sendCDInfo(exception_->exception_nr); pConnection->setDiagRec(exception_->exception_nr, SETCONNECT_PROCNAME, pConnection->getSrvrIdentity()); break; } }
SQLRETURN ENDTRANSACT(SRVR_CALL_CONTEXT *srvrCallContext) { CEE_status sts; struct odbc_SQLSvc_EndTransaction_exc_ exception_ = {0,0,0}; ERROR_DESC_LIST_def sqlWarning = {0,0}; UDWORD timerTimeout = srvrCallContext->connectionTimeout; CConnect *pConnection = (CConnect *)srvrCallContext->sqlHandle; if (timerTimeout != 0) timerTimeout = (timerTimeout < 180)? 180: timerTimeout; sts = odbc_SQLDrvr_EndTransaction_pst_( srvrCallContext, srvrCallContext->dialogueId, srvrCallContext->u.completionType, &exception_, &sqlWarning); if (sts != CEE_SUCCESS) { if (sts == CEE_INTERNALFAIL) pConnection->setDiagRec(DRIVER_ERROR, IDS_EXCEPTION_MSG,0,"SQL SERVER", NULL,SQL_ROW_NUMBER_UNKNOWN,SQL_COLUMN_NUMBER_UNKNOWN,2,"Internal Error","ENDTRANSACT"); else if (sts == TIMEOUT_EXCEPTION) pConnection->setDiagRec(DRIVER_ERROR, IDS_S1_T00, 0, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem)); else if (sts == COMM_LINK_FAIL_EXCEPTION) pConnection->setDiagRec(DRIVER_ERROR, IDS_08_S01, 0, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem)); else if (sts == TRANSPORT_ERROR) pConnection->setDiagRec(DRIVER_ERROR, IDS_08_S02, 0, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem)); else pConnection->setDiagRec(DRIVER_ERROR, IDS_S1_000, sts, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem), NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1,"ENDTRANSACT failed"); return SQL_ERROR; } odbc_SQLSvc_EndTransaction_ccf_ (srvrCallContext, &exception_, &sqlWarning); // // cleanup // if(exception_.exception_nr == odbc_SQLSvc_EndTransaction_SQLError_exn_ && exception_.u.SQLError.errorList._length > 0 ) delete[] exception_.u.SQLError.errorList._buffer; if(sqlWarning._length > 0) delete[] sqlWarning._buffer; switch (pConnection->getExceptionNr()) { case CEE_SUCCESS: return SQL_SUCCESS; case odbc_SQLSvc_EndTransaction_SQLInvalidHandle_exn_: return SQL_INVALID_HANDLE; default: return SQL_ERROR; } } // ENDTRANSACT()
SQLRETURN TERMINATE_DIALOG(SRVR_CALL_CONTEXT *srvrCallContext) { CEE_status sts; long timerTimeout; odbc_SQLSvc_TerminateDialogue_exc_ exception_; CConnect *pConnection = (CConnect *)srvrCallContext->sqlHandle; timerTimeout = srvrCallContext->connectionTimeout > 10 ? srvrCallContext->connectionTimeout : 10; sts = odbc_SQLSvc_TerminateDialogue_(NULL, srvrCallContext, srvrCallContext->dialogueId, &exception_); if (sts != CEE_SUCCESS) { if (sts == CEE_INTERNALFAIL) { pConnection->setDiagRec(DRIVER_ERROR, IDS_EXCEPTION_MSG,0,"SQL SERVER", NULL,SQL_ROW_NUMBER_UNKNOWN,SQL_COLUMN_NUMBER_UNKNOWN,2,"Internal Error","TERMINATE_DIALOG"); return SQL_ERROR; } pConnection->setDiagRec(DRIVER_ERROR, IDS_S1_000, sts, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem), NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1, "TERMINATE_DIALOG failed"); return SQL_SUCCESS_WITH_INFO; } // Start CCF pConnection->setExceptionErrors(exception_.exception_nr, exception_.exception_detail); switch (exception_.exception_nr) { case CEE_SUCCESS: pConnection->resetGetObjRefHdlOutput(); break; case odbc_SQLSvc_TerminateDialogue_SQLError_exn_: if (exception_.exception_detail == 25000) pConnection->setDiagRec(DRIVER_ERROR, IDS_25_000); else pConnection->setDiagRec(&exception_.u.SQLError); break; case odbc_SQLSvc_TerminateDialogue_ParamError_exn_: pConnection->setDiagRec(SERVER_ERROR, IDS_PROGRAM_ERROR, exception_.exception_nr, exception_.u.ParamError.ParamDesc); break; case odbc_SQLSvc_TerminateDialogue_InvalidConnection_exn_: pConnection->sendCDInfo(exception_.exception_nr); pConnection->setDiagRec(SERVER_ERROR, IDS_08_S01); break; default: pConnection->sendCDInfo(exception_.exception_nr); pConnection->setDiagRec(exception_.exception_nr, TERMINATE_DIALOG_PROCNAME, pConnection->getSrvrIdentity()); break; } if (exception_.exception_detail != 25000) CloseIO (pConnection->m_srvrTCPIPSystem); // Close CCF // // cleanup // if(exception_.exception_nr == odbc_SQLSvc_TerminateDialogue_SQLError_exn_ && exception_.u.SQLError.errorList._length > 0 ) delete[] exception_.u.SQLError.errorList._buffer; switch (pConnection->getExceptionNr()) { case CEE_SUCCESS: return SQL_SUCCESS; default: // if transaction is open return SQL_ERROR if (pConnection->getExceptionDetail() == 25000) return -25000; else // Any other errors treat them as if it has been disconnected return SQL_SUCCESS_WITH_INFO; } } // TERMINATE_DIALOG()
SQLRETURN GETOBJREF(SRVR_CALL_CONTEXT *srvrCallContext) { DWORD dwTimeout = 0; DWORD curTimeout = 0; _timeb time_start; _timeb time_curr; SQLRETURN rc = SQL_SUCCESS; CEE_status sts; short noOfRetries = 0; CConnect *pConnection; VERSION_def version; bool bloop = true; int dwSleep; odbcas_ASSvc_GetObjRefHdl_exc_ exception_ = {0,0,0}; IDL_OBJECT_def srvrObjRef; DIALOGUE_ID_def dialogueId = 0; SQL_IDENTIFIER_def dataSource; USER_SID_def userSid = {0,0};; VERSION_LIST_def versionList = {0,0}; long isoMapping = 0; IDL_long srvrNodeId = -1; IDL_long srvrProcessId = -1; long long timestamp = 0; IDL_OBJECT_def fwsrvrObjRef; char* pTCP; char* pIpAddress; char* pPortNumber; char* pObjectName; IDL_OBJECT_def objRef; char* pCheckComma; char* pCheck; char* srvrSegName=NULL; int getObjRefRetryCnt = 0; pConnection = (CConnect *)srvrCallContext->sqlHandle; dwTimeout = srvrCallContext->u.connectParams.loginTimeout; if(dwTimeout != 0) { dwSleep = (dwTimeout / 3) * 1000; dwSleep = dwSleep > 5000 ? 5000 : dwSleep; dwSleep = dwSleep < 1000 ? 1000 : dwSleep; } else dwSleep = 5000; _ftime(&time_start); TryAgain: pConnection->clearError(); sts = odbcas_ASSvc_GetObjRefHdl_(NULL, srvrCallContext, srvrCallContext->u.connectParams.inContext, srvrCallContext->u.connectParams.userDesc, CORE_SRVR, getObjRefRetryCnt, &exception_, srvrObjRef, &dialogueId, dataSource, &userSid, &versionList, &isoMapping, &srvrNodeId, &srvrProcessId, ×tamp); if (sts != CEE_SUCCESS) { if (sts == CEE_INTERNALFAIL) pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_EXCEPTION_MSG,0,"ASSOCIATION SERVICE", NULL,SQL_ROW_NUMBER_UNKNOWN,SQL_COLUMN_NUMBER_UNKNOWN,2,"Internal Error","GETOBJREF"); else if (sts == TIMEOUT_EXCEPTION) pConnection->setDiagRec(DRIVER_ERROR, IDS_S1_T00, 0, FORMAT_ERROR((long)pConnection->m_asTCPIPSystem)); else if ((sts == COMM_LINK_FAIL_EXCEPTION) || (sts == TRANSPORT_ERROR)) pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_ASSOC_SRVR_NOT_AVAILABLE,0, FORMAT_ERROR("ASSOCIATION SERVICE",(long)pConnection->m_asTCPIPSystem), NULL,SQL_ROW_NUMBER_UNKNOWN,SQL_COLUMN_NUMBER_UNKNOWN,1,""); else pConnection->setDiagRec(DRIVER_ERROR, IDS_ASSOC_SRVR_NOT_AVAILABLE, sts, FORMAT_ERROR((long)pConnection->m_asTCPIPSystem), NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1,LAST_ERROR_TO_TEXT()); if(versionList._buffer != NULL) delete versionList._buffer; return SQL_ERROR; } /* Starts CCF */ pConnection->setExceptionErrors(exception_.exception_nr, exception_.exception_detail); switch (exception_.exception_nr) { case CEE_SUCCESS: if (srvrObjRef[0] == 0) { pConnection->setExceptionErrors(odbcas_ASSvc_GetObjRefHdl_ASParamError_exn_,0); pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_PROGRAM_ERROR, exception_.exception_nr, "Invalid Object Reference"); break; } pConnection->m_srvrTCPIPSystem->setSwap(pConnection->m_asTCPIPSystem->swap()); pConnection->setRetSrvrObjRef(srvrObjRef); strcpy(fwsrvrObjRef, srvrObjRef); strcpy(objRef, srvrObjRef); if ((pTCP = strtok(objRef, ":")) != NULL) { pCheckComma = strchr( srvrObjRef, ',' ); if (pCheckComma != NULL) { // // New object ref tcp:\neo0001.$z123,1.2.3.4/18650:ObjectName // pCheck = strtok(NULL,","); if (pCheck != NULL) { if ((pIpAddress = strtok(NULL, "/")) != NULL) { if ((pPortNumber = strtok(NULL, ":")) != NULL) { if ((pObjectName = strtok(NULL, ":")) != NULL) { sprintf( fwsrvrObjRef, "%s:%s/%s:%s", pTCP,pIpAddress,pPortNumber,pObjectName); } } } srvrSegName = strtok(pCheck, "."); } } else { // // Old object ref tcp:\neo0001.$z123/18650:ObjectName // strcpy(objRef, srvrObjRef); pCheck = objRef + 5; if ((pIpAddress = strtok(pCheck, ".")) != NULL) { strtok(NULL, "/"); if ((pPortNumber = strtok(NULL, ":")) != NULL) { if ((pObjectName = strtok(NULL, ":")) != NULL) { sprintf( fwsrvrObjRef, "tcp:%s/%s:%s", pIpAddress,pPortNumber,pObjectName); } } srvrSegName = pIpAddress; } } } pConnection->setGetObjRefHdlOutput(fwsrvrObjRef, dialogueId, dataSource, &userSid, &versionList, srvrNodeId, srvrProcessId, timestamp); break; case odbcas_ASSvc_GetObjRefHdl_ASParamError_exn_ : // Added check to see if No CPUs or Invalid CPU list are set for MXCS server to start then return // error back to client as param error then parse the error in client to return proper error message. pCheck = strstr(exception_.u.ASParamError.ErrorText, "CPU" ); if (pCheck == NULL) pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_PROGRAM_ERROR, exception_.exception_nr, exception_.u.ASParamError.ErrorText); else pConnection->setDiagRec(ASSOC_SERVER_ERROR,IDS_NO_SRVR_AVAILABLE, 0, exception_.u.ASNotAvailable.ErrorText); break; case odbcas_ASSvc_GetObjRefHdl_LogonUserFailure_exn_ : PVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, exception_.u.LogonUserFailure.errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // Default language (LPTSTR) &lpMsgBuf, 0, NULL); pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_UNABLE_TO_LOGON, exception_.u.LogonUserFailure.errorCode, (char *)lpMsgBuf); LocalFree(lpMsgBuf); break; case odbcas_ASSvc_GetObjRefHdl_ASNotAvailable_exn_ : pConnection->setDiagRec(ASSOC_SERVER_ERROR,IDS_ASSOC_SRVR_NOT_AVAILABLE, 0, exception_.u.ASNotAvailable.ErrorText); break; case odbcas_ASSvc_GetObjRefHdl_DSNotAvailable_exn_: pConnection->setDiagRec(ASSOC_SERVER_ERROR,IDS_DS_NOT_AVAILABLE,0L, exception_.u.DSNotAvailable.ErrorText); break; case odbcas_ASSvc_GetObjRefHdl_PortNotAvailable_exn_: pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_PORT_NOT_AVAILABLE); break; case odbcas_ASSvc_GetObjRefHdl_InvalidUser_exn_: pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_28_000); break; case odbcas_ASSvc_GetObjRefHdl_ASTimeout_exn_ : pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_S1_T00); break; case odbcas_ASSvc_GetObjRefHdl_ASNoSrvrHdl_exn_ : pConnection->setDiagRec(ASSOC_SERVER_ERROR,IDS_NO_SRVR_AVAILABLE, 0, exception_.u.ASNotAvailable.ErrorText); break; case odbcas_ASSvc_GetObjRefHdl_ASTryAgain_exn_ : case -27: break; case -29: break; default: pConnection->setDiagRec(exception_.exception_nr, GET_OBJECT_REF_PROCNAME, pConnection->getSrvrIdentity()); break; } /* Ends CCF */ switch (pConnection->getExceptionNr()) { case CEE_SUCCESS: pConnection->getVersion(&version, NSK_ODBCAS_COMPONENT); if (version.componentId != NSK_ODBCAS_COMPONENT || version.majorVersion != NSK_VERSION_MAJOR_1 || version.minorVersion != NSK_VERSION_MINOR_0 ) { char tmp[100]; IDL_short majorVersion = version.majorVersion; IDL_short minorVersion = version.minorVersion; majorVersion = (majorVersion > 0)? majorVersion - 1: majorVersion; sprintf(tmp,"Incorrect AS version: %d.%d, expected: %d.%d",majorVersion,minorVersion,NSK_VERSION_MAJOR_1 - 1,NSK_VERSION_MINOR_0); pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_S1_000, 0, tmp,NULL, 0, 0, 1, tmp); rc = SQL_ERROR; } break; case odbcas_ASSvc_GetObjRefHdl_ASTryAgain_exn_: _ftime(&time_curr); curTimeout = (long)(time_curr.time - time_start.time); if ((dwTimeout != 0) && (dwTimeout <= curTimeout)) { pConnection->setDiagRec(ASSOC_SERVER_ERROR, IDS_S1_T00); rc = SQL_ERROR; break; } else { if(dwTimeout != 0) srvrCallContext->u.connectParams.loginTimeout = dwTimeout - curTimeout; Sleep(dwSleep); getObjRefRetryCnt++; goto TryAgain; } break; default: rc = SQL_ERROR; break; } /* * CleanUp */ if(versionList._buffer != NULL) delete versionList._buffer; return rc; }
SQLRETURN INITIALIZE_DIALOG(SRVR_CALL_CONTEXT *srvrCallContext) { CEE_status sts; CConnect *pConnection; SQLRETURN rc = SQL_SUCCESS; // RAJANI - for password expiry CONNECT_FIELD_ITEMS connectFieldItems; bool bChangePwd = false; odbc_SQLSvc_InitializeDialogue_exc_ exception_ = {0,0,0}; OUT_CONNECTION_CONTEXT_def outContext; pConnection = (CConnect *)srvrCallContext->sqlHandle; short retry = 0; retryInitializeDialogue: do { sts = odbc_SQLSvc_InitializeDialogue_(NULL, srvrCallContext, srvrCallContext->u.connectParams.userDesc, srvrCallContext->u.connectParams.inContext, srvrCallContext->dialogueId, &exception_, &outContext); if (sts == CEE_SUCCESS) break; Sleep(100); } while (sts == COMM_LINK_FAIL_EXCEPTION && retry++ < 3); if (sts != CEE_SUCCESS) { if (sts == CEE_INTERNALFAIL) pConnection->setDiagRec(DRIVER_ERROR, IDS_EXCEPTION_MSG,0,"SQL SERVER", NULL,SQL_ROW_NUMBER_UNKNOWN,SQL_COLUMN_NUMBER_UNKNOWN,2,"Internal Error","INITIALIZE_DIALOG"); else if (sts == TIMEOUT_EXCEPTION) pConnection->setDiagRec(DRIVER_ERROR, IDS_S1_T00, 0, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem)); else if (sts == COMM_LINK_FAIL_EXCEPTION) pConnection->setDiagRec(SERVER_ERROR, IDS_08_S01, 0, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem)); else if (sts == TRANSPORT_ERROR) pConnection->setDiagRec(SERVER_ERROR, IDS_08_S02, 0, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem)); else pConnection->setDiagRec(DRIVER_ERROR, IDS_S1_000, sts, FORMAT_ERROR((long)pConnection->m_srvrTCPIPSystem), NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1,"INITIALIZE_DIALOG failed"); return SQL_ERROR; } // Start CCF pConnection->setExceptionErrors(exception_.exception_nr, exception_.exception_detail); switch ( exception_.exception_nr) { case CEE_SUCCESS: pConnection->setOutContext(&outContext); break; case odbc_SQLSvc_InitializeDialogue_SQLError_exn_: if (exception_.exception_detail == 4415) // SECMXO_NO_CERTIFICATE { try{ if (pConnection->m_SecPwd->switchCertificate()==SQL_SUCCESS) // successfully switched to the new certificate pConnection->setRetryEncryption(); else // there is no certificate to switch to pConnection->setDiagRec(&exception_.u.SQLError); } catch (SecurityException se) { rc= se.getErrCode(); pConnection->setSecurityError(rc, se.getSQLState(), se.getMsg()); } } else pConnection->setDiagRec(&exception_.u.SQLError); break; case odbc_SQLSvc_InitializeDialogue_InvalidUser_exn_: if (outContext.outContextOptions1 & OUTCONTEXT_OPT1_DOWNLOAD_CERTIFICATE) { try { pConnection->m_SecPwd->switchCertificate(outContext.outContextOptionString, outContext.outContextOptionStringLen); } catch (SecurityException se) { rc = se.getErrCode(); pConnection->setSecurityError(rc, se.getSQLState(), se.getMsg()); } if(rc == SQL_SUCCESS) pConnection->setRetryEncryption(); } else if (srvrCallContext->u.connectParams.userDesc->userName != NULL && srvrCallContext->u.connectParams.userDesc->password._buffer != NULL) pConnection->setDiagRec(&exception_.u.SQLError); break; case odbc_SQLSvc_InitializeDialogue_ParamError_exn_: pConnection->setDiagRec(SQLMX_ERROR, IDS_28_000, exception_.exception_nr, (char*)(LPCTSTR)exception_.u.ParamError.ParamDesc, NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1, INITIALIZE_DIALOG_PROCNAME); break; case odbc_SQLSvc_InitializeDialogue_InvalidConnection_exn_: pConnection->setDiagRec(SERVER_ERROR, IDS_08_004_01); break; case odbc_SQLSvc_InitializeDialogue_SQLInvalidHandle_exn_: break; case odbc_SQLSvc_InitializeDialogue_SQLNeedData_exn_: break; default: pConnection->setDiagRec(exception_.exception_nr, INITIALIZE_DIALOG_PROCNAME, pConnection->getSrvrIdentity()); break; } // End CCF switch (pConnection->getExceptionNr()) { case CEE_SUCCESS: break; case odbc_SQLSvc_InitializeDialogue_SQLInvalidHandle_exn_: rc = SQL_INVALID_HANDLE; break; case odbc_SQLSvc_InitializeDialogue_SQLError_exn_: if(pConnection->getExceptionDetail() == SQL_PASSWORD_EXPIRING || pConnection->getExceptionDetail() == SQL_PASSWORD_GRACEPERIOD) { pConnection->setOutContext(&outContext); rc = SQL_SUCCESS_WITH_INFO; } else rc = SQL_ERROR; break; //Arvind: When using a dummy username, it would get connected and can perform operations. case odbc_SQLSvc_InitializeDialogue_SQLNeedData_exn_: rc = SQL_NEED_DATA; break; default: rc = SQL_ERROR; break; } // // cleanup // if(exception_.exception_nr == odbc_SQLSvc_InitializeDialogue_SQLError_exn_ && exception_.u.SQLError.errorList._length > 0 ) delete[] exception_.u.SQLError.errorList._buffer; if(exception_.exception_nr == odbc_SQLSvc_InitializeDialogue_InvalidUser_exn_ && exception_.u.InvalidUser.errorList._length > 0 ) delete[] exception_.u.InvalidUser.errorList._buffer; if(outContext.versionList._length > 0) delete [] outContext.versionList._buffer; if((outContext.outContextOptions1 & OUTCONTEXT_OPT1_ROLENAME || outContext.outContextOptions1 & OUTCONTEXT_OPT1_DOWNLOAD_CERTIFICATE) && outContext.outContextOptionStringLen > 0) delete [] outContext.outContextOptionString; return rc; } // INITIALIZE_DIALOG()
SQLRETURN ODBC::FreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle) { CEnv* pEnv; CConnect* pConnect; CStmt* pStmt; CDesc* pDesc; switch (HandleType) { case SQL_HANDLE_ENV: delete (CEnv *)Handle; break; case SQL_HANDLE_DBC: pConnect = (CConnect *)Handle; pEnv = pConnect->getEnvHandle(); if(TryEnterCriticalSection(&pEnv->m_CSObject)) { if(pEnv->m_CSObject.RecursionCount > 1) { pConnect->setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "The handle is in use and cannot be freed."); LeaveCriticalSection(&pEnv->m_CSObject); return SQL_ERROR; } } else { EnterCriticalSection(&pEnv->m_CSObject); } delete pConnect; LeaveCriticalSection(&pEnv->m_CSObject); break; case SQL_HANDLE_STMT: pStmt = (CStmt *)Handle; pConnect = pStmt->getConnectHandle(); if(TryEnterCriticalSection(&pConnect->m_CSObject)) { if(pConnect->m_CSObject.RecursionCount > 1) { pStmt->setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "The handle is in use and cannot be freed."); LeaveCriticalSection(&pConnect->m_CSObject); return SQL_ERROR; } } else { EnterCriticalSection(&pConnect->m_CSObject); } delete pStmt; LeaveCriticalSection(&pConnect->m_CSObject); break; case SQL_HANDLE_DESC: pDesc = (CDesc *)Handle; pConnect = pDesc->getDescConnect(); if(TryEnterCriticalSection(&pConnect->m_CSObject)) { if(pConnect->m_CSObject.RecursionCount > 1) { pDesc->setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "The handle is in use and cannot be freed."); LeaveCriticalSection(&pConnect->m_CSObject); return SQL_ERROR; } } else { EnterCriticalSection(&pConnect->m_CSObject); } delete pDesc; LeaveCriticalSection(&pConnect->m_CSObject); break; default: return SQL_INVALID_HANDLE; } return SQL_SUCCESS; }