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 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()