// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@

//
#include "process.h"
#include "CConnect.h"
#include "tdm_odbcDrvMsg.h"
#include "DrvrNet.h"
#include "nlsFunctions.h"
#include "resource.h"
#include "CStmt.h"
#include "security.h"
#include "DiagFunctions.h"
#include "drvrnet.h"
#include "csconvert.h"
#include <psapi.h>

#define UNKNOWN_WINDOW		"UNKNOWN"

int getCLCurrentUserDesc(char* usersid,char* username,char* domain)
{
	return 0;
}

// Implements the member functions of CConnect

CConnect::CConnect(SQLHANDLE InputHandle) : CHandle(SQL_HANDLE_DBC, InputHandle)
{
	m_TranslateLibHandle = NULL;
	m_SecPwd = NULL;

	reset();
	m_ConnectEvent = NULL;
	m_EnvHandle = (CEnv *)InputHandle;

	m_asTCPIPSystem = GTransport.m_TCPIPSystemDrvr_list->ins_node();
	m_srvrTCPIPSystem = GTransport.m_TCPIPSystemDrvr_list->ins_node();
	InitializeCriticalSection(&m_CSTransmision);
	m_IgnoreCancel = false; 
	m_StartNode = -1;
}

CConnect::~CConnect()
{
	if (m_ConnectEvent != NULL)
		CloseHandle(m_ConnectEvent);
	if (m_asTCPIPSystem != NULL)
		GTransport.m_TCPIPSystemDrvr_list->del_node(m_asTCPIPSystem);
	if (m_srvrTCPIPSystem != NULL)
		GTransport.m_TCPIPSystemDrvr_list->del_node(m_srvrTCPIPSystem);
	DeleteCriticalSection(&m_CSTransmision);
	
	if (m_SecPwd != NULL)
		delete m_SecPwd;
}

SQLRETURN CConnect::initialize()
{
	if (m_ConnectEvent == NULL) 
	{
		m_ConnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
		if (m_ConnectEvent == NULL)
		{
			setNTError(getErrorMsgLang(), "initialize - CreateEvent()");
			return SQL_ERROR;
		}
	}
	return SQL_SUCCESS;
}


void CConnect::reset(bool clError)
{

	if(clError)
		clearError();
	m_HeartBeatEnable = TRUE;
		
	m_RetSQLSvc_ObjRef[0] = '\0';
	m_ASSvc_ObjRef[0] = '\0';
	m_SQLSvc_ObjRef[0] = '\0';
	m_DialogueId = -1;
	m_SrvrDSName[0] ='\0';
	m_SrvrDSReadType = 0;
	m_SrvrIdentity[0] = '\0';
	
	m_AccessMode = SQL_MODE_DEFAULT;
	m_AutoIPD = SQL_TRUE;			// Automatic population of IPD is supported
	m_AutoCommit = SQL_AUTOCOMMIT_DEFAULT;
	m_ConnectionTimeout = DRVR_PENDING;
	m_CurrentCatalog[0] = '\0';
	m_CurrentSchema[0] = '\0'; 
	m_LoginTimeout	= DRVR_PENDING;
	m_ODBCCursors = SQL_CUR_USE_DRIVER;
	m_PacketSize = 0;	// Not Used
	m_QuietMode = NULL;
	m_Trace = SQL_OPT_TRACE_OFF;
	m_TraceFile[0] = '\0';
	m_TranslateLib[0] = '\0';
	m_TranslateOption = DRVR_PENDING;
	m_TxnIsolation = gDrvrGlobal.gDefaultTxnIsolation;
	m_ConnectionDead = SQL_CD_TRUE;
	m_CDInfoSent	= TRUE;

	m_AsyncEnable = SQL_ASYNC_ENABLE_DEFAULT;
	m_MetadataId = SQL_FALSE;		// Catalog functions arguments are not treated as identifiers
	
	m_Concurrency = SQL_CONCUR_DEFAULT;
	m_CursorType = SQL_CURSOR_TYPE_DEFAULT;
	m_MaxLength = SQL_MAX_LENGTH_DEFAULT;
	m_MaxRows = SQL_MAX_ROWS_DEFAULT;
	m_Noscan = SQL_NOSCAN_DEFAULT;
	m_QueryTimeout = SQL_QUERY_TIMEOUT_DEFAULT;
	m_SimulateCursor = SQL_SC_NON_UNIQUE;
	m_UseBookmarks = SQL_UB_DEFAULT;
	if (m_TranslateLibHandle)
	{
		FreeLibrary(m_TranslateLibHandle);
		m_TranslateLibHandle = NULL;
	}
	m_FPSQLDriverToDataSource = NULL;
	m_FPSQLDataSourceToDriver = NULL;

	m_RowsetErrorRecovery = 0;

	m_FetchBufferSize = 0;
	m_ChangePassword = FALSE;

	strcpy(m_QSServiceName,HP_DEFAULT_SERVICE);

	//wms_mapping
	memset(m_QueryID_SessionName, 0, sizeof(m_QueryID_SessionName));
	memset(m_applName, 0, sizeof(m_applName));
	
	m_IgnoreCancel = false;
	m_FetchAhead = 0;
	m_UserRole[0] = '\0';

	m_CertificateDir[0] = '\0';
	m_CertificateFile[0] = '\0';
	m_CertificateFileActive[0] = '\0';

	m_SecurityMode = 1; // security mode should be 1 by default
	m_RetryEncryption = false;
	memset(&m_SecInfo, 0, sizeof(m_SecInfo));

	if (m_SecPwd != NULL)
	{
		delete m_SecPwd;
		m_SecPwd = NULL;
	}
	m_StartNode = -1;
}

void CConnect::setVersion(const VERSION_LIST_def *versionList,int componentId)
{
	unsigned long i;
	VERSION_def		*version;

	for ( i = 0; i < versionList->_length ; i++)
	{
		version = versionList->_buffer + i;
		if ((version->componentId) == NT_ODBCAS_COMPONENT || version->componentId == NSK_ODBCAS_COMPONENT) // NT or NSK
		{
			m_ASVersion.componentId = version->componentId;
			m_ASVersion.majorVersion = version->majorVersion;
			m_ASVersion.minorVersion = version->minorVersion;
			m_ASVersion.buildId = version->buildId;
		}
		if ((version->componentId & 0x00FF) == ODBC_SRVR_COMPONENT) //odbcSrvr
		{
			m_SrvrVersion.componentId = version->componentId;
			m_SrvrVersion.majorVersion = version->majorVersion;
			m_SrvrVersion.minorVersion = version->minorVersion;
			m_SrvrVersion.buildId = version->buildId;

            if((componentId == ODBC_SRVR_COMPONENT) && 
				version->buildId & MXO_SPECIAL_1_MODE)
			{
		      gDrvrGlobal.gSpecial_1 = true;
			}
		}
		if ((version->componentId) == SQL_COMPONENT) // sql
		{
			m_SqlVersion.componentId = version->componentId;
			m_SqlVersion.majorVersion = version->majorVersion;
			m_SqlVersion.minorVersion = version->minorVersion;
			m_SqlVersion.buildId = version->buildId;
			m_SQLRowsetSupported = m_SqlVersion.minorVersion;
		}

	}
}

void CConnect::getVersion(VERSION_def *version, int componentId)
{
	if (componentId == NT_ODBCAS_COMPONENT || componentId == NSK_ODBCAS_COMPONENT) // NT or NSK
	{
		version->componentId = m_ASVersion.componentId;
		version->majorVersion = m_ASVersion.majorVersion;
		version->minorVersion = m_ASVersion.minorVersion;
		version->buildId = m_ASVersion.buildId;
	}
	else if (componentId == ODBC_SRVR_COMPONENT) //odbcSrvr
	{
		version->componentId = m_SrvrVersion.componentId;
		version->majorVersion = m_SrvrVersion.majorVersion;
		version->minorVersion = m_SrvrVersion.minorVersion;
		version->buildId = m_SrvrVersion.buildId;
	}
	else if (componentId == SQL_COMPONENT) // sql
	{
		version->componentId = m_SqlVersion.componentId;
		version->majorVersion = m_SqlVersion.majorVersion;
		version->minorVersion = m_SqlVersion.minorVersion;
		version->buildId = m_SqlVersion.buildId;
	}
	else
	{
		version->componentId = 0;
		version->majorVersion = 0;
		version->minorVersion = 0;
		version->buildId = 0;
	}
}

void CConnect::setOutContext(const OUT_CONNECTION_CONTEXT_def *outContext)
{
	setVersion(&outContext->versionList,ODBC_SRVR_COMPONENT);
	// if available, otherwise we'll stick with cpu,pin.
	IDL_OBJECT_def tmpStr;
	char *pToken = NULL;

	strcpy (tmpStr, m_RetSQLSvc_ObjRef);
	pToken = strtok (tmpStr, "$");
	if( pToken != NULL )
		pToken = strtok (NULL, ",");

	if( pToken != NULL ) {
		sprintf (m_SrvrIdentity, "%s($%s){%s}", 
				outContext->computerName,
				pToken,
				m_SQLSvc_ObjRef);
	}
	else
		sprintf (m_SrvrIdentity, "%s(%d,%d){%s}", 
				outContext->computerName,
				outContext->nodeId,
				outContext->processId,
				m_SQLSvc_ObjRef);

	if(outContext->outContextOptions1 & OUTCONTEXT_OPT1_IGNORE_SQLCANCEL)
		m_IgnoreCancel = true;

	strcpy(m_CurrentCatalog, (char*)outContext->catalog);
	strcpy(m_DSValue.m_DSSchema, (char*)outContext->schema);
	strcpy(m_CurrentSchema,m_DSValue.m_DSSchema); 
	

	if (outContext->outContextOptions1 & OUTCONTEXT_OPT1_ROLENAME) // outContext->outContextOptionString = "RN=<ROLE_NAME>;"
	{
		if(outContext->outContextOptionStringLen > 0)
		{
			pToken = strstr(outContext->outContextOptionString, "RN=");
			if (pToken != NULL)
				strcpy(m_UserRole, strtok(pToken+3,";"));
		}
	}

	if (IsTraceLibrary())
	{
		InitializeTrace();
		if (pdwGlobalTraceVariable && *pdwGlobalTraceVariable)
			LogInfo(&m_ASVersion,&m_SrvrVersion,&m_SqlVersion);
	}
}
		
void CConnect::setGetObjRefHdlOutput(const IDL_char *srvrObjRef,
		DIALOGUE_ID_def dialogueId,
		const IDL_char *dataSource, 
		const USER_SID_def *userSid,
		const VERSION_LIST_def *versionList,
		const IDL_long srvrNodeId,
		const IDL_long srvrProcessId,
		const IDL_long_long timestamp)
{
	strcpy(m_SQLSvc_ObjRef, srvrObjRef);
	m_DialogueId = dialogueId;
	strcpy(m_SrvrDSName, dataSource);
	m_SrvrDSReadType = 1;
	if (userSid->_length > 0)
		strcpyUTF8(m_UserSid, (const char *)userSid->_buffer, sizeof(m_UserSid), userSid->_length);
	else
		m_UserSid[0] = '\0';
	setVersion(versionList,NSK_ODBCAS_COMPONENT);
	if (srvrNodeId >= 0) 
	{
		m_SecInfo.cpu = srvrNodeId;
		m_SecInfo.pin = srvrProcessId;
		m_SecInfo.timestamp = timestamp;  
		m_SecurityMode = 1;
	}
	else
		m_SecurityMode = 0;
}

void CConnect::resetGetObjRefHdlOutput()
{
	memset(m_SQLSvc_ObjRef, 0, sizeof(m_SQLSvc_ObjRef));
	m_DialogueId = -1;
	memset(m_SrvrDSName, 0, sizeof(m_SrvrDSName));
	m_SrvrDSReadType = 0;
	m_UserSid[0] = '\0';
}
		
typedef int (WINAPI* GetDomainUser)( LPSTR , LPSTR );

BOOL CConnect::getUserDesc(char *userNameNTS, char *AuthenticationNTS, USER_DESC_def *userDesc)
{

	HINSTANCE		hGetDomainUser;
	GetDomainUser	pGetDomainUser;
	DWORD			dwError;
	int				rc;

 
	if (userNameNTS[0] == '\0') 
	{
		if( gDrvrGlobal.gPlatformId == VER_PLATFORM_WIN32_WINDOWS )
		{
// Windows95 when gMinorVersion = 0
// Windows98 when gMinorVersion = 1
			if( (hGetDomainUser = LoadLibrary("Win95DLL.DLL")) == NULL )
			{
				setNTError(getErrorMsgLang(), "getUserDesc - LoadLibrary()");
				return FALSE;
			}

			if ((pGetDomainUser = (GetDomainUser)GetProcAddress( hGetDomainUser, "GetDomainUser")) == (GetDomainUser)NULL)
			{
				setNTError(getErrorMsgLang(), "getUserDesc - GetProcAddress()");
				return FALSE;
			}

			m_UserDomain[0] = '\0';
			m_UserName[0] = '\0';
			rc = (pGetDomainUser)( m_UserDomain, m_UserName );

			FreeLibrary( hGetDomainUser );

			if	(! rc)
			{
				setDiagRec(DRIVER_ERROR, IDS_28_000, 0L, NULL);
				return FALSE;
			}
			else if (m_UserDomain[0] == '\0'|| strcmp(m_UserDomain, gDrvrGlobal.gComputerName) == 0 )			
			{
				setDiagRec(DRIVER_ERROR, IDS_28_000);
				return FALSE;
			}

			userDesc->userDescType = WIN95_USER_TYPE;
			userDesc->userName = m_UserName;
			userDesc->domainName = m_UserDomain;
			userDesc->userSid._length = 0;
			userDesc->userSid._buffer = NULL;
			userDesc->password._length = 0;
			userDesc->password._buffer = NULL;
		}
		else
		{
// Windows NT
			if ((dwError = getCLCurrentUserDesc(m_UserSid, m_UserName, m_UserDomain)) != 0)
			{
				setNTError(getErrorMsgLang(), "getUserDesc - getCLCurrentUserDesc()");
				return FALSE;
			}

			userDesc->userDescType = SID_TYPE;
			userDesc->userSid._length = strlen(m_UserSid);
			userDesc->userSid._buffer = (IDL_octet *)m_UserSid;
			userDesc->userName = m_UserName;
			userDesc->domainName = m_UserDomain;
			userDesc->password._length = 0;
			userDesc->password._buffer = NULL;
		}
	}
	else
	{
		strcpy(m_UserName, userNameNTS);
		m_UserDomain[0] = '\0';

		userDesc->userDescType = UNAUTHENTICATED_USER_TYPE;
		userDesc->userName = m_UserName;
		userDesc->domainName = m_UserDomain;
		userDesc->password._length = 0;
		userDesc->password._buffer = NULL;
		userDesc->userSid._length = 0;
		userDesc->userSid._buffer = NULL;

	}
	return TRUE;
}	

long CConnect::sendCDInfo(long exception_nr)
{
	long retcode = CEE_SUCCESS;
//	SRVR_CALL_CONTEXT	srvrCallContext;
	// populate the SrvrCallContext
	if (exception_nr == -27 || exception_nr == -29 || exception_nr == -39 || 
		exception_nr == COMM_LINK_FAIL_EXCEPTION)
	{
		m_ConnectionDead = SQL_CD_TRUE;
		if (! m_CDInfoSent)
		{
/*			
			srvrCallContext.sqlHandle = this;
			srvrCallContext.ASSvc_ObjRef = m_ASSvc_ObjRef;
			srvrCallContext.SQLSvc_ObjRef = m_SQLSvc_ObjRef;
			srvrCallContext.srvrState = SRVR_ABENDED;
			retcode = resetSrvrState(&srvrCallContext);
			retcode = sendStopServer();
*/
			reset();
		}
	}
	else
		retcode = exception_nr;
	return retcode;
}

long CConnect::sendStopServer()
{
	long retcode=CEE_SUCCESS;
	SRVR_CALL_CONTEXT	srvrCallContext;

	srvrCallContext.sqlHandle = this;
	srvrCallContext.ASSvc_ObjRef = m_ASSvc_ObjRef;
	srvrCallContext.SQLSvc_ObjRef = m_SQLSvc_ObjRef;
	srvrCallContext.dialogueId = m_DialogueId;
	retcode = stopSrvrAbrupt(&srvrCallContext);

	return retcode;
}

SQLRETURN CConnect::Connect(SQLCHAR *ServerName, 
		   SQLSMALLINT	NameLength1,
           SQLCHAR		*UserName, 
		   SQLSMALLINT	NameLength2,
           SQLCHAR		*Authentication, 
		   SQLSMALLINT	NameLength3,
		   BOOL			readDSN)
{
	short					retCode=SQL_SUCCESS;
	HWND					currentWindow;
	TCHAR					windowText[128];
	CONNECTION_CONTEXT_def	inContext;
	USER_DESC_def			userDesc;
	SQLRETURN				rc;
//	SQLRETURN				rc1,rc2;
	char					ServerNameNTS[MAX_SQL_IDENTIFIER_LEN+1];
	char					UserNameNTS[MAX_SQL_IDENTIFIER_LEN+1];
	//Arvind: Modified to hold password of <128 Chars,128 Chars,128 Chars with NULL>
	char					AuthenticationNTS[3*MAX_SQL_IDENTIFIER_LEN+3];
	VERSION_def version[2];
	VERSION_def* versionPtr = &version[0];
	DWORD					clientUserNameLen=0;
	
	char computerNameUTF8[MAX_COMPUTERNAME_LENGTH*4+1];
	char windowTextUTF8[MAX_SQL_IDENTIFIER_LEN+1];
	char clientUserNameUTF8[MAX_SQL_IDENTIFIER_LEN+1];
	int  translen=0;
	char transError[128];
	
	clearError();

	m_CurrentOdbcAPI = SQL_API_SQLCONNECT;

	if (NameLength1 == SQL_NTS)
		strcpyUTF8(ServerNameNTS, (const char *)ServerName, sizeof(ServerNameNTS));
	else
	if (NameLength1 < sizeof(ServerNameNTS))
		strcpyUTF8(ServerNameNTS, (const char *)ServerName, sizeof(ServerNameNTS), NameLength1);
	else
	{
		setDiagRec(DRIVER_ERROR, IDS_IM_010);
		return SQL_ERROR;
	}

	if (UserName != NULL)
	{
		if (NameLength2 == SQL_NTS)
			strcpyUTF8(UserNameNTS, (const char *)UserName,sizeof(UserNameNTS));
		else
		if (NameLength2 < sizeof(UserNameNTS))
			strcpyUTF8(UserNameNTS, (const char *)UserName, sizeof(UserNameNTS), NameLength2);
		else
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			return SQL_ERROR;
		}
	}
	else
		UserNameNTS[0] = '\0';

	if (Authentication != NULL)
	{
		if (NameLength3 == SQL_NTS)
			strcpyUTF8(AuthenticationNTS, (const char *)Authentication, sizeof(AuthenticationNTS));
		else
		if (NameLength3 < sizeof(AuthenticationNTS))
			strcpyUTF8(AuthenticationNTS, (const char *)Authentication, sizeof(AuthenticationNTS), NameLength3);
		else
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			return SQL_ERROR;
		}
	}
	else
		AuthenticationNTS[0] = '\0';
	
	if (readDSN)
	{
		transError[0] = '\0';
		// Read DS Values (DS can now be only System DSN or User DSN)
		retCode = m_DSValue.readDSValues(ServerNameNTS, transError);

		switch (retCode)
		{
		case ERROR_SUCCESS:
			break;
		case DS_AS_KEY_NOT_FOUND:
			setDiagRec(DRIVER_ERROR, IDS_08_001_01, GetLastError());
			return SQL_ERROR;
		case DS_NOT_FOUND:
			setDiagRec(DRIVER_ERROR, IDS_IM_002);
			return SQL_ERROR;
		case DS_TRANSLATION_ERROR:
			if(transError[0] == '\0')
				setDiagRec(DRIVER_ERROR, IDS_TRANSLATE_ERROR);
			else
				setDiagRec(DRIVER_ERROR, IDS_TRANSLATE_ERROR, 0, transError);
			return SQL_ERROR;
		default:
			setDiagRec(DRIVER_ERROR, IDS_HY_000, GetLastError());
			return SQL_ERROR;
		}
	}

	// Update the connection attributes from DSValues if it is not set already 
	if (m_CurrentCatalog[0] == '\0')
		strcpy(m_CurrentCatalog, m_DSValue.m_DSCatalog);
	if (m_CurrentSchema[0] == '\0') 
		strcpy(m_CurrentSchema, m_DSValue.m_DSSchema);
	if (m_ConnectionTimeout == DRVR_PENDING)
		m_ConnectionTimeout = m_DSValue.m_DSConnectionTimeout;
	if (m_LoginTimeout == DRVR_PENDING)
		m_LoginTimeout = m_DSValue.m_DSLoginTimeout;
	if (m_TranslateLib[0] == '\0')
		strcpy(m_TranslateLib, m_DSValue.m_DSTranslationDLL);
	if (m_TranslateOption == DRVR_PENDING)
		m_TranslateOption = m_DSValue.m_DSTranslationOption;
	m_QueryTimeout = m_DSValue.m_DSQueryTimeout;
	m_SelectRowsets = m_DSValue.m_DSSelectRowsets;

	m_IOCompression = m_DSValue.m_DSIOCompression;
	if (m_asTCPIPSystem != NULL)
		m_asTCPIPSystem->m_IOCompression = m_IOCompression;
	if (m_srvrTCPIPSystem != NULL)
		m_srvrTCPIPSystem->m_IOCompression = m_IOCompression;

	if (m_asTCPIPSystem != NULL)
		m_asTCPIPSystem->m_IOCompressionThreshold = m_DSValue.m_DSIOCompressionThreshold;
	if (m_srvrTCPIPSystem != NULL)
		m_srvrTCPIPSystem->m_IOCompressionThreshold = m_DSValue.m_DSIOCompressionThreshold;
	//if (m_DSValue.m_DSServiceName[0] != 0)
	///	strcpy(m_QSServiceName, m_DSValue.m_DSServiceName);
	
	// Set the Assocation Service Object Reference
	strcpy(m_ASSvc_ObjRef, m_DSValue.m_DSServer);
	strcat(m_ASSvc_ObjRef, ":NonStopODBCAS");

	m_RowsetErrorRecovery = m_DSValue.m_DSRowsetErrorRecovery;
	m_FetchBufferSize = m_DSValue.m_DSFetchBufferSize;
	m_FlushFetchData = m_DSValue.m_DSFlushFetchData;

	/*
	// Load the Translation DLL
	if (InitializeTranslation() != SQL_SUCCESS)
		return SQL_ERROR;
	*/

	// populate the inContext
	inContext.location[0] = '\0';
	inContext.userRole[0] = '\0';
    inContext.sessionName[0] = '\0';

	if (m_DSValue.m_DSServerDSName[0] != 0)
		strcpy(inContext.datasource, m_DSValue.m_DSServerDSName);
	else
		strcpy(inContext.datasource, m_DSValue.m_DSName);
	strcpy(inContext.catalog, m_CurrentCatalog);
	strcpy(inContext.schema, m_DSValue.m_DSSchema);

	inContext.accessMode = (IDL_short)m_AccessMode;
	inContext.autoCommit = (IDL_short)m_AutoCommit; 
	inContext.queryTimeoutSec = m_ConnectionTimeout;
	inContext.idleTimeoutSec = 0;
	inContext.loginTimeoutSec = m_LoginTimeout;
	inContext.txnIsolationLevel = (IDL_short)m_TxnIsolation;
	if (m_FetchBufferSize < 0)
		inContext.rowSetSize = 0;
	else
		inContext.rowSetSize = (short)(m_FetchBufferSize/1024);
	inContext.diagnosticFlag = 0;
	inContext.processId = gDrvrGlobal.gProcessId;

	if (TranslateUTF8(FALSE, gDrvrGlobal.gComputerName, strlen(gDrvrGlobal.gComputerName),
			      computerNameUTF8, sizeof(computerNameUTF8), &translen, transError) != SQL_SUCCESS)
	{
		setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Translation Failed: gDrvrGlobal.gComputerName");
		return SQL_ERROR;
	}
	if (strlen(computerNameUTF8) > 0)
		strcpyUTF8(gDrvrGlobal.gComputerName, computerNameUTF8, sizeof(gDrvrGlobal.gComputerName));
	else
		strcpy(gDrvrGlobal.gComputerName, "UNKNOWN");
	strcpy(inContext.computerName, gDrvrGlobal.gComputerName);

	if (m_DSValue.m_DSServiceName[0] != 0)
		strcpy(m_QSServiceName, m_DSValue.m_DSServiceName);

	if ((currentWindow = GetActiveWindow()) != NULL)
	{
		if (GetWindowText(currentWindow, windowText, sizeof(windowText)) == 0)
		{
			if(GetModuleBaseName(GetCurrentProcess(), NULL, windowText,sizeof(windowText)) == 0)
#ifdef _WIN64
				strcpy(windowText,"WINDOWSODBC64");
#else
				strcpy(windowText,"WINDOWSODBC");
#endif
		}
	}
	else
	{
		if(GetModuleBaseName(GetCurrentProcess(), NULL, windowText,sizeof(windowText)) == 0)
#ifdef _WIN64
			strcpy(windowText,"WINDOWSODBC64");
#else
			strcpy(windowText,"WINDOWSODBC");
#endif
	}
	if (TranslateUTF8(FALSE, windowText, strlen(windowText), windowTextUTF8, sizeof(windowTextUTF8), &translen, transError) != SQL_SUCCESS)
	{
		setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Translation Failed: windowText");
		return SQL_ERROR;
	}

	//wms_mapping
	if(m_applName[0] != '\0') 
	{
		inContext.inContextOptions2 |= MAPPING_APPL;
		inContext.windowText = m_applName; 
	}
	else if(m_DSValue.m_DSApplication[0] != '\0') 
	{
		inContext.inContextOptions2 |= MAPPING_APPL;
		inContext.windowText = m_DSValue.m_DSApplication; 
	}
	else
		inContext.windowText = windowTextUTF8;

	ODBCNLS_GetCodePage (&inContext.ctxACP);
	inContext.ctxDataLang = SQLCHARSETCODE_UTF8;
	inContext.ctxErrorLang = SQLCHARSETCODE_ISO88591;
	inContext.ctxCtrlInferNCHAR = -1;
	if(m_StartNode == -1)
		inContext.cpuToUse = -1;
	else
		inContext.cpuToUse = m_StartNode;
    inContext.connectOptions = NULL;
	inContext.inContextOptions1 = 0;
	inContext.inContextOptions2 = 0;

	//wms_mapping
	if(m_QueryID_SessionName[0] != '\0')
	{
		inContext.inContextOptions1 = inContext.inContextOptions1 | INCONTEXT_OPT1_SESSIONNAME;
		inContext.inContextOptions2 |= MAPPING_SESSION;
		strcpy(inContext.sessionName,m_QueryID_SessionName);
	}
	else if(m_DSValue.m_DSSession[0] != '\0') 
	{
		inContext.inContextOptions1 = inContext.inContextOptions1 | INCONTEXT_OPT1_SESSIONNAME;
		inContext.inContextOptions2 |= MAPPING_SESSION;
		strcpy(inContext.sessionName,m_DSValue.m_DSSession);
	}

	if(m_FetchAhead == 1)
		inContext.inContextOptions1 = inContext.inContextOptions1 | INCONTEXT_OPT1_FETCHAHEAD;

	if(strlen(m_UserRole) > 0)
	{
		strcpy(inContext.userRole,m_UserRole);
	}
	else if(m_DSValue.m_DSRoleName[0] != '\0')
	{
		strcpy(inContext.userRole,m_DSValue.m_DSRoleName);
	}

	// Set the version no of ODBC Driver
	inContext.clientVersionList._length = 2; 
	inContext.clientVersionList._buffer = versionPtr; 
	versionPtr->componentId = gDrvrGlobal.gClientVersion.componentId; 
	versionPtr->majorVersion = 3;
	versionPtr->minorVersion = 0;
	versionPtr->buildId = gDrvrGlobal.gClientVersion.buildId | ROWWISE_ROWSET | CHARSET | PASSWORD_SECURITY;
	versionPtr++;
	versionPtr->componentId = APP_COMPONENT; 
	versionPtr->majorVersion = (IDL_short)m_EnvHandle->getODBCAppVersion();
	versionPtr->minorVersion = 0;
    versionPtr->buildId = 0;
	memcpy(inContext.clientVproc,gDrvrGlobal.gClientVproc,sizeof(gDrvrGlobal.gClientVproc));

	// populate the userDesc
	if (! getUserDesc(UserNameNTS, AuthenticationNTS, &userDesc))
		return SQL_ERROR;

	// Get client user name.
	clientUserNameLen = sizeof(UserNameNTS);
	if (GetUserName(UserNameNTS, &clientUserNameLen))
	{
		if (TranslateUTF8(FALSE, UserNameNTS, strlen(UserNameNTS),
				      clientUserNameUTF8, sizeof(clientUserNameUTF8), &translen, transError) != SQL_SUCCESS)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Translation Failed: UserNameNTS");
			return SQL_ERROR;
		}
		inContext.clientUserName = clientUserNameUTF8;
		inContext.inContextOptions1 = inContext.inContextOptions1 | INCONTEXT_OPT1_CLIENT_USERNAME;
	}
	else
		inContext.clientUserName = NULL;


	m_ConnectionDead = SQL_CD_TRUE;
	m_CDInfoSent = TRUE;				// May need to investigate

	
	// populate the SrvrCallContext
	m_srvrCallContext.sqlHandle = this;
	m_srvrCallContext.ASSvc_ObjRef = m_ASSvc_ObjRef;
	m_srvrCallContext.eventHandle = m_ConnectEvent;
	m_srvrCallContext.u.connectParams.loginTimeout = m_LoginTimeout;
	m_srvrCallContext.u.connectParams.inContext = &inContext;
	m_srvrCallContext.u.connectParams.userDesc = &userDesc;
	m_srvrCallContext.maxRowsetSize=-1;

retryGetObjRef:

	m_srvrCallContext.odbcAPI = SQL_API_GETOBJREF;
	m_srvrCallContext.SQLSvc_ObjRef = NULL;
	
	rc = ThreadControlProc(&m_srvrCallContext);
	if (rc == SQL_ERROR)
		return rc;
	m_srvrCallContext.odbcAPI = SQL_API_SQLCONNECT;
	m_srvrCallContext.SQLSvc_ObjRef = m_SQLSvc_ObjRef;
	m_srvrCallContext.dialogueId = m_DialogueId;

	if (m_SecurityMode == 1) // for pwd security
	{
		// this is the new encryption method R2.5+
		DoEncryption(m_SecPwd,m_SecInfo,userDesc,AuthenticationNTS,inContext);
	}

	rc = ThreadControlProc(&m_srvrCallContext);
	if (m_RetryEncryption && m_SecurityMode == 1)
	{
		m_RetryEncryption = false;
		retCode = SQL_SUCCESS;
//reset userDesc.username, it would have cleared up in the prev DoEncryption()
		userDesc.userName = m_UserName;
		if(userDesc.password._buffer != NULL && m_SecurityMode == 1)
			delete[] userDesc.password._buffer;
		DoEncryption(m_SecPwd,m_SecInfo,userDesc,AuthenticationNTS,inContext);

		rc = ThreadControlProc(&m_srvrCallContext);
	}
	switch (rc)
	{
	case SQL_STILL_EXECUTING:
		goto retryGetObjRef;
		break;
	case SQL_SUCCESS:
	case SQL_SUCCESS_WITH_INFO:
		// Return SQL_SUCCESS_WITH_INFO if the datasource names are not same
		if (m_DSValue.m_DSServerDSName[0] != 0)
		{
			if (strcmp(m_DSValue.m_DSServerDSName, m_SrvrDSName) != 0)
			{
				setDiagRec(DRIVER_ERROR, IDS_01_000_01, 0, NULL, NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1, m_SrvrDSName);
				rc = SQL_SUCCESS_WITH_INFO;
			}
		}
		else
		if (strcmp(m_DSValue.m_DSName, m_SrvrDSName) != 0)
		{
			setDiagRec(DRIVER_ERROR, IDS_01_000_01, 0, NULL, NULL, SQL_ROW_NUMBER_UNKNOWN, SQL_COLUMN_NUMBER_UNKNOWN, 1, m_SrvrDSName);
			rc = SQL_SUCCESS_WITH_INFO;
		}

		// update the ConnectionDead values
		m_ConnectionDead = SQL_CD_FALSE;
		m_CDInfoSent	= FALSE;

		break;
	default:
		break;
	}
	if (rc != SQL_ERROR)
	{	
		if (m_DSValue.m_DSServiceName[0] != 0)
		{
			rc = SetConnectAttr(SET_SERVICE_NAME, 0, m_QSServiceName, NULL);
		}   
	}

	if(userDesc.password._buffer  != NULL)
	{
		if(m_SecurityMode == 1)
			delete[] userDesc.password._buffer;
		userDesc.password._length = 0;
		userDesc.password._buffer = NULL;
	}
	return rc;
}


SQLRETURN CConnect::Disconnect()
{
	SQLRETURN rc = SQL_SUCCESS;
	CHANDLECOLLECT::iterator i;

	clearError();
// If SQLBrowseConnect returns SQL_NEED_DATA
	if ( m_CurrentOdbcAPI == SQL_API_SQLBROWSECONNECT)
	{
		m_CurrentOdbcAPI = SQL_API_SQLDISCONNECT;
	}
	else
	{
		m_CurrentOdbcAPI = SQL_API_SQLDISCONNECT;
		if (m_ConnectionDead == SQL_CD_TRUE)
		{
			setDiagRec(DRIVER_ERROR, IDS_08_S01);
			rc = SQL_SUCCESS_WITH_INFO;
		}
		else
		{
			for (i = m_StmtCollect.begin() ; i !=  m_StmtCollect.end() ; ++i)
			{
				CStmt* pStmt = ((CStmt *)(*i));
				if (pStmt->m_AsyncEnable == SQL_ASYNC_ENABLE_ON && pStmt->m_AsyncThread != NULL)
				{
					setDiagRec(DRIVER_ERROR, IDS_HY_010);
					return SQL_ERROR;
				}
			}

			m_srvrCallContext.odbcAPI = SQL_API_SQLDISCONNECT;
			m_srvrCallContext.sqlHandle = this;
			m_srvrCallContext.SQLSvc_ObjRef = m_SQLSvc_ObjRef;
			m_srvrCallContext.ASSvc_ObjRef = m_ASSvc_ObjRef;
			m_srvrCallContext.eventHandle = m_ConnectEvent;
			m_srvrCallContext.dialogueId = m_DialogueId;
			m_srvrCallContext.connectionTimeout = m_ConnectionTimeout;
			m_srvrCallContext.maxRowsetSize=-1;
			rc = ThreadControlProc(&m_srvrCallContext);
			if (rc == -25000)
				return SQL_ERROR;
			rc = SQL_SUCCESS;

			while ((i = m_StmtCollect.begin()) !=  m_StmtCollect.end())
				delete ((CStmt *)(*i));

			while ((i = m_DescCollect.begin()) !=  m_DescCollect.end())
				delete ((CDesc *)(*i));
		}
	}
	reset(rc == SQL_SUCCESS );
	m_ConnectionDead = SQL_CD_TRUE;
	m_CDInfoSent = TRUE;

	m_asTCPIPSystem->resetSwap();
	m_srvrTCPIPSystem->resetSwap();

	return rc;
}

INT_PTR CALLBACK ConnectDialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
)
{
	CONNECT_FIELD_ITEMS		*connectFieldItems;
	BOOL					retCode;
	HWND					hwndOwner; 
	RECT					rc, rcDlg, rcOwner; 
 
	switch (uMsg)
	{
	case WM_INITDIALOG:
		connectFieldItems = (CONNECT_FIELD_ITEMS *)lParam;
		SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG_PTR)connectFieldItems);
	    retCode = SetDlgItemText(hwndDlg, IDC_LOGIN_ID, connectFieldItems->loginId);
  		retCode = SetDlgItemText(hwndDlg, IDC_PASSWORD, connectFieldItems->password);
  		retCode = SetDlgItemText(hwndDlg, IDC_CATALOG, connectFieldItems->catalog);
  		retCode = SetDlgItemText(hwndDlg, IDC_SCHEMA, connectFieldItems->schema);
		// Set the Dialog Window Pos
		// Get the owner window and dialog box rectangles. 
// 	    if ((hwndOwner = GetParent(hwndDlg)) == NULL) 
//      {
            hwndOwner = GetDesktopWindow(); 
//      }

        GetWindowRect(hwndOwner, &rcOwner); 
        GetWindowRect(hwndDlg, &rcDlg); 
        CopyRect(&rc, &rcOwner); 
 
         // Offset the owner and dialog box rectangles so that 
         // right and bottom values represent the width and 
         // height, and then offset the owner again to discard 
         // space taken up by the dialog box. 
 
        OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top); 
        OffsetRect(&rc, -rc.left, -rc.top); 
        OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom); 
 
         // The new position is the sum of half the remaining 
         // space and the owner's original position. 
 
        SetWindowPos(hwndDlg, 
            HWND_TOP, 
            rcOwner.left + (rc.right / 2), 
            rcOwner.top + (rc.bottom / 2), 
            0, 0,          // ignores size arguments 
            SWP_NOSIZE); 
 
        if (GetDlgCtrlID((HWND) wParam) != IDC_LOGIN_ID) 
        { 
            SetFocus(GetDlgItem(hwndDlg, IDC_LOGIN_ID)); 
            return FALSE; 
        } 
  		return TRUE;
	case WM_COMMAND:
		connectFieldItems = (CONNECT_FIELD_ITEMS*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);
		switch (LOWORD(wParam))
		{
		case IDOK:
			if (!GetDlgItemText(hwndDlg, IDC_LOGIN_ID, connectFieldItems->loginId,
						sizeof(connectFieldItems->loginId)))
					connectFieldItems->loginId[0] = '\0';
            if (!GetDlgItemText(hwndDlg, IDC_PASSWORD, connectFieldItems->password,
						sizeof(connectFieldItems->password)))
					connectFieldItems->password[0] = '\0';
//            if (!GetDlgItemText(hwndDlg, IDC_CATALOG, connectFieldItems->catalog,
//						sizeof(connectFieldItems->catalog)))
//					connectFieldItems->catalog[0] = '\0';
            if (!GetDlgItemText(hwndDlg, IDC_SCHEMA, connectFieldItems->schema,
						sizeof(connectFieldItems->schema)))
					connectFieldItems->schema[0] = '\0';            
			EndDialog(hwndDlg, TRUE);
			break;
		case IDCANCEL:
			EndDialog(hwndDlg, FALSE);
			break;
		}
		return TRUE;
	default:
		return FALSE;
	}
}

INT_PTR CALLBACK ConnectDriverKWDialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
)
{
	CONNECT_FIELD_ITEMS		*connectFieldItems;
	BOOL					retCode;
	HWND					hwndOwner; 
	RECT					rc, rcDlg, rcOwner; 
 
	switch (uMsg)
	{
	case WM_INITDIALOG:
		connectFieldItems = (CONNECT_FIELD_ITEMS*)GetWindowLongPtr(hwndDlg,DWLP_USER);
		if(connectFieldItems==NULL)
			return FALSE;
	    retCode = SetDlgItemText(hwndDlg, IDC_DKW_SERVER, connectFieldItems->server);
  		retCode = SetDlgItemText(hwndDlg, IDC_DKW_LOGIN_ID, connectFieldItems->loginId);
  		retCode = SetDlgItemText(hwndDlg, IDC_DKW_PASSWORD, connectFieldItems->password);
  		retCode = SetDlgItemText(hwndDlg, IDC_DKW_CATALOG, connectFieldItems->catalog);
  		retCode = SetDlgItemText(hwndDlg, IDC_DKW_SCHEMA, connectFieldItems->schema);
		// Set the Dialog Window Pos  
		// Get the owner window and dialog box rectangles. 
 	    if ((hwndOwner = GetParent(hwndDlg)) == NULL) 
	    {
            hwndOwner = GetDesktopWindow(); 
		}

        GetWindowRect(hwndOwner, &rcOwner); 
        GetWindowRect(hwndDlg, &rcDlg); 
        CopyRect(&rc, &rcOwner); 
 
         // Offset the owner and dialog box rectangles so that 
         // right and bottom values represent the width and 
         // height, and then offset the owner again to discard 
         // space taken up by the dialog box. 
 
        OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top); 
        OffsetRect(&rc, -rc.left, -rc.top); 
        OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom); 
 
         // The new position is the sum of half the remaining 
         // space and the owner's original position. 
 
        SetWindowPos(hwndDlg, 
            HWND_TOP, 
            rcOwner.left + (rc.right / 2), 
            rcOwner.top + (rc.bottom / 2), 
            0, 0,          // ignores size arguments 
            SWP_NOSIZE); 
 
        if (GetDlgCtrlID((HWND) wParam) != IDC_DKW_SERVER) 
        { 
            SetFocus(GetDlgItem(hwndDlg, IDC_DKW_SERVER)); 
            return FALSE; 
        } 
  		return TRUE;
	case WM_COMMAND:
		connectFieldItems = (CONNECT_FIELD_ITEMS*)GetWindowLongPtr(hwndDlg,DWLP_USER);
		if(connectFieldItems==NULL)
			return FALSE;
		switch (LOWORD(wParam))
		{
		case IDOK:
			if (!GetDlgItemText(hwndDlg, IDC_DKW_SERVER, connectFieldItems->server,
						sizeof(connectFieldItems->server)))
					connectFieldItems->server[0] = '\0';
            if (!GetDlgItemText(hwndDlg, IDC_DKW_LOGIN_ID, connectFieldItems->loginId,
						sizeof(connectFieldItems->loginId)))
					connectFieldItems->loginId[0] = '\0';
            if (!GetDlgItemText(hwndDlg, IDC_DKW_PASSWORD, connectFieldItems->password,
						sizeof(connectFieldItems->password)))
					connectFieldItems->password[0] = '\0';
//            if (!GetDlgItemText(hwndDlg, IDC_DKW_CATALOG, connectFieldItems->catalog,
//						sizeof(connectFieldItems->catalog)))
//					connectFieldItems->catalog[0] = '\0';
            if (!GetDlgItemText(hwndDlg, IDC_DKW_SCHEMA, connectFieldItems->schema,
						sizeof(connectFieldItems->schema)))
					connectFieldItems->schema[0] = '\0';
			if (connectFieldItems->server[0] == '\0'){
				MessageBox(hwndDlg, MSG_SERVERID_EMPTY, ODBCMX_ERROR_MSGBOX_TITLE, MB_OK | MB_ICONEXCLAMATION );
				SetFocus(GetDlgItem(hwndDlg, IDC_DKW_SERVER)); 
            }
			PostMessage(hwndDlg,WM_QUIT,0,0);
			break;
		case IDCANCEL:
			PostMessage(hwndDlg,WM_QUIT,1,0);
			break;
		}
		return TRUE;
	default:
		return FALSE;
	}
}

/****************************************************************************
*  Added by RAJANI
*  Function Name	: ChangePwdProc
*  Arguments		: 1-> handle to dialog box
*  			  2-> message
*  			  3-> first message parameter
*  			  4-> second message parameter
*  Purpose		: Function to populate the dialog box for 
*  			  receving the inputs from the user for 
*  			  changing the password
******************************************************************************/
INT_PTR CALLBACK ChangePwdProc(
			HWND hwndDlg,  // handle to dialog box
			UINT uMsg,     // message
			WPARAM wParam, // first message parameter
			LPARAM lParam  // second message parameter
			)
{
	CONNECT_FIELD_ITEMS		*connectFieldItems;
	BOOL					retCode;
	HWND					hwndOwner; 
	RECT					rc, rcDlg, rcOwner;
	char	newpassword[MAX_SQL_IDENTIFIER_LEN+1];
	char	verifypwd[MAX_SQL_IDENTIFIER_LEN+1];
	switch (uMsg)
	{
	case WM_INITDIALOG:
		connectFieldItems = (CONNECT_FIELD_ITEMS *)lParam;
		SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG_PTR)connectFieldItems);
  		retCode = SetDlgItemText(hwndDlg, IDC_USERNAME, connectFieldItems->loginId);
		hwndOwner = GetDesktopWindow(); 

        GetWindowRect(hwndOwner, &rcOwner); 
        GetWindowRect(hwndDlg, &rcDlg); 
        CopyRect(&rc, &rcOwner); 
 
         // Offset the owner and dialog box rectangles so that 
         // right and bottom values represent the width and 
         // height, and then offset the owner again to discard 
         // space taken up by the dialog box. 
 
		OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top); 
		OffsetRect(&rc, -rc.left, -rc.top); 
		OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom); 
 
		// The new position is the sum of half the remaining 
		// space and the owner's original position. 
 
		SetWindowPos(hwndDlg, HWND_TOP, rcOwner.left + (rc.right / 2),
			rcOwner.top + (rc.bottom / 2), 
            0, 0,          // ignores size arguments 
            SWP_NOSIZE); 
  		return TRUE;
	case WM_COMMAND:
		connectFieldItems = (CONNECT_FIELD_ITEMS*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);
		switch (LOWORD(wParam))
		{
		case IDOK:
			if (!GetDlgItemText(hwndDlg, IDC_USERNAME, connectFieldItems->loginId,
						sizeof(connectFieldItems->loginId)))
			{	
					connectFieldItems->loginId[0] = '\0';
					MessageBox(hwndDlg, MSG_USERNAME_EMPTY, ODBCMX_ERROR_MSGBOX_TITLE, MB_OK | MB_ICONEXCLAMATION );
					SetFocus(GetDlgItem(hwndDlg, IDC_USERNAME));
					break;
			}
            if (!GetDlgItemText(hwndDlg, IDC_OLD_PWD, connectFieldItems->password,
						sizeof(connectFieldItems->password)))
			{
					connectFieldItems->password[0] = '\0';
					MessageBox(hwndDlg, MSG_OLDPASSWORD_EMPTY, ODBCMX_ERROR_MSGBOX_TITLE, MB_OK | MB_ICONEXCLAMATION );
					SetFocus(GetDlgItem(hwndDlg, IDC_OLD_PWD));
					break;
			}
			if (!GetDlgItemText(hwndDlg, IDC_NEW_PWD, newpassword,
						sizeof(newpassword)))
			{
					newpassword[0] = '\0';
					MessageBox(hwndDlg, MSG_NEWPASSWORD_EMPTY, ODBCMX_ERROR_MSGBOX_TITLE, MB_OK | MB_ICONEXCLAMATION );
					SetFocus(GetDlgItem(hwndDlg, IDC_NEW_PWD));
					break;
			}
			if (!GetDlgItemText(hwndDlg, IDC_VERIFY_PWD, verifypwd,
						sizeof(verifypwd)))
			{
					verifypwd[0] = '\0';
					MessageBox(hwndDlg, MSG_VERIFYPASSWORD_EMPTY, ODBCMX_ERROR_MSGBOX_TITLE, MB_OK | MB_ICONEXCLAMATION );
					SetFocus(GetDlgItem(hwndDlg, IDC_VERIFY_PWD));
					break;
			}
			else if ( strcmp(newpassword,verifypwd) != 0)  
			{
				    MessageBox(hwndDlg, MSG_VERIFYPASSWORD_EQUAL, ODBCMX_ERROR_MSGBOX_TITLE, MB_OK | MB_ICONEXCLAMATION );
					SetFocus(GetDlgItem(hwndDlg, IDC_NEW_PWD));
					newpassword[0]='\0';
					verifypwd[0]='\0';
					break;
			}
			if ( strlen(newpassword)!= 0 && strlen(verifypwd)!= 0 )
			{
					sprintf(connectFieldItems->password,"%s,%s,%s",connectFieldItems->password,newpassword,verifypwd);
					EndDialog(hwndDlg, TRUE);
			}
			break;
		case IDCANCEL:
			EndDialog(hwndDlg, FALSE);
			break;
		}
		return TRUE;
	default:
		return FALSE;
	}
}

SQLRETURN CConnect::generateConnectionString(CONNECT_KEYWORD_TREE *KeywordTree, 
				CONNECT_FIELD_ITEMS	*ConnectFieldItems,
				short				DSNAttrNo, 
				SQLCHAR				*OutConnectionString,
				SQLSMALLINT			BufferLength,
				SQLSMALLINT 		*StringLength2Ptr)
{
	SQLRETURN		rc = SQL_SUCCESS;
	char			tempBuffer[1029];
	char			*equalString = "=";
	char			*colonString = ";";
	SQLSMALLINT		strLen;
	SQLSMALLINT		lengthCopied;
	SQLSMALLINT		totalLength;
	short			i;

	tempBuffer[0] = 0;
	// Write DSN or DRIVER name
	if (DSNAttrNo < KEY_MAX)
	{
		strcpy(tempBuffer, ConnectKeywords[DSNAttrNo]);
		strcat(tempBuffer, equalString);
		strncat(tempBuffer, KeywordTree[DSNAttrNo].AttrValue, KeywordTree[DSNAttrNo].AttrLength);
		strcat(tempBuffer, colonString);
	}
	
	// set the index to i = KEY_SERVER to start copying the attributes from then onwards till KEY_MAX
	i = KEY_SERVER;
	lengthCopied = 0;
	totalLength = 0;
	do
	{
		strLen = strlen(tempBuffer);
		totalLength += strLen;
		if (strLen != 0 && BufferLength != 0 && lengthCopied < BufferLength-1)
		{
			if (BufferLength == SQL_NTS || (BufferLength > 0 && strLen+lengthCopied < BufferLength))
			{
				strcpy((char *)(OutConnectionString+lengthCopied), tempBuffer);
				lengthCopied += strLen;
			}
			else
			{
				strLen = BufferLength-lengthCopied;
				strcpyUTF8((char *)(OutConnectionString+lengthCopied), tempBuffer, strLen);
				lengthCopied = BufferLength-1;
				setDiagRec(DRIVER_ERROR, IDS_01_004);
				rc = SQL_SUCCESS_WITH_INFO;
			}
		}
		tempBuffer[0] = '\0';
		switch (i)
		{
		case KEY_SAVEFILE:
			if (KeywordTree[i].AttrRank != 0)
			{
				strcpy(tempBuffer, ConnectKeywords[i]);
				strcat(tempBuffer, equalString);
				strncat(tempBuffer, KeywordTree[i].AttrValue, KeywordTree[DSNAttrNo].AttrLength);
				strcat(tempBuffer, colonString);
			}
			break;
		case KEY_UID:
			sprintf(tempBuffer, "%s=%s;", ConnectKeywords[i], ConnectFieldItems->loginId);
			break;
		case KEY_PWD:
			sprintf(tempBuffer, "%s=%s;", ConnectKeywords[i], ConnectFieldItems->password);
			break;
		case KEY_CATALOG:
			if (strlen(ConnectFieldItems->catalog) == 0)
			{
				sprintf(tempBuffer, "%s=TRAFODION;", ConnectKeywords[i]);
			}
			else
			{
				sprintf(tempBuffer, "%s=%s;", ConnectKeywords[i], ConnectFieldItems->catalog);
			}
			break;
		case KEY_SCHEMA:
			sprintf(tempBuffer, "%s=%s;", ConnectKeywords[i], ConnectFieldItems->schema);
			break;
		case KEY_SERVER:
			if (ConnectFieldItems->server[0] != '\0')
				sprintf(tempBuffer, "%s=%s;", ConnectKeywords[i], ConnectFieldItems->server);
			break;
		default:
			break;
		}
	}
	while (i++ < KEY_MAX) ;
	if (StringLength2Ptr != NULL)
		*StringLength2Ptr = totalLength;
	return rc;
}

SQLRETURN CConnect::prepareForConnect(CONNECT_KEYWORD_TREE *KeywordTree, 
									  CONNECT_FIELD_ITEMS &connectFieldItems, 
									  short DSNAttrNo,
									  short	DSNType,
									  char	*ServerNameNTS)
{
	short	retCode;
	char	transError[128];

	// Initialize the Keyword Attributes
	connectFieldItems.loginId[0] = '\0';
	connectFieldItems.password[0] = '\0';
	connectFieldItems.schema[0] = '\0';
	connectFieldItems.catalog[0] = '\0';
	connectFieldItems.server[0] = '\0';
	
	switch (DSNType)
	{
	case UNKNOWN_DSN:
		if (DSNAttrNo != KEY_MAX)
		{
			if (KeywordTree[DSNAttrNo].AttrLength > 0 && KeywordTree[DSNAttrNo].AttrLength <= MAX_SQL_IDENTIFIER_LEN)
				strcpyUTF8(ServerNameNTS, (const char *)KeywordTree[DSNAttrNo].AttrValue, MAX_SQL_IDENTIFIER_LEN+1, KeywordTree[DSNAttrNo].AttrLength);
			else
			{
				setDiagRec(DRIVER_ERROR, IDS_IM_010);
				return SQL_ERROR;
			}
		}
		transError[0] = '\0';
		// Read DS Values (DS can now be only System DSN or User DSN)
		retCode = m_DSValue.readDSValues(ServerNameNTS, transError);

		switch (retCode)
		{
		case ERROR_SUCCESS:
			break;
		case DS_AS_KEY_NOT_FOUND:
			setDiagRec(DRIVER_ERROR, IDS_08_001_01, GetLastError());
			return SQL_ERROR;
		case DS_NOT_FOUND:
			setDiagRec(DRIVER_ERROR, IDS_IM_002);
			return SQL_ERROR;
		case DS_TRANSLATION_ERROR:
			if (transError[0] != '\0')
				setDiagRec(DRIVER_ERROR, IDS_TRANSLATE_ERROR);
			else
				setDiagRec(DRIVER_ERROR, IDS_TRANSLATE_ERROR, 0, transError);
			return SQL_ERROR;
		default:
			setDiagRec(DRIVER_ERROR, IDS_HY_000, GetLastError());
			return SQL_ERROR;
		}
		break;
	case DRIVER_KW_DSN:
		break;
	default:
		return SQL_ERROR;
	}
	if (KeywordTree[KEY_SERVER].AttrRank != 0 && KeywordTree[KEY_SERVER].AttrLength > 0)
		strcpyUTF8(connectFieldItems.server, KeywordTree[KEY_SERVER].AttrValue,
					sizeof(connectFieldItems.server), KeywordTree[KEY_SERVER].AttrLength);
	else
		strcpy(connectFieldItems.server, m_DSValue.m_DSServer);
	if (KeywordTree[KEY_CATALOG].AttrRank != 0 && KeywordTree[KEY_CATALOG].AttrLength > 0)
		strcpyUTF8(connectFieldItems.catalog, KeywordTree[KEY_CATALOG].AttrValue,
					sizeof(connectFieldItems.catalog), KeywordTree[KEY_CATALOG].AttrLength);
	else
		strcpy(connectFieldItems.catalog, m_DSValue.m_DSCatalog);
	
	if (KeywordTree[KEY_SCHEMA].AttrRank != 0 && KeywordTree[KEY_SCHEMA].AttrLength > 0)
	{
		if (KeywordTree[KEY_SCHEMA].AttrValue[0] == '{' && KeywordTree[KEY_SCHEMA].AttrValue[KeywordTree[KEY_SCHEMA].AttrLength-1] == '}')
		{
			int i,j;
			for (i=0,j=1; j<KeywordTree[KEY_SCHEMA].AttrLength-1; i++, j++)
			{
				connectFieldItems.schema[i] = KeywordTree[KEY_SCHEMA].AttrValue[j];
				if(KeywordTree[KEY_SCHEMA].AttrValue[j] == '}' && KeywordTree[KEY_PWD].AttrValue[j+1] == '}')
					j++; // The '}' character is escaped as '}}'
			}
			connectFieldItems.schema[i] = '\0';
		}
		else
			strcpyUTF8(connectFieldItems.schema, KeywordTree[KEY_SCHEMA].AttrValue,
						sizeof(connectFieldItems.schema), KeywordTree[KEY_SCHEMA].AttrLength);
	}
	else
		strcpy(connectFieldItems.schema, m_DSValue.m_DSSchema);
	if (KeywordTree[KEY_UID].AttrRank != 0 && KeywordTree[KEY_UID].AttrLength > 0)
	{
		if (KeywordTree[KEY_UID].AttrValue[0] == '{' && KeywordTree[KEY_UID].AttrValue[KeywordTree[KEY_UID].AttrLength-1] == '}')
		{
			int i,j;
			for (i=0, j=1; j<KeywordTree[KEY_UID].AttrLength-1; i++, j++)
			{
				connectFieldItems.loginId[i] = KeywordTree[KEY_UID].AttrValue[j];
				if(KeywordTree[KEY_UID].AttrValue[j] == '}' && KeywordTree[KEY_UID].AttrValue[j+1] == '}')
					j++; // The '}' character is escaped as '}}'	
			}
			connectFieldItems.loginId[i] = '\0';
		}
		else
			strcpyUTF8(connectFieldItems.loginId, KeywordTree[KEY_UID].AttrValue,
						sizeof(connectFieldItems.loginId), KeywordTree[KEY_UID].AttrLength);
	}
	else
		connectFieldItems.loginId[0] = '\0';
	if (KeywordTree[KEY_PWD].AttrRank != 0 && KeywordTree[KEY_PWD].AttrLength > 0)
	{
		if (KeywordTree[KEY_PWD].AttrValue[0] == '{' && KeywordTree[KEY_PWD].AttrValue[KeywordTree[KEY_PWD].AttrLength-1] == '}')
		{
			int i,j;
			for (i=0, j=1; j<KeywordTree[KEY_PWD].AttrLength-1; i++, j++)
			{
				connectFieldItems.password[i] = KeywordTree[KEY_PWD].AttrValue[j];
				if(KeywordTree[KEY_PWD].AttrValue[j] == '}' && KeywordTree[KEY_PWD].AttrValue[j+1] == '}')
					j++; // The '}' character is escaped as '}}'	
			}
			connectFieldItems.password[i] = '\0';
		}
		else
			strcpyUTF8(connectFieldItems.password, KeywordTree[KEY_PWD].AttrValue,
						sizeof(connectFieldItems.password), KeywordTree[KEY_PWD].AttrLength);
	}
	else
		connectFieldItems.password[0] = '\0';

	return SQL_SUCCESS;
}

SQLRETURN CConnect::AllocHandle(SQLSMALLINT HandleType, 
			SQLHANDLE InputHandle, 
			SQLHANDLE *OutputHandle)
{
	SQLRETURN				rc = SQL_SUCCESS;
	CStmt* pStmt;

	switch (HandleType)
	{
	case SQL_HANDLE_STMT:
		pStmt = new CStmt(InputHandle);
		if (pStmt != NULL)
		{
			if ((rc = pStmt->initialize()) == SQL_SUCCESS)
				*OutputHandle = pStmt;
			else
			{
				delete pStmt;
				rc = SQL_ERROR;
			}
		}
		else
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_001);
			rc = SQL_ERROR;
		}
		break;
	case SQL_HANDLE_DESC:
		*OutputHandle = new CDesc(InputHandle, SQL_DESC_MODE_UNKNOWN, SQL_DESC_ALLOC_USER);
		if (*OutputHandle != NULL)
		{
			m_DescCollect.push_back((CDesc*)(*OutputHandle));
		}
		else
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_001);
			rc = SQL_ERROR;
		}
		break;
	default:
		rc = SQL_ERROR;
		break;
	}
	return rc;
}
	
SQLRETURN CConnect::BrowseConnect(SQLCHAR *InConnectionString,
			SQLSMALLINT        StringLength1,
			SQLCHAR 		  *OutConnectionString,
			SQLSMALLINT        BufferLength,
			SQLSMALLINT       *StringLength2Ptr)
{

	SQLRETURN				rc = SQL_SUCCESS;
	SQLRETURN				rc1;
	CONNECT_KEYWORD_TREE	KeywordTree[KEY_MAX+1];
	CONNECT_FIELD_ITEMS		connectFieldItems;
	short					outputKeyword[KEY_MAX];
	short					i;
	short					DSNAttrNo;					
	short					DSNType;
	short					inStrLen;
	char					lcConnectionString[2048+1];
	char					ServerNameNTS[MAX_SQL_IDENTIFIER_LEN+1];
	char					tempBuffer[513];
	SQLSMALLINT				lengthCopied;
	SQLSMALLINT				totalLength;
	SQLSMALLINT				strLen;
		
	clearError();
	if (OutConnectionString != NULL)
		*OutConnectionString = 0;
	if (StringLength2Ptr != NULL)
		*StringLength2Ptr = 0;

	if (InConnectionString != NULL)
	{
		if (StringLength1 == SQL_NTS)
			inStrLen = strlen((const char *)InConnectionString);
		else
			inStrLen = StringLength1;
		if (inStrLen > sizeof(lcConnectionString)-1)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_013);
			return SQL_ERROR;
		}
		strcpyUTF8(lcConnectionString, (const char *)InConnectionString, sizeof(lcConnectionString), inStrLen);
	}
	else
	{
		strcpy(lcConnectionString, "DSN=DEFAULT;");
		inStrLen = strlen(lcConnectionString);
	}	
	
	ScanConnectString(lcConnectionString, inStrLen, KeywordTree);
	
	if (KeywordTree[KEY_DSN].AttrRank != 0)
	{
		DSNAttrNo = KEY_DSN;
		DSNType = UNKNOWN_DSN;
	}
	else
	if (KeywordTree[KEY_DRIVER].AttrRank != 0)
	{
		DSNAttrNo = KEY_DRIVER;		
		DSNType = DRIVER_KW_DSN;
	}
	else
	{
		DSNType = UNKNOWN_DSN;
		strcpy(ServerNameNTS, "DEFAULT");
		DSNAttrNo = KEY_MAX;
	}
	for (i = 0; i < KEY_MAX ; i++)
		outputKeyword[i] = KEY_MAX;
	i = 0;
	if (KeywordTree[KEY_UID].AttrRank == 0)
	{
		outputKeyword[i++] = KEY_UID;
		rc = SQL_NEED_DATA;
	}
	if (KeywordTree[KEY_PWD].AttrRank == 0)
	{
		outputKeyword[i++] = KEY_PWD;
		rc = SQL_NEED_DATA;
	}
	if (KeywordTree[KEY_DRIVER].AttrRank != 0)
	{
		if (KeywordTree[KEY_SERVER].AttrRank == 0)
		{
			outputKeyword[i++] = KEY_SERVER;
			rc = SQL_NEED_DATA;
		}
		if (KeywordTree[KEY_CATALOG].AttrRank == 0)
		{
			outputKeyword[i++] = KEY_CATALOG;
			rc = SQL_NEED_DATA;
		}
		if (KeywordTree[KEY_SCHEMA].AttrRank == 0)
		{
			outputKeyword[i++] = KEY_SCHEMA;
			rc = SQL_NEED_DATA;
		}
	}
	if (rc != SQL_NEED_DATA)
	{
		if ((rc = prepareForConnect(KeywordTree, connectFieldItems, DSNAttrNo, DSNType, ServerNameNTS)) != SQL_ERROR)
		{
			rc = Connect((SQLCHAR *)ServerNameNTS,
				SQL_NTS,
				(SQLCHAR *)connectFieldItems.loginId,
				SQL_NTS,
				(SQLCHAR *)connectFieldItems.password,
				SQL_NTS,
				FALSE);
		}
		if (rc != SQL_ERROR)
		{
			rc1 = generateConnectionString((CONNECT_KEYWORD_TREE *)&KeywordTree, &connectFieldItems, DSNAttrNo, OutConnectionString, 
				BufferLength, StringLength2Ptr);
			if (rc1 == SQL_SUCCESS_WITH_INFO)
				rc = rc1;
		}
	}
	else
	{
		lengthCopied = 0;
		totalLength = 0;

		for (i = 0; i < KEY_MAX && outputKeyword[i] != KEY_MAX ; i++)
		{
			sprintf(tempBuffer, "%s:%s=?;", ConnectKeywords[outputKeyword[i]],
											ConnectLocalizedIdentifier[outputKeyword[i]]);
			strLen = strlen(tempBuffer);
			totalLength += strLen;
			if (strLen != 0 && BufferLength != 0 && lengthCopied < BufferLength-1)
			{
				if (BufferLength == SQL_NTS || (BufferLength > 0 && strLen+lengthCopied < BufferLength))
				{
					if (OutConnectionString != NULL)
						strcpy((char *)(OutConnectionString+lengthCopied), tempBuffer);
					lengthCopied += strLen;
				}
				else
				{
					strLen = BufferLength-lengthCopied;
					if (OutConnectionString != NULL)
						strcpyUTF8((char *)(OutConnectionString+lengthCopied), tempBuffer, strLen);
					lengthCopied = BufferLength-1;
					setDiagRec(DRIVER_ERROR, IDS_01_004);
				}
			}
		}
		if (StringLength2Ptr != NULL)
			*StringLength2Ptr = totalLength;
	}
	if (rc == SQL_NEED_DATA) 
		m_CurrentOdbcAPI = SQL_API_SQLBROWSECONNECT;
	return rc;
}
	


SQLRETURN CConnect::DriverConnect(SQLHWND WindowHandle,
			SQLCHAR			*InConnectionString,
			SQLSMALLINT     StringLength1,
			SQLCHAR         *OutConnectionString,
			SQLSMALLINT     BufferLength,
			SQLSMALLINT 	*StringLength2Ptr,
			SQLUSMALLINT    DriverCompletion)
{
	CONNECT_KEYWORD_TREE	KeywordTree[KEY_MAX+1];
	CONNECT_FIELD_ITEMS		connectFieldItems;
	BOOL					reqAttrGiven = TRUE;
	short					DSNAttrNo;					
	short					DSNType;
	SQLRETURN				rc;
	SQLRETURN				rc1;
	short					inStrLen;
	char					lcConnectionString[2048+1];
	int						DialogRetCode;
	char					ServerNameNTS[MAX_SQL_IDENTIFIER_LEN+1];
	ServerNameNTS[0]=0;

	clearError();

	if (OutConnectionString != NULL)
		*OutConnectionString = 0;
	if (StringLength2Ptr != NULL)
		*StringLength2Ptr = 0;
	
	// FILEDSN is implemented by DM, DM reads the file datasource and gives it us either with DRIVER 
	// keyword or DSN keyword or both. Refer Driver Manager Guidelines under SQLDriverConnect
	// The code below attempts to follow Driver Guidelines under SQLDriverConnect
	if (InConnectionString != NULL)
	{
		if (StringLength1 == SQL_NTS)
			inStrLen = strlen((const char *)InConnectionString);
		else
			inStrLen = StringLength1;
		if (inStrLen > sizeof(lcConnectionString)-1)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_013);
			return SQL_ERROR;
		}
		strcpyUTF8(lcConnectionString, (const char *)InConnectionString, sizeof(lcConnectionString), inStrLen);
	}
	else
	{
		strcpy(lcConnectionString, "DSN=DEFAULT;");
		inStrLen = strlen(lcConnectionString);
	}

	ScanConnectString(lcConnectionString, inStrLen, KeywordTree);
	if (KeywordTree[KEY_DSN].AttrRank != 0)
	{
		DSNAttrNo = KEY_DSN;
		DSNType = UNKNOWN_DSN;
		if ((KeywordTree[KEY_UID].AttrRank == 0) || (KeywordTree[KEY_PWD].AttrRank == 0))
			reqAttrGiven = FALSE;
	}
	else
	if (KeywordTree[KEY_DRIVER].AttrRank != 0)
	{
		DSNAttrNo = KEY_DRIVER;		
		DSNType = DRIVER_KW_DSN;
		if ((KeywordTree[KEY_UID].AttrRank == 0) || (KeywordTree[KEY_PWD].AttrRank == 0) ||
					(KeywordTree[KEY_SERVER].AttrRank == 0))
			reqAttrGiven = FALSE;
	}
	else
	{
		DSNType = UNKNOWN_DSN;
		strcpy(ServerNameNTS, "DEFAULT");
		DSNAttrNo = KEY_MAX;
	}
	if ((rc = prepareForConnect(KeywordTree, connectFieldItems, DSNAttrNo, DSNType, ServerNameNTS)) == SQL_ERROR)
		return SQL_ERROR;	
	switch (DriverCompletion)
	{
	case SQL_DRIVER_NOPROMPT:
		if (! reqAttrGiven)
		{
			setDiagRec(DRIVER_ERROR, IDS_28_000);
			return SQL_ERROR;
		}
		break;
	// Don't want the clutter the dialog box with all the optional fields
	// Hence SQL_DRIVER_COMPLETE_REQUIRED is same as SQL_DRIVER_COMPLETE
	case SQL_DRIVER_COMPLETE_REQUIRED:	
	case SQL_DRIVER_COMPLETE:	
		if (reqAttrGiven)			
			break;
	case SQL_DRIVER_PROMPT:				// No break, should fall thru
		m_ChangePassword = TRUE; // Rajani - for password expiry
		if (WindowHandle == NULL)
		{
			setDiagRec(DRIVER_ERROR, IDS_IM_008);
			return SQL_ERROR;
		}
		if(IsWindow(WindowHandle) == 0)
		{
			setDiagRec(DRIVER_ERROR, IDS_IM_008);
			return SQL_ERROR;
		}
		// Synchronize, since DialogProc uses a static variable
//		EnterCriticalSection(&m_CSObject);

		if (DSNType == DRIVER_KW_DSN) {
			DialogRetCode=TRUE;
			HINSTANCE hinst = LoadLibrary(ODBC_RESOURCE_DLL);
			if (hinst != NULL) {
				BOOL b=EnableWindow(WindowHandle,FALSE);
				HWND hWndDlg=CreateDialog(hinst,
				   MAKEINTRESOURCE(IDD_CONNECT_DRIVER_KW_DIALOG),
				   WindowHandle, ConnectDriverKWDialogProc);
				SetWindowLongPtr(hWndDlg,DWLP_USER,(LONG_PTR)&connectFieldItems);
				SendMessage(hWndDlg,WM_INITDIALOG,0,0);
				ShowWindow(hWndDlg,SW_SHOW);
				MSG msg;
				while (GetMessage(&msg,hWndDlg,0,0)) {
				 if (!IsWindow(hWndDlg) || !IsDialogMessage(hWndDlg,&msg)){
					 TranslateMessage(&msg);
					 DispatchMessage(&msg);
				 }
				}
				
				DestroyWindow(hWndDlg);
				EnableWindow(WindowHandle,!b);
				FreeLibrary(hinst);

				if (msg.wParam == 1)//IDCANCEL
				{
					setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Operation Aborted.");
					return SQL_ERROR;
				}
			 }
			 else {
				BOOL b=EnableWindow(WindowHandle,FALSE);
				HWND hWndDlg=CreateDialog(gDrvrGlobal.gModuleHandle,
				   MAKEINTRESOURCE(IDD_CONNECT_DRIVER_KW_DIALOG),
				   WindowHandle, ConnectDriverKWDialogProc);
				SetWindowLongPtr(hWndDlg,DWLP_USER,(LONG_PTR)&connectFieldItems);
				SendMessage(hWndDlg,WM_INITDIALOG,0,0);
				ShowWindow(hWndDlg,SW_SHOW);  
				MSG msg;
				while (GetMessage(&msg,hWndDlg,0,0)) {
				 if (!IsWindow(hWndDlg) || !IsDialogMessage(hWndDlg,&msg)){
					 TranslateMessage(&msg);
					 DispatchMessage(&msg);
				 }
				}
				DestroyWindow(hWndDlg);
				EnableWindow(WindowHandle,!b);
				FreeLibrary(hinst);

				if (msg.wParam == 1)//IDCANCEL
				{
					setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Operation Aborted.");
					return SQL_ERROR;
				}
			 }

		}
		else {
			//DialogRetCode = DialogBoxParam(gDrvrGlobal.gModuleHandle,
			//	 MAKEINTRESOURCE(IDD_CONNECT_DIALOG),
			//	 WindowHandle, ConnectDialogProc, (long)&connectFieldItems);
			HINSTANCE hinst = LoadLibrary(ODBC_RESOURCE_DLL);
			if (hinst != NULL) {
				DialogRetCode = DialogBoxParam(hinst,
					MAKEINTRESOURCE(IDD_CONNECT_DIALOG),
					WindowHandle, ConnectDialogProc, (LONG_PTR)&connectFieldItems);
				FreeLibrary(hinst);
			}
			else {
				DialogRetCode = DialogBoxParam(gDrvrGlobal.gModuleHandle,
					MAKEINTRESOURCE(IDD_CONNECT_DIALOG),
					WindowHandle, ConnectDialogProc, (LONG_PTR)&connectFieldItems);
			}
		}

//		LeaveCriticalSection(&m_CSObject);
		if (DialogRetCode == FALSE)
		{
			setDiagRec(DRIVER_ERROR, IDS_IM_008);
			return SQL_ERROR;
		}
		break;
	default:
		setDiagRec(DRIVER_ERROR, IDS_HY_110);
		return SQL_ERROR;
	}
	// Update the m_DSValue with what is in the connectionString and dialogbox 
	m_DSValue.updateDSValues(DSNType, &connectFieldItems, (CONNECT_KEYWORD_TREE *)&KeywordTree);
	rc = Connect((SQLCHAR *)ServerNameNTS,
			SQL_NTS,
			(SQLCHAR *)connectFieldItems.loginId,
			SQL_NTS,
			(SQLCHAR *)connectFieldItems.password,
			SQL_NTS,
			FALSE);

	if (rc != SQL_ERROR)
	{
		rc1 = generateConnectionString((CONNECT_KEYWORD_TREE *)&KeywordTree, &connectFieldItems, DSNAttrNo, OutConnectionString, 
				BufferLength, StringLength2Ptr);
		if (rc1 == SQL_SUCCESS_WITH_INFO)
			rc = rc1;
	}
	return rc;
}
	
	
SQLRETURN CConnect::SetConnectAttr(SQLINTEGER Attribute, SQLUINTEGER ValueNum, SQLPOINTER ValueStr, bool bClearErrors)
{
	SQLRETURN			rc = SQL_SUCCESS;
	SRVR_CALL_CONTEXT	srvrCallContext;

	if (bClearErrors)
		clearError();
	m_CurrentOdbcAPI = SQL_API_SQLSETCONNECTATTR;

	m_srvrCallContext.odbcAPI = SQL_API_SQLSETCONNECTATTR;
	m_srvrCallContext.sqlHandle = this;
	m_srvrCallContext.SQLSvc_ObjRef = m_SQLSvc_ObjRef;
	m_srvrCallContext.ASSvc_ObjRef = m_ASSvc_ObjRef;
	m_srvrCallContext.eventHandle = m_ConnectEvent;
	srvrCallContext.dialogueId = m_DialogueId;
	m_srvrCallContext.connectionTimeout = m_ConnectionTimeout;
	m_srvrCallContext.u.setConnectParams.attribute = Attribute;
	m_srvrCallContext.u.setConnectParams.valueNum = ValueNum;
	m_srvrCallContext.u.setConnectParams.valueStr = ValueStr;
	m_srvrCallContext.maxRowsetSize=-1;

	rc = ThreadControlProc(&m_srvrCallContext);
	if (rc == SQL_SUCCESS)
		if (m_SqlWarning)
			rc = SQL_SUCCESS_WITH_INFO;
	return rc;
}

SQLRETURN CConnect::SetConnectAttr(SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength)
{
	SQLRETURN	rc = SQL_SUCCESS;
	SQLINTEGER	strLen;
	char		Temp_Catalog[MAX_SQL_IDENTIFIER_LEN+1];
	CHANDLECOLLECT::iterator i;
	int translen = 0;
	int j;
	char		errorMsg[MAX_TRANSLATE_ERROR_MSG_LEN];

	Temp_Catalog[0] = '\0';

	switch (Attribute)
	{
	case SQL_ATTR_ACCESS_MODE:
	case SQL_ATTR_ASYNC_ENABLE:
	case SQL_ATTR_AUTOCOMMIT:
	case SQL_ATTR_CONNECTION_TIMEOUT:
	case SQL_ATTR_LOGIN_TIMEOUT:
	case SQL_ATTR_METADATA_ID:
	case SQL_ATTR_ODBC_CURSORS:
	case SQL_ATTR_TRANSLATE_OPTION:
	case SQL_ATTR_TXN_ISOLATION:
	case SQL_MAX_ROWS:
	case SQL_MAX_LENGTH:
	case SQL_NOSCAN:
	case SQL_QUERY_TIMEOUT:
	case SQL_ATTR_SESSIONNAME:
	case SQL_ATTR_FETCHAHEAD:
	case SQL_ATTR_ROLENAME:
	case SQL_ATTR_CERTIFICATE_DIR:
	case SQL_ATTR_CERTIFICATE_FILE:
	case SQL_ATTR_CERTIFICATE_FILE_ACTIVE:
	case SQL_START_NODE:
		break;
	//wms_mapping 
	case SQL_ATTR_APPLNAME:
		break;
	case SQL_ATTR_QUIET_MODE:
		if (StringLength != 0 && StringLength != SQL_IS_POINTER)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			rc = SQL_ERROR;
		}
		break;
	case SQL_ATTR_CURRENT_CATALOG:
	case SQL_ATTR_TRANSLATE_LIB:
		if (StringLength == SQL_NTS)
			strLen = wcslen((const wchar_t *)ValuePtr) * 2;
		else
			strLen = StringLength;
		break;
	case SQL_ATTR_AUTO_IPD:
	case SQL_ATTR_PACKET_SIZE:
		setDiagRec(DRIVER_ERROR, IDS_HY_092);
		rc = SQL_ERROR;
		break;
	case SQL_ATTR_TRACE:			// Implemented by DM
	case SQL_ATTR_TRACEFILE:
		break;
	case SQL_ATTR_ROWSET_RECOVERY:
	case SQL_ATTR_FETCH_BUFFER_SIZE:
		break;
	case SQL_ATTR_CONCURRENCY:
	case SQL_ATTR_CURSOR_TYPE:
	case SQL_ATTR_SIMULATE_CURSOR:
	case SQL_ATTR_USE_BOOKMARKS:
	default:
		setDiagRec(DRIVER_ERROR, IDS_HY_092);
		rc = SQL_ERROR;
	}
	
	if (rc == SQL_ERROR)
		return rc;

	switch (Attribute)
	{
	case SQL_ATTR_ACCESS_MODE:
		if (m_ConnectionDead != SQL_CD_TRUE)
			rc = SetConnectAttr(Attribute, (SQLUINTEGER)ValuePtr, NULL);
		if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)	
			m_AccessMode = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_ATTR_ASYNC_ENABLE:
		m_AsyncEnable = (SQLUINTEGER)ValuePtr;
		for (i = m_StmtCollect.begin() ; i !=  m_StmtCollect.end() ; ++i)
			((CStmt *)(*i))->m_AsyncEnable = m_AsyncEnable;
		break;
	case SQL_ATTR_AUTOCOMMIT:
		if (m_ConnectionDead != SQL_CD_TRUE)
		{
			if ( (m_AutoCommit == SQL_AUTOCOMMIT_ON && (SQLUINTEGER)ValuePtr != SQL_AUTOCOMMIT_ON)
			|| (m_AutoCommit == SQL_AUTOCOMMIT_OFF && (SQLUINTEGER)ValuePtr != SQL_AUTOCOMMIT_OFF) )
			{
				rc = SetConnectAttr(Attribute, (SQLUINTEGER)ValuePtr, NULL);
			}

		}
		if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
			m_AutoCommit = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_ATTR_CONNECTION_TIMEOUT:
		m_ConnectionTimeout = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_ATTR_CURRENT_CATALOG:
		if (strLen/2 >= sizeof(m_CurrentCatalog))
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			rc = SQL_ERROR;
		}
		else
		{
			if(strLen > 0)
			{
				if(WCharToUTF8((wchar_t *)ValuePtr, strLen/2, Temp_Catalog, sizeof(Temp_Catalog), &translen, errorMsg) != SQL_SUCCESS)
					return SQL_ERROR;
			}
			else
				Temp_Catalog[0] = '\0';
			
			if (m_ConnectionDead != SQL_CD_TRUE)
				rc = SetConnectAttr(Attribute, 0, Temp_Catalog);
			if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)	
			{
				strcpy(m_CurrentCatalog, Temp_Catalog);
			}
		}
		break;
	case SQL_ATTR_LOGIN_TIMEOUT:
		m_LoginTimeout = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_ATTR_METADATA_ID:
		m_MetadataId = (SQLUINTEGER)ValuePtr;
		for (i = m_StmtCollect.begin() ; i !=  m_StmtCollect.end() ; ++i)
			((CStmt *)(*i))->m_MetadataId = m_MetadataId;
		break;
	case SQL_ATTR_ODBC_CURSORS:
		if (m_ConnectionDead == SQL_CD_FALSE)
			m_ODBCCursors = (SQLUINTEGER)ValuePtr;
		else
		{
			setDiagRec(DRIVER_ERROR, IDS_08_002);
			rc = SQL_ERROR;
		}
		break;
	case SQL_ATTR_QUIET_MODE:
		m_QuietMode = (HWND)ValuePtr;
		break;
	case SQL_ATTR_TRANSLATE_LIB:
		if (strLen >= sizeof(m_TranslateLib))
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			rc = SQL_ERROR;
		}
		else
		{
			strncpy(m_TranslateLib, (const char *)ValuePtr, strLen);
			m_TranslateLib[strLen] = '\0';
		}
//		rc = InitializeTranslation();
		break;
	case SQL_ATTR_TRANSLATE_OPTION:
		m_TranslateOption = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_ATTR_TXN_ISOLATION:
		if (m_ConnectionDead != SQL_CD_TRUE)
			rc = SetConnectAttr(Attribute, (SQLUINTEGER)ValuePtr, NULL);
		if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)	
			m_TxnIsolation = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_ATTR_TRACE:			// Implemented by DM
	case SQL_ATTR_TRACEFILE:
		break;
	case SQL_ATTR_CONCURRENCY:
		break;
	case SQL_ATTR_CURSOR_TYPE:
		break;
	case SQL_ATTR_SIMULATE_CURSOR:
		break;
	case SQL_ATTR_USE_BOOKMARKS:
		if ((SQLUINTEGER)ValuePtr == SQL_UB_ON)
		{
			setDiagRec(DRIVER_ERROR, IDS_01_S02);
			rc = SQL_SUCCESS_WITH_INFO;
		}
		break;
	case SQL_MAX_ROWS:
		m_MaxRows = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_MAX_LENGTH:
		m_MaxLength = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_NOSCAN:
		m_Noscan = (SQLUINTEGER)ValuePtr;
		break;
	case SQL_QUERY_TIMEOUT:
		m_QueryTimeout = (SQLUINTEGER)ValuePtr;
		if(m_QueryTimeout != 0 && m_QueryTimeout < 30)
			m_QueryTimeout = 30;
		break;
	case SQL_ATTR_ROWSET_RECOVERY:
		if (m_ConnectionDead != SQL_CD_TRUE)
			rc = SetConnectAttr(Attribute, (SQLUINTEGER)ValuePtr, NULL);
		else
			rc = SQL_ERROR;
		if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)	
			m_RowsetErrorRecovery = (SQLINTEGER)ValuePtr;
		break;
	case SQL_ATTR_FETCH_BUFFER_SIZE:
		m_FetchBufferSize = (SQLINTEGER)ValuePtr;
		if (m_FetchBufferSize < 0)
			m_FetchBufferSize = 0;
		m_FetchBufferSize *= 1024;
		break;
	// Trafodion Extension to set the Session Name part of Unique Query ID
	case SQL_ATTR_SESSIONNAME:
		{
			if (StringLength == SQL_NTS)
				strLen = wcslen((const wchar_t *)ValuePtr);
			else
				strLen = StringLength/2;

			for(j = 0; j < strLen; j++)
			{
				wint_t ch = (*(unsigned wchar_t *)((wchar_t *)ValuePtr + j));
				if(!iswalnum(ch) && ch != L'_')
				{
					setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Illegal characters in the Session Name attribute.");
					rc = SQL_ERROR;
					break;
				}
			}

			if(strLen > SQL_MAX_SESSIONNAME_LEN-1)
			{
				strLen = SQL_MAX_SESSIONNAME_LEN-1;
				setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "The maximum length for Session Name, 24 characters, has been exceeded.");
				rc = SQL_SUCCESS_WITH_INFO;
			}
			if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
			{
				if(strLen > 0)
				{
					if(WCharToUTF8((wchar_t *)ValuePtr, strLen, m_QueryID_SessionName, sizeof(m_QueryID_SessionName), &translen, errorMsg) != SQL_SUCCESS)
						return SQL_ERROR;
				}
				else
					m_QueryID_SessionName[0] = '\0';
			}
		}
		break;
	case SQL_ATTR_ROLENAME:
		if (StringLength == SQL_NTS)
			strLen = wcslen((const wchar_t *)ValuePtr) *2;
		else
			strLen = StringLength;
		for(j = 0; j < strLen/2; j++)
		{
			wint_t ch = (*(unsigned wchar_t *)((wchar_t *)ValuePtr + j));
			if(!iswalnum(ch) && ch != L'_')
			{
				setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Illegal characters in the Role Name attribute.");
				rc = SQL_ERROR;
				break;
			}
		}
		if(rc == SQL_SUCCESS)
		{
			if(strLen > 0)
			{
				if(WCharToUTF8((wchar_t *)ValuePtr, strLen/2, m_UserRole, sizeof(m_UserRole), &translen, errorMsg) != SQL_SUCCESS)
					return SQL_ERROR;
			}
			else
				m_UserRole[0] = '\0';
			if(rc == SQL_SUCCESS_WITH_INFO)
			{
				setDiagRec(DRIVER_ERROR, IDS_HY_090);
				rc = SQL_ERROR;
				break;
			}
		}
		break;
	case SQL_ATTR_FETCHAHEAD:
		if ((SQLINTEGER)ValuePtr != 0 && (SQLINTEGER)ValuePtr != 1)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_000, 0, "Illegal value specified. Valid value is 0 or 1.");
			rc = SQL_ERROR;
			break;
		}
		m_FetchAhead = (SQLINTEGER)ValuePtr;
		break;
	//wms_mapping 
	case SQL_ATTR_APPLNAME:
		if (StringLength == SQL_NTS)
			strLen = wcslen((const wchar_t *)ValuePtr) * 2;
		else
			strLen = StringLength;
		strLen = strLen > sizeof(m_applName)-1 ? sizeof(m_applName)-1 : strLen;

			if(strLen > 0)
			{
				if(WCharToUTF8((wchar_t *)ValuePtr, strLen/2, m_applName, sizeof(m_applName), &translen, errorMsg) != SQL_SUCCESS)
					return SQL_ERROR;
			}
			else
				m_applName[0] = '\0';
			if(rc == SQL_SUCCESS_WITH_INFO)
			{
				setDiagRec(DRIVER_ERROR, IDS_HY_090);
				rc = SQL_ERROR;
				break;
			}
		break;
	case SQL_ATTR_CERTIFICATE_DIR:
		if (StringLength == SQL_NTS)
			strLen = wcslen((const wchar_t *)ValuePtr) * 2;
		else
			strLen = StringLength;

		strLen = strLen > sizeof(m_CertificateDir)-1 ? sizeof(m_CertificateDir)-1 : strLen;
		if(strLen > 0)
		{
			if(WCharToUTF8((wchar_t *)ValuePtr, strLen/2, m_CertificateDir, sizeof(m_CertificateDir), &translen, errorMsg) != SQL_SUCCESS)
				return SQL_ERROR;
		}
		else
			m_CertificateDir[0] = '\0';
		if(rc == SQL_SUCCESS_WITH_INFO)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			rc = SQL_ERROR;
			break;
		}
		break;
	case SQL_ATTR_CERTIFICATE_FILE:
		if (StringLength == SQL_NTS)
			strLen = wcslen((const wchar_t *)ValuePtr) * 2;
		else
			strLen = StringLength;
		strLen = strLen > sizeof(m_CertificateFile)-1 ? sizeof(m_CertificateFile)-1 : strLen;
		if(strLen > 0)
		{
			if(WCharToUTF8((wchar_t *)ValuePtr, strLen/2, m_CertificateFile, sizeof(m_CertificateFile), &translen, errorMsg) != SQL_SUCCESS)
				return SQL_ERROR;
		}
		else
			m_CertificateFile[0] = '\0';
		if(rc == SQL_SUCCESS_WITH_INFO)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			rc = SQL_ERROR;
			break;
		}
		break;
	case SQL_ATTR_CERTIFICATE_FILE_ACTIVE:
		if (StringLength == SQL_NTS)
			strLen = wcslen((const wchar_t *)ValuePtr) * 2;
		else
			strLen = StringLength;

		strLen = strLen > sizeof(m_CertificateFileActive)-1 ? sizeof(m_CertificateFileActive)-1 : strLen;

		if(strLen > 0)
		{
			if(WCharToUTF8((wchar_t *)ValuePtr, strLen/2, m_CertificateFileActive, sizeof(m_CertificateFileActive), &translen, errorMsg) != SQL_SUCCESS)
				return SQL_ERROR;
		}
		else
			m_CertificateFileActive[0] = '\0';
		if(rc == SQL_SUCCESS_WITH_INFO)
		{
			setDiagRec(DRIVER_ERROR, IDS_HY_090);
			rc = SQL_ERROR;
			break;
		}
		break;
	case SQL_START_NODE:
		m_StartNode = (SQLINTEGER)ValuePtr;
		break;
	default:
		setDiagRec(DRIVER_ERROR, IDS_HY_092);
		rc = SQL_ERROR;
		break;
	}
	return rc;
}

SQLRETURN CConnect::GetConnectAttr(SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER BufferLength,
								   SQLINTEGER *StringLengthPtr)
{
	SQLRETURN				rc = SQL_SUCCESS;
	RETURN_VALUE_STRUCT		retValue;
	BOOL					encrypt = false;
	short retCode=SQL_SUCCESS;

	clearError();
	m_CurrentOdbcAPI = SQL_API_SQLGETCONNECTATTR;
	retValue.dataType = DRVR_PENDING;
	retValue.u.strPtr = NULL;
	
	switch (Attribute)
	{
	case SQL_ATTR_ACCESS_MODE:
		retValue.u.u32Value = m_AccessMode;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_ASYNC_ENABLE:
		retValue.u.u32Value = m_AsyncEnable;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_AUTOCOMMIT:
		retValue.u.u32Value = m_AutoCommit;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_AUTO_IPD:
		retValue.u.u32Value = m_AutoIPD;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_CONNECTION_TIMEOUT:
		retValue.u.u32Value = m_ConnectionTimeout;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_CURRENT_CATALOG:
		retValue.u.strPtr = m_CurrentCatalog;
		break;
	case SQL_ATTR_LOGIN_TIMEOUT:
		retValue.u.u32Value = m_LoginTimeout;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_METADATA_ID:
		retValue.u.u32Value = m_MetadataId;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_ODBC_CURSORS:
		retValue.u.u32Value = m_ODBCCursors;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_PACKET_SIZE:
		retValue.u.u32Value = m_PacketSize;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_QUIET_MODE:
		retValue.u.pValue = m_QuietMode;
		retValue.dataType = SQL_IS_POINTER;
		break;
	case SQL_ATTR_TRANSLATE_LIB:
		retValue.u.strPtr = m_TranslateLib;
		break;
	case SQL_ATTR_TRANSLATE_OPTION:
		retValue.u.u32Value = m_TranslateOption;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_TXN_ISOLATION:
		retValue.u.u32Value = m_TxnIsolation;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_TRACE:			// Implemented by DM
	case SQL_ATTR_TRACEFILE:
		break;
	case SQL_ATTR_CONCURRENCY:
		retValue.u.u32Value = m_Concurrency;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_CURSOR_TYPE:
		retValue.u.u32Value = m_CursorType;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_MAX_LENGTH:
#ifdef _WIN64
		retValue.u.s64Value = m_MaxLength;
		retValue.dataType = SQL_C_UBIGINT;
#else
		retValue.u.u32Value = m_MaxLength;
		retValue.dataType = SQL_IS_UINTEGER;
#endif
		break;
	case SQL_ATTR_MAX_ROWS:
#ifdef _WIN64
		retValue.u.s64Value = m_MaxRows;
		retValue.dataType = SQL_C_UBIGINT;
#else
		retValue.u.u32Value = m_MaxRows;
		retValue.dataType = SQL_IS_UINTEGER;
#endif
		break;
	case SQL_ATTR_NOSCAN:
		retValue.u.u32Value = m_Noscan;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_QUERY_TIMEOUT:
		retValue.u.u32Value = m_QueryTimeout;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_SIMULATE_CURSOR:
		retValue.u.u32Value = m_SimulateCursor;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_USE_BOOKMARKS:
		retValue.u.u32Value = m_UseBookmarks;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_ROWSET_RECOVERY:
		retValue.u.u32Value = m_RowsetErrorRecovery;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ATTR_FETCH_BUFFER_SIZE:
		retValue.u.u32Value = m_FetchBufferSize/1024;
		retValue.dataType = SQL_IS_INTEGER;
		break;
	case SQL_ATTR_SESSIONNAME:
		retValue.u.strPtr = m_QueryID_SessionName;
		break;
	case SQL_ATTR_ROLENAME:
		retValue.u.strPtr = m_UserRole;
		break;
	case SQL_ATTR_FETCHAHEAD:
		retValue.u.u32Value = m_FetchAhead;
		break;
	//wms_mapping 
	case SQL_ATTR_APPLNAME:
		retValue.u.strPtr = m_applName;
		break;
	case SQL_ATTR_CERTIFICATE_DIR:
		retValue.u.strPtr = m_CertificateDir;
		break;
	case SQL_ATTR_CERTIFICATE_FILE:
		retValue.u.strPtr = m_CertificateFile;
		break;
	case SQL_ATTR_CERTIFICATE_FILE_ACTIVE:
		retValue.u.strPtr = m_CertificateFileActive;
		break;
	default:
		setDiagRec(DRIVER_ERROR, IDS_HY_092);
		break;
	}
	if (rc == SQL_SUCCESS && !encrypt)
		rc = returnAttrValue(TRUE, this, &retValue, ValuePtr, BufferLength, StringLengthPtr);
	return rc;
}

SQLRETURN CConnect::EndTran(SQLSMALLINT CompletionType)	
{
	SQLRETURN			rc;
	CHANDLECOLLECT::iterator i;

	clearError();
	if (m_ConnectionDead == SQL_CD_TRUE)
	{
		clearError();
		setDiagRec(DRIVER_ERROR, IDS_08_S01);
		rc = SQL_ERROR;
	}
	else
	{
		m_srvrCallContext.odbcAPI = SQL_API_SQLENDTRAN;
		m_srvrCallContext.sqlHandle = this;
		m_srvrCallContext.SQLSvc_ObjRef = m_SQLSvc_ObjRef;
		m_srvrCallContext.ASSvc_ObjRef = m_ASSvc_ObjRef;
		m_srvrCallContext.eventHandle = m_ConnectEvent;
		m_srvrCallContext.dialogueId = m_DialogueId;
		m_srvrCallContext.connectionTimeout = m_ConnectionTimeout;
		m_srvrCallContext.u.completionType = CompletionType;
		m_srvrCallContext.maxRowsetSize=-1;

		rc = ThreadControlProc(&m_srvrCallContext);
		if (rc == SQL_SUCCESS)
			if (m_SqlWarning)
				rc = SQL_SUCCESS_WITH_INFO;
	}
	switch (rc)
	{
	case SQL_SUCCESS:
	case SQL_SUCCESS_WITH_INFO:
		// SQL_CB_CLOSE behavior
		for (i = m_StmtCollect.begin() ; i !=  m_StmtCollect.end() ; ++i)
			((CStmt *)(*i))->revertStmtState();
		break;
	case SQL_STILL_EXECUTING:
	case SQL_NEED_DATA:
	case SQL_ERROR:
	case SQL_NO_DATA:
	case SQL_INVALID_HANDLE:
	default:
		break;
	}
	return rc;
}

SQLRETURN CConnect::GetInfo(SQLUSMALLINT InfoType, 
		   SQLPOINTER InfoValuePtr,
           SQLSMALLINT BufferLength,
		   SQLSMALLINT *StringLengthPtr)
{
	char					*cYes	= "Y";
	char					*cNo	= "N";
	char					*cPartial = "P"; // Based on 2.0 specification
	char					*cFull = "F";
	char					*cEmpty = "";
	char					tmpStr[32];
	char					*cKeywords = "ABS,AFTER,ALIAS,BEFORE,BOOLEAN,BREADTH,CALL,COMPLETION,"\
								   "CONVERTTIMESTAMP,CYCLE,DATEFORMAT,DAYOFWEEK,DEPTH,DICTIONARY,"\
								   "EACH,EQUALS,GENERAL,IF,IGNORE,INDEX_TABLE,INVOKE,JULIANTIMESTAMP,"\
								   "LEAVE,LESS,LIMIT,LOAD_TABLE,LOOP,MODIFY,NEW,OBJECT,OFF,OID,OLD,"\
								   "OPERATION,OPERATORS,OTHERS,PARAMETERS,PENDANT,PREORDER,PRIVATE,"\
								   "PROTECTED,PROTOTYPE,RECURSIVE,REF,REFERENCING,REPLACE,RESIGNAL,"\
								   "RESOURCE_FORK,RETURN,RETURNS,ROLE,ROUTINE,ROW,SAVEPOINT,SEARCH,"\
								   "SENSITIVE,SHOWDDL,SHOWPLAN,SIGNAL,SIMILAR,SQLEXCEPTION,STDDEV,"\
								   "STRUCTURE,TEST,THERE,TRANSPOSE,TRIGGER,TYPE,UNDER,UPSHIFT,"\
								   "VARIABLE,VARIANCE,VIRTUAL,WAIT,WHILE,WITHOUT";
	SQLRETURN				rc = SQL_SUCCESS;
	RETURN_VALUE_STRUCT		retValue;
	SQLINTEGER				lStringLength;

	clearError();
	m_CurrentOdbcAPI = SQL_API_SQLGETINFO;
	retValue.dataType = DRVR_PENDING;
	retValue.u.strPtr = NULL;

	switch (InfoType)
	{
	case SQL_ACCESSIBLE_PROCEDURES:	
		retValue.u.strPtr = cNo;
		break;
	case SQL_ACCESSIBLE_TABLES:	
		retValue.u.strPtr = cNo;
		break;
	case SQL_ACTIVE_ENVIRONMENTS:
		retValue.u.u16Value = 0;	
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_AGGREGATE_FUNCTIONS:
		retValue.u.u32Value = SQL_AF_AVG | SQL_AF_COUNT | SQL_AF_MAX | SQL_AF_MIN | SQL_AF_SUM;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ALTER_DOMAIN:
		retValue.u.u32Value = 0L; // Not supported
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ALTER_TABLE:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ASYNC_MODE:
		retValue.u.u32Value = SQL_AM_STATEMENT;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_BATCH_ROW_COUNT:
		retValue.u.u32Value = 0; 
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_BATCH_SUPPORT:
		retValue.u.u32Value = 0; 
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_BOOKMARK_PERSISTENCE:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CATALOG_LOCATION:
		retValue.u.u16Value = SQL_CL_START;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_CATALOG_NAME:
		retValue.u.strPtr = cYes;
		break;
	case SQL_CATALOG_NAME_SEPARATOR:
		retValue.u.strPtr = ".";
		break;
	case SQL_CATALOG_TERM:
		retValue.u.strPtr = "catalog";
		break;
	case SQL_CATALOG_USAGE:
		retValue.u.u32Value = SQL_QU_DML_STATEMENTS | SQL_QU_TABLE_DEFINITION | 
				SQL_QU_INDEX_DEFINITION;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_COLLATION_SEQ:
		retValue.u.strPtr = "ISO 8859-1";
		break;
	case SQL_COLUMN_ALIAS:
		retValue.u.strPtr = cYes;
		break;
	case SQL_CONCAT_NULL_BEHAVIOR:
		retValue.u.u16Value = SQL_CB_NULL;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_CONVERT_BIGINT:		
	case SQL_CONVERT_DECIMAL:               
	case SQL_CONVERT_DOUBLE:                
	case SQL_CONVERT_FLOAT:                 
	case SQL_CONVERT_INTEGER:               
	case SQL_CONVERT_NUMERIC:               
	case SQL_CONVERT_REAL:                  
	case SQL_CONVERT_SMALLINT:              
		retValue.u.u32Value = SQL_CVT_CHAR | SQL_CVT_NUMERIC | SQL_CVT_DECIMAL
					| SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_FLOAT
					| SQL_CVT_REAL | SQL_CVT_DOUBLE  | SQL_CVT_VARCHAR
					// | SQL_CVT_LONGVARCHAR
					// | SQL_CVT_TINYINT 
					| SQL_CVT_BIGINT;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_CHAR:                  
	case SQL_CONVERT_VARCHAR: 
		retValue.u.u32Value = SQL_CVT_CHAR | SQL_CVT_NUMERIC | SQL_CVT_DECIMAL
					| SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_FLOAT
					| SQL_CVT_REAL | SQL_CVT_DOUBLE  | SQL_CVT_VARCHAR
					// | SQL_CVT_LONGVARCHAR 
					// | SQL_CVT_TINYINT 
					| SQL_CVT_BIGINT | SQL_CVT_DATE | SQL_CVT_TIME 
					| SQL_CVT_TIMESTAMP
					// | SQL_CVT_WCHAR | SQL_CVT_WVARCHAR;
					;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_LONGVARCHAR:           
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_DATE:                  
		retValue.u.u32Value =  SQL_CVT_CHAR | SQL_CVT_VARCHAR
			//		| SQL_CVT_LONGVARCHAR 
					| SQL_CVT_DATE | SQL_CVT_TIMESTAMP;
		
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_TIME:                  
		retValue.u.u32Value = SQL_CVT_CHAR | SQL_CVT_VARCHAR
				//	| SQL_CVT_LONGVARCHAR 
					| SQL_CVT_TIME 	| SQL_CVT_TIMESTAMP;
		
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_TIMESTAMP:             
		retValue.u.u32Value = SQL_CVT_CHAR | SQL_CVT_VARCHAR
				//	| SQL_CVT_LONGVARCHAR 
					| SQL_CVT_DATE | SQL_CVT_TIME 
					| SQL_CVT_TIMESTAMP;
		
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_BIT:                   
	case SQL_CONVERT_BINARY:		
	case SQL_CONVERT_VARBINARY:             
	case SQL_CONVERT_LONGVARBINARY:         		
	case SQL_CONVERT_INTERVAL_DAY_TIME:
	case SQL_CONVERT_INTERVAL_YEAR_MONTH:
	case SQL_CONVERT_TINYINT:               
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_WCHAR:
	case SQL_CONVERT_WVARCHAR:
		retValue.u.u32Value = SQL_CVT_CHAR | SQL_CVT_NUMERIC | SQL_CVT_DECIMAL
					| SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_FLOAT
					| SQL_CVT_REAL | SQL_CVT_DOUBLE  | SQL_CVT_VARCHAR
					//| SQL_CVT_LONGVARCHAR 
					// | SQL_CVT_TINYINT 
					| SQL_CVT_BIGINT | SQL_CVT_DATE | SQL_CVT_TIME 
					| SQL_CVT_TIMESTAMP
					| SQL_CVT_WCHAR | SQL_CVT_WVARCHAR;
				retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_WLONGVARCHAR:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CONVERT_FUNCTIONS:
		retValue.u.u32Value = SQL_FN_CVT_CONVERT;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CORRELATION_NAME:
		retValue.u.u16Value = SQL_CN_ANY;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_CREATE_ASSERTION:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CREATE_CHARACTER_SET:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CREATE_COLLATION:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CREATE_DOMAIN:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CREATE_SCHEMA:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CREATE_TABLE:
		retValue.u.u32Value = SQL_CT_CREATE_TABLE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CREATE_TRANSLATION:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CREATE_VIEW:
		retValue.u.u32Value = SQL_CV_CREATE_VIEW | SQL_CV_CHECK_OPTION | SQL_CV_CASCADED;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_CURSOR_COMMIT_BEHAVIOR:
	case SQL_CURSOR_ROLLBACK_BEHAVIOR:
		retValue.u.u16Value = SQL_CB_CLOSE;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_CURSOR_SENSITIVITY:
		retValue.u.u32Value = SQL_UNSPECIFIED;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_DATA_SOURCE_NAME:
		retValue.u.strPtr = m_DSValue.m_DSName;
		break;
	case SQL_DATA_SOURCE_READ_ONLY:
		if (m_SrvrDSReadType == 0) // Read only
			retValue.u.strPtr = cYes;
		else
			retValue.u.strPtr = cNo;
		break;
	case SQL_DATABASE_NAME:
		retValue.u.strPtr = m_CurrentCatalog;
		break;
	case SQL_DATETIME_LITERALS:
		retValue.u.u32Value = SQL_DL_SQL92_DATE | SQL_DL_SQL92_TIME | SQL_DL_SQL92_TIMESTAMP
				| SQL_DL_SQL92_INTERVAL_YEAR | SQL_DL_SQL92_INTERVAL_MONTH  //  not supported.
				| SQL_DL_SQL92_INTERVAL_DAY | SQL_DL_SQL92_INTERVAL_HOUR
				| SQL_DL_SQL92_INTERVAL_MINUTE | SQL_DL_SQL92_INTERVAL_SECOND
				| SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH | SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR
				| SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE
				| SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND | SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE
				| SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND | SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_DBMS_NAME:
		retValue.u.strPtr = "Trafodion";
		break;
	case SQL_DBMS_VER:
		sprintf(tmpStr, "%02d.%02d.%04d", m_SqlVersion.majorVersion,
			m_SqlVersion.minorVersion, m_SqlVersion.buildId);
		retValue.u.strPtr = tmpStr;
		break;
	case SQL_DDL_INDEX:
		retValue.u.u32Value = SQL_DI_CREATE_INDEX | SQL_DI_DROP_INDEX;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_DEFAULT_TXN_ISOLATION:
		retValue.u.u32Value = SQL_TXN_READ_COMMITTED;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_DESCRIBE_PARAMETER:
		retValue.u.strPtr = cYes;
		break;
	case SQL_DM_VER: //		Implemented by DM
		break;
	case SQL_DRIVER_HDBC: //		Implemented by DM
	case SQL_DRIVER_HENV:
	case SQL_DRIVER_HDESC:
	case SQL_DRIVER_HLIB:
	case SQL_DRIVER_HSTMT:
		break;
	case SQL_DRIVER_NAME:
//		retValue.u.strPtr = gDrvrGlobal.gDriverDLLName;
		retValue.u.strPtr = DRIVER_DLL_NAME;
		break;
	case SQL_DRIVER_ODBC_VER:
		//sprintf(tmpStr, "%02d.%02d", gDrvrGlobal.gClientVersion.majorVersion,
		//	gDrvrGlobal.gClientVersion.minorVersion);
		sprintf(tmpStr, "%02d.%02d",3,51);
		retValue.u.strPtr = tmpStr;
		break;
	case SQL_DRIVER_VER:
		sprintf(tmpStr, "%02d.%02d.%04d", gDrvrGlobal.gClientVersion.majorVersion,
			gDrvrGlobal.gClientVersion.minorVersion, gDrvrGlobal.gClientVersion.buildId);
		retValue.u.strPtr = tmpStr;
		break;
	case SQL_DROP_ASSERTION:
	case SQL_DROP_CHARACTER_SET:		
	case SQL_DROP_COLLATION:			
	case SQL_DROP_DOMAIN:			
	case SQL_DROP_SCHEMA:
	case SQL_DROP_TRANSLATION:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_DROP_TABLE:
		retValue.u.u32Value = SQL_DT_DROP_TABLE | SQL_DT_RESTRICT | SQL_DT_CASCADE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_DROP_VIEW:
		retValue.u.u32Value = SQL_DV_DROP_VIEW | SQL_DV_RESTRICT | SQL_DV_CASCADE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:	
	case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:	
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_EXPRESSIONS_IN_ORDERBY:
		retValue.u.strPtr = cNo;						 // But we support column Number
		break;
	case SQL_FETCH_DIRECTION:
		retValue.u.u32Value = SQL_FD_FETCH_NEXT;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_FILE_USAGE:
		retValue.u.u16Value = SQL_FILE_NOT_SUPPORTED;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:	
		retValue.u.u32Value = SQL_CA1_NEXT | SQL_CA1_SELECT_FOR_UPDATE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:	
		retValue.u.u32Value = SQL_CA2_READ_ONLY_CONCURRENCY | SQL_CA2_LOCK_CONCURRENCY 
					| SQL_CA2_MAX_ROWS_SELECT;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_GETDATA_EXTENSIONS:
		retValue.u.u32Value = SQL_GD_ANY_COLUMN | SQL_GD_ANY_ORDER | SQL_GD_BOUND;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_GROUP_BY:
		retValue.u.u16Value = SQL_GB_GROUP_BY_EQUALS_SELECT;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_IDENTIFIER_CASE:
		retValue.u.u16Value = SQL_IC_UPPER;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_IDENTIFIER_QUOTE_CHAR:				
		retValue.u.strPtr = "\"";
		break;
	case SQL_INDEX_KEYWORDS:
		retValue.u.u32Value = SQL_IK_ALL;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_INFO_SCHEMA_VIEWS:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_INSERT_STATEMENT:
		retValue.u.u32Value = SQL_IS_INSERT_LITERALS | SQL_IS_INSERT_SEARCHED 
									| SQL_IS_SELECT_INTO;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_INTEGRITY:
		retValue.u.strPtr = cNo;
		break;
	case SQL_KEYSET_CURSOR_ATTRIBUTES1:	
	case SQL_KEYSET_CURSOR_ATTRIBUTES2:	
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;					
	case SQL_KEYWORDS:
		retValue.u.strPtr = cKeywords;
		break;
	case SQL_LIKE_ESCAPE_CLAUSE:
		retValue.u.strPtr = cYes;
		break;
	case SQL_LOCK_TYPES:							// 2.0
		retValue.u.u32Value = 0;					// Not supported
		retValue.dataType = SQL_IS_UINTEGER;
		break;	
	case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_MAX_BINARY_LITERAL_LEN:	
		retValue.u.u32Value = 2*4050;		// Must be SQL Version based
		retValue.dataType = SQL_IS_UINTEGER;
		break;	
	case SQL_MAX_CATALOG_NAME_LEN:		// renameed to SQL_MAX_QUALIFIER_NAME_LEN			
		//retValue.u.u16Value = 30;		// Must be SQL Version based
		retValue.u.u16Value = 128;		// 070815-1501 
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_CHAR_LITERAL_LEN:					// Must be SQL Version based
		retValue.u.u32Value = 4050;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_MAX_COLUMN_NAME_LEN:					// Must be SQL Version based
		retValue.u.u16Value = 128;				
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_COLUMNS_IN_GROUP_BY:
	case SQL_MAX_COLUMNS_IN_INDEX:
	case SQL_MAX_COLUMNS_IN_ORDER_BY:
	case SQL_MAX_COLUMNS_IN_SELECT:
	case SQL_MAX_COLUMNS_IN_TABLE:
		retValue.u.u16Value = 0;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_CONCURRENT_ACTIVITIES:
		retValue.u.u16Value = 0;			//Arvind: As per ODBC specs
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_CURSOR_NAME_LEN:
		//retValue.u.u16Value = 30;			// Must be SQL Version based
		retValue.u.u16Value = 128;			
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_DRIVER_CONNECTIONS:
		retValue.u.u16Value = 0;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_IDENTIFIER_LEN:
		//retValue.u.u16Value = 30;			// Must be SQL Version based
		retValue.u.u16Value = 128;			
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_INDEX_SIZE:
		retValue.u.u32Value = 4050;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_MAX_PROCEDURE_NAME_LEN: 
		retValue.u.u16Value = 128;			
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_ROW_SIZE:
		retValue.u.u32Value = 4050;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
		retValue.u.strPtr = cYes;
		break;
	case SQL_MAX_SCHEMA_NAME_LEN:
		retValue.u.u16Value = 128;			// Must be SQL Version based
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_STATEMENT_LEN:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_MAX_TABLE_NAME_LEN:
		retValue.u.u16Value = 128;			
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_TABLES_IN_SELECT:
		retValue.u.u16Value = 0;			
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MAX_USER_NAME_LEN:
		retValue.u.u16Value = 32;			// Based on Safeguard alias name
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_MULT_RESULT_SETS:
		retValue.u.strPtr = cNo;
		break;
	case SQL_MULTIPLE_ACTIVE_TXN:
		retValue.u.strPtr = cNo;
		break;
	case SQL_NEED_LONG_DATA_LEN:
		retValue.u.strPtr = cNo;
		break;
	case SQL_NON_NULLABLE_COLUMNS:
		retValue.u.u16Value = SQL_NNC_NON_NULL;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_NULL_COLLATION:
		retValue.u.u16Value = SQL_NC_HIGH;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_NUMERIC_FUNCTIONS:
		retValue.u.u32Value = SQL_FN_NUM_ABS | SQL_FN_NUM_ACOS | SQL_FN_NUM_ASIN
				| SQL_FN_NUM_ATAN | SQL_FN_NUM_ATAN2
				| SQL_FN_NUM_CEILING | SQL_FN_NUM_COS | SQL_FN_NUM_DEGREES
				| SQL_FN_NUM_EXP | SQL_FN_NUM_FLOOR | SQL_FN_NUM_LOG
				| SQL_FN_NUM_LOG10 | SQL_FN_NUM_MOD | SQL_FN_NUM_PI | SQL_FN_NUM_POWER
				| SQL_FN_NUM_RADIANS | SQL_FN_NUM_RAND | SQL_FN_NUM_SIGN
				| SQL_FN_NUM_SIN | SQL_FN_NUM_SQRT | SQL_FN_NUM_TAN;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ODBC_API_CONFORMANCE:
		retValue.u.u16Value = SQL_OAC_LEVEL2;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_ODBC_INTERFACE_CONFORMANCE: // 3.0
		retValue.u.u32Value = SQL_OIC_CORE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ODBC_SAG_CLI_CONFORMANCE:	// 1.0
		retValue.u.u16Value = SQL_OSCC_COMPLIANT;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_ODBC_SQL_CONFORMANCE:		// 1.0
		retValue.u.u16Value = SQL_OSC_CORE;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_ODBC_VER: // Implemented by DM
		break;
	case SQL_OJ_CAPABILITIES:
	case 65003:		// This is interim value used by DM when the ODBCVER >= 0x0201 && ODBCVER < 0x0300 
					// for SQL_OJ_CAPABILITIES
		retValue.u.u32Value = SQL_OJ_LEFT | SQL_OJ_RIGHT | SQL_OJ_FULL| SQL_OJ_NESTED | SQL_OJ_NOT_ORDERED | SQL_OJ_INNER |
				SQL_OJ_ALL_COMPARISON_OPS ;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_ORDER_BY_COLUMNS_IN_SELECT:
		retValue.u.strPtr = cNo;
		break;
	case SQL_OUTER_JOINS:
		retValue.u.strPtr = cYes;
		break;
	case SQL_PARAM_ARRAY_ROW_COUNTS:
		retValue.u.u32Value = SQL_PARC_NO_BATCH;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_PARAM_ARRAY_SELECTS:
		retValue.u.u32Value = SQL_PAS_NO_SELECT;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_POS_OPERATIONS:						// 2.0
		retValue.u.u32Value = 0;					// SQLSetPos unsupported
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_POSITIONED_STATEMENTS:					// 2.0
		retValue.u.u32Value = SQL_PS_POSITIONED_DELETE | SQL_PS_POSITIONED_UPDATE
					| SQL_PS_SELECT_FOR_UPDATE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_PROCEDURE_TERM:
		retValue.u.strPtr = "procedure";
		break;
	case SQL_PROCEDURES:
		retValue.u.strPtr = cYes;
		break;
	case SQL_QUOTED_IDENTIFIER_CASE:
		retValue.u.u16Value = SQL_IC_SENSITIVE;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_ROW_UPDATES:
		retValue.u.strPtr = cNo;
		break;
	case SQL_SCHEMA_TERM:
		retValue.u.strPtr = "schema";
		break;
	case SQL_SCHEMA_USAGE:
		retValue.u.u32Value = SQL_SU_DML_STATEMENTS | SQL_SU_TABLE_DEFINITION | SQL_SU_PRIVILEGE_DEFINITION;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SCROLL_CONCURRENCY:		// 1.0
		retValue.u.u32Value = SQL_SCCO_LOCK;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SCROLL_OPTIONS:
		retValue.u.u32Value = SQL_SO_FORWARD_ONLY;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SEARCH_PATTERN_ESCAPE:
		retValue.u.strPtr = "\\";
		break;
	case SQL_SERVER_NAME:
		retValue.u.strPtr = m_SrvrIdentity;
		if (strlen(m_SrvrIdentity) % 2 != 0)
			strcat(retValue.u.strPtr, " ");
		break;
	case SQL_SPECIAL_CHARACTERS:
		retValue.u.strPtr = "$\\";
		break;
	case SQL_SQL_CONFORMANCE:
		retValue.u.u32Value = SQL_SC_SQL92_ENTRY;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_DATETIME_FUNCTIONS:
		retValue.u.u32Value = SQL_SDF_CURRENT_DATE | SQL_SDF_CURRENT_TIME 
				| SQL_SDF_CURRENT_TIMESTAMP;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
	case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
	case SQL_SQL92_GRANT:
		retValue.u.u32Value = 0;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
		retValue.u.u32Value = SQL_SNVF_CHAR_LENGTH | SQL_SNVF_CHARACTER_LENGTH
				| SQL_SNVF_EXTRACT | SQL_SNVF_OCTET_LENGTH | SQL_SNVF_POSITION;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_PREDICATES:
		retValue.u.u32Value = SQL_SP_BETWEEN | SQL_SP_COMPARISON | SQL_SP_EXISTS | SQL_SP_IN
				| SQL_SP_ISNOTNULL | SQL_SP_ISNULL | SQL_SP_LIKE | SQL_SP_MATCH_FULL
				| SQL_SP_MATCH_PARTIAL | SQL_SP_QUANTIFIED_COMPARISON;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
		retValue.u.u32Value = SQL_SRJO_CROSS_JOIN | SQL_SRJO_FULL_OUTER_JOIN | SQL_SRJO_INNER_JOIN
				| SQL_SRJO_LEFT_OUTER_JOIN | SQL_SRJO_NATURAL_JOIN | SQL_SRJO_RIGHT_OUTER_JOIN
				| SQL_SRJO_UNION_JOIN | SQL_SRJO_CORRESPONDING_CLAUSE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_REVOKE:				
	case SQL_SQL92_ROW_VALUE_CONSTRUCTOR:	
		retValue.u.u32Value = 0;	
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_STRING_FUNCTIONS:		
		retValue.u.u32Value = SQL_SSF_CONVERT | SQL_SSF_LOWER | SQL_SSF_UPPER | SQL_SSF_SUBSTRING
				| SQL_SSF_TRIM_BOTH | SQL_SSF_TRIM_LEADING | SQL_SSF_TRIM_TRAILING;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SQL92_VALUE_EXPRESSIONS:		
		retValue.u.u32Value = SQL_SVE_CASE | SQL_SVE_CAST;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_STANDARD_CLI_CONFORMANCE:		
		retValue.u.u32Value = SQL_SCC_XOPEN_CLI_VERSION1 | SQL_SCC_ISO92_CLI;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_STATIC_CURSOR_ATTRIBUTES1:		
	case SQL_STATIC_CURSOR_ATTRIBUTES2:
		retValue.u.u32Value = 0;				
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_STATIC_SENSITIVITY:		// 2.0
		retValue.u.u32Value = SQL_SS_ADDITIONS | SQL_SS_DELETIONS | SQL_SS_UPDATES;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_STRING_FUNCTIONS:
		retValue.u.u32Value = SQL_FN_STR_ASCII | SQL_FN_STR_CHAR | SQL_FN_STR_CONCAT 
					| SQL_FN_STR_INSERT | SQL_FN_STR_LCASE | SQL_FN_STR_LEFT 
					| SQL_FN_STR_LENGTH | SQL_FN_STR_LOCATE_2| SQL_FN_STR_LTRIM
					| SQL_FN_STR_REPEAT | SQL_FN_STR_REPLACE
					| SQL_FN_STR_RIGHT | SQL_FN_STR_RTRIM | SQL_FN_STR_SPACE
					| SQL_FN_STR_SUBSTRING | SQL_FN_STR_UCASE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SUBQUERIES:
		retValue.u.u32Value = SQL_SQ_CORRELATED_SUBQUERIES | SQL_SQ_COMPARISON
					| SQL_SQ_EXISTS | SQL_SQ_IN | SQL_SQ_QUANTIFIED;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_SYSTEM_FUNCTIONS:
//		retValue.u.u32Value = SQL_FN_SYS_DBNAME | SQL_FN_SYS_USERNAME;
		retValue.u.u32Value = SQL_FN_SYS_USERNAME;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_TABLE_TERM:
		retValue.u.strPtr = "table";
		break;
	case SQL_TIMEDATE_ADD_INTERVALS:
		retValue.u.u32Value = SQL_FN_TSI_FRAC_SECOND | SQL_FN_TSI_SECOND
					| SQL_FN_TSI_MINUTE | SQL_FN_TSI_HOUR | SQL_FN_TSI_DAY
					| SQL_FN_TSI_WEEK | SQL_FN_TSI_MONTH | SQL_FN_TSI_YEAR;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_TIMEDATE_DIFF_INTERVALS:		
		retValue.u.u32Value = SQL_FN_TSI_FRAC_SECOND | SQL_FN_TSI_SECOND
					| SQL_FN_TSI_MINUTE | SQL_FN_TSI_HOUR | SQL_FN_TSI_DAY
					| SQL_FN_TSI_WEEK | SQL_FN_TSI_MONTH | SQL_FN_TSI_YEAR;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_TIMEDATE_FUNCTIONS:			
		retValue.u.u32Value = SQL_FN_TD_CURRENT_DATE | SQL_FN_TD_CURRENT_TIME 
				    | SQL_FN_TD_CURRENT_TIMESTAMP | SQL_FN_TD_DAYNAME 
				    | SQL_FN_TD_DAYOFMONTH | SQL_FN_TD_DAYOFWEEK 
				    | SQL_FN_TD_DAYOFYEAR | SQL_FN_TD_HOUR 
				    | SQL_FN_TD_MINUTE | SQL_FN_TD_MONTH 
				    | SQL_FN_TD_MONTHNAME | SQL_FN_TD_QUARTER 
				    | SQL_FN_TD_SECOND | SQL_FN_TD_WEEK 
				    | SQL_FN_TD_YEAR;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_TXN_CAPABLE:
		retValue.u.u16Value = SQL_TC_ALL;
		retValue.dataType = SQL_IS_USMALLINT;
		break;
	case SQL_TXN_ISOLATION_OPTION:
		retValue.u.u32Value = SQL_TXN_READ_UNCOMMITTED | SQL_TXN_READ_COMMITTED
					| SQL_TXN_REPEATABLE_READ  | SQL_TXN_SERIALIZABLE;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_UNION:
		retValue.u.u32Value = SQL_U_UNION;
		retValue.dataType = SQL_IS_UINTEGER;
		break;
	case SQL_USER_NAME:
		retValue.u.strPtr = m_UserName;
		break;
	case SQL_XOPEN_CLI_YEAR: 
		retValue.u.strPtr = "1995";
		break;
	default:
		setDiagRec(DRIVER_ERROR, IDS_HY_096);
		rc = SQL_ERROR;
		break;
	}

	if (rc == SQL_SUCCESS)
	{
		rc = returnAttrValue(TRUE, this, &retValue, InfoValuePtr, 
					BufferLength, &lStringLength);
		
		if (StringLengthPtr != NULL)
			*StringLengthPtr = (SQLSMALLINT)lStringLength;
	}
	return rc;
}

short CConnect::getTransactionNumber(void)
{
	CHANDLECOLLECT::iterator i;
	short count=0;
	for (i = m_StmtCollect.begin() ; i !=  m_StmtCollect.end() ; ++i)
		if(((CStmt *)(*i))->getStmtState() == STMT_FETCHED)
			count++;
	return count;
}

void CConnect::deleteValueList()
{ 
	CHANDLECOLLECT::iterator i;
	for (i = m_StmtCollect.begin() ; i !=  m_StmtCollect.end() ; ++i)
		((CStmt *)(*i))->deleteValueList();
}

SQLRETURN CConnect::NativeSql(
    SQLWCHAR 		  *InStatementTextW,
    SQLINTEGER         TextLength1,
    SQLWCHAR 		  *OutStatementTextW,
    SQLINTEGER         BufferLength,
    SQLINTEGER 		  *TextLength2Ptr)
{
	SQLRETURN		rc = SQL_SUCCESS;
	SQLINTEGER		InStrLen;
	
	if (TextLength1 == SQL_NTS)
		InStrLen = wcslen((const wchar_t *)InStatementTextW);
	else
		InStrLen = TextLength1;

	if (OutStatementTextW != NULL)
	{
		if (BufferLength == SQL_NTS || (BufferLength > 0 && InStrLen < BufferLength))
		{
			wcsncpy((wchar_t *)OutStatementTextW, (const wchar_t *)InStatementTextW, InStrLen);
			((wchar_t *)OutStatementTextW)[InStrLen] = L'\0';
		}
		else
		{
			wcsncpy((wchar_t *)OutStatementTextW, (const wchar_t *)InStatementTextW, BufferLength-1);
			((wchar_t *)OutStatementTextW)[BufferLength-1] = L'\0';
			setDiagRec(DRIVER_ERROR, IDS_01_004);
			rc = SQL_SUCCESS_WITH_INFO;
		}

	}
	if (TextLength2Ptr != NULL)
		*TextLength2Ptr = InStrLen;

	return rc;
}

DWORD CConnect::getSqlCharSet(long inSqlCharSet)
{
	switch(inSqlCharSet)
	{
	case SQLCHARSETCODE_ISO88591:
		return cnv_ISO88591;
	case SQLCHARSETCODE_SJIS:
		return cnv_SJIS;
	case SQLCHARSETCODE_KSC5601:
		return cnv_KSC;
	case SQLCHARSETCODE_BIG5:
		return cnv_BIG5;
	case SQLCHARSETCODE_GB2312:
		return cnv_GB2312;
	case SQLCHARSETCODE_GB18030:
		return cnv_GB18030;
	case SQLCHARSETCODE_UTF8:
		return cnv_UTF8;
	case SQLCHARSETCODE_UCS2:
		return cnv_UTF16;
	case SQLCHARSETCODE_UNKNOWN:
	case SQLCHARSETCODE_KANJI:
	default:
		return cnv_ISO88591;
	}
}

DWORD CConnect::getDrvrCharSet()
{
	DWORD langID;
	if (m_DSValue.m_DSCharSet == 0) // SYSTEM_DEFAULT
	{
		langID = GetSystemDefaultLangID();
		switch(langID)
		{
		case 0x0404: // Chinese (Taiwan Region)
			return cnv_BIG5;
		case 0x0804: // Chinese (PRC)
			return cnv_GBK;
		case 0x0409: // English (US)
			return cnv_ISO88591;
		case 0x0411: // Japanese
			return cnv_SJIS;
		case 0x0412: // Korean
			return cnv_KSC;
		default:
			return cnv_ISO88591;
		}
	}
	else
		return m_DSValue.m_DSCharSet;
}
//UTF8 character identification in the following code
//The most significant bit of a single-byte character is always 0. 
//The most significant bits of the first byte of a multi-byte sequence determine the length of the sequence. 
//These most significant bits are: 110 for two-byte sequences; 1110 for three-byte sequences, and so on. 
//The remaining bytes in a multi-byte sequence have 10 as their two most significant bits. 	
int CConnect::getUTF8CharLength(const char *inputChar, const int inputLength, const int maxLength)
{
	int length = 0;
	int numBytesInChar = 0;
	int idx = 0;
	unsigned char byte;

	while (inputChar[idx])
	{
		byte = inputChar[idx];
		if (byte & 0x80) //multibyte ?
		{    
			if ((byte & 0x40) && (byte & 0x20) && (byte & 0x10))
				numBytesInChar = 4;
			else if ((byte & 0x40) && (byte & 0x20) && !(byte & 0x10))
				numBytesInChar = 3;
			else if ((byte & 0x40) && !(byte & 0x20) && !(byte & 0x10))
				numBytesInChar = 2;
			if ((idx + numBytesInChar) > maxLength)
				break;
		}
		else
		{
			numBytesInChar = 1;
			if ((idx + numBytesInChar) > maxLength)
				break;
		}

		idx += numBytesInChar;
		length += numBytesInChar;
	}

	return length;
}

SQLRETURN CConnect::DoEncryption(SecPwd* &pSecPwd, ProcInfo SecInfo, USER_DESC_def &userDesc,char *AuthenticationNTS,CONNECTION_CONTEXT_def &inContext)
{
	short retCode=SQL_SUCCESS;

	char *dir;
	char *file;
	char *activefile;
	unsigned char *certificate_ts; 

	dir = NULL;
	file = NULL;
	activefile = NULL;
	certificate_ts = NULL;

	char *pwdKey=NULL;
	int	  pwdKeyLen=0;


	if (m_CertificateDir[0] != '\0')
		dir = m_CertificateDir;
	else if (m_DSValue.m_DSCertificateDir[0] != '\0' && strcmp(m_DSValue.m_DSCertificateDir, "SYSTEM_DEFAULT") != 0)
		dir = m_DSValue.m_DSCertificateDir;
	if (m_CertificateFile[0] != '\0')
		file = m_CertificateFile;
	else if (m_DSValue.m_DSCertificateFile[0] != '\0')
		file = m_DSValue.m_DSCertificateFile;
	if (m_CertificateFileActive[0] != '\0')
		activefile = m_CertificateFileActive;
	else if (m_DSValue.m_DSCertificateFileActive[0] != '\0')
		activefile = m_DSValue.m_DSCertificateFileActive;

	if (dir==NULL)
		TraceOut(TR_ODBC_API, "CertificateDir=NULL");
	else
		TraceOut(TR_ODBC_API, "CertificateDir=%s", dir);
	if (file==NULL)
		TraceOut(TR_ODBC_API, "CertificateFile=NULL");
	else
		TraceOut(TR_ODBC_API, "CertificateFile=%s", file);
	if (activefile==NULL)
		TraceOut(TR_ODBC_API, "ActiveCertificateFile=NULL");
	else
		TraceOut(TR_ODBC_API, "ActiveCertificateFile=%s", activefile);

	try 
	{
		if(pSecPwd == NULL)
			// CR6277. In SecPwd, it used stat() to check the directory,
			// stat() returns -1 when the directory contains trailing backslash.
			// Remove the trailing backslash from the directory.
			if(dir != NULL)
			{
				if(dir[strlen(dir)-1] == '\\')
				{
					dir[strlen(dir)-1] = '\0';
				}
			}
			pSecPwd = new SecPwd(dir, file, activefile, m_ClusterName);
	} 
	catch (SecurityException se) {
		retCode = se.getErrCode();
		setSecurityError(retCode, se.getSQLState(), se.getMsg());
	}

	if (retCode == SQL_SUCCESS)
	{
		try
		{
			pSecPwd->openCertificate();
		} 
		catch (SecurityException se) 
		{
			retCode = se.getErrCode();
			if (retCode == FILE_NOTFOUND) // certificate file not found, need to download
				inContext.inContextOptions1 = inContext.inContextOptions1 | INCONTEXT_OPT1_CERTIFICATE_TIMESTAMP;
			else
				setSecurityError(retCode, se.getSQLState(), se.getMsg());
		}
	}

	if (retCode == SQL_SUCCESS)
	{
		try
		{
			certificate_ts = pSecPwd->getCertExpDate();
			inContext.inContextOptions1 = inContext.inContextOptions1 | INCONTEXT_OPT1_CERTIFICATE_TIMESTAMP;
			inContext.connectOptions = (IDL_string)certificate_ts;
			pwdKeyLen = pSecPwd->getPwdEBufferLen();
			pwdKey = new char [pwdKeyLen]; // caller needs to free this
			pSecPwd->encryptPwd(AuthenticationNTS, strlen(AuthenticationNTS),
								 inContext.userRole, strlen(inContext.userRole),
								 (const char*)&m_SecInfo, sizeof(m_SecInfo),
								 pwdKey, &pwdKeyLen);
		} 
		catch (SecurityException se) {
			retCode = se.getErrCode();
			setSecurityError(retCode, se.getSQLState(), se.getMsg());
		}
	}

	if (retCode == SQL_SUCCESS)
	{
		userDesc.password._length = pwdKeyLen;
		userDesc.password._buffer = (IDL_octet *)pwdKey;
	}
	else
	{
		userDesc.userName = NULL;
		userDesc.password._length = 0;
		userDesc.password._buffer = NULL;
	}

	return retCode;

} /* DoEncryption() */

void CConnect::setSecurityError(int error, char* sqlState, char* errorMsg)
{
	setDiagRec(SQLMX_ERROR, IDS_SQL_ERROR, error, errorMsg, sqlState);
	return;
}

