in src/odbc/rsodbc/rsconnect.cpp [514:816]
SQLRETURN SQL_API RS_CONN_INFO::RS_SQLDriverConnect(SQLHDBC phdbc,
SQLHWND hwnd,
SQLCHAR *szConnStrIn,
SQLSMALLINT cbConnStrIn,
SQLCHAR *szConnStrOut,
SQLSMALLINT cbConnStrOut,
SQLSMALLINT *pcbConnStrOut,
SQLUSMALLINT hDriverCompletion)
{
SQLRETURN rc = SQL_SUCCESS;
#ifdef WIN32
short iRet;
#endif
int iPrompt = FALSE;
RS_CONNECT_PROPS_INFO *pConnectProps;
size_t actualOutputLen = 0;
char *pKeyword = NULL;
if(!VALID_HDBC(phdbc))
{
rc = SQL_INVALID_HANDLE;
goto error;
}
else
{
RS_CONN_INFO *pConn = (RS_CONN_INFO *)phdbc;
// Clear error list
pConn->pErrorList = clearErrorList(pConn->pErrorList);
if ((hDriverCompletion != SQL_DRIVER_COMPLETE)
&&(hDriverCompletion != SQL_DRIVER_PROMPT)
&& (hDriverCompletion != SQL_DRIVER_COMPLETE_REQUIRED)
&& (hDriverCompletion != SQL_DRIVER_NOPROMPT))
{
addError(&pConn->pErrorList,"HY000", "Invalid driver completion option", 0, NULL);
rc = SQL_ERROR;
goto error;
}
if ((cbConnStrIn != SQL_NTS) && (cbConnStrIn < 0))
{
addError(&pConn->pErrorList,"HY000","Invalid connection string length", 0, NULL);
rc = SQL_ERROR;
goto error;
}
pConnectProps = pConn->pConnectProps;
pConn->resetConnectProps();
if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
{
iPrompt = TRUE;
}
// Parse the input string for DSN
pConn->parseConnectString((char *)szConnStrIn, cbConnStrIn, FALSE , TRUE);
// Read reg using DSN
pConn->readMoreConnectPropsFromRegistry(TRUE);
// Parse the input string for all
pConn->parseConnectString((char *)szConnStrIn, cbConnStrIn, TRUE , FALSE);
initTraceFromConnectionString(pConn->pConnectProps);
if(hDriverCompletion == SQL_DRIVER_NOPROMPT)
iPrompt = FALSE;
else
{
if(pConnectProps->szPort[0] == '\0' || pConnectProps->szDatabase[0] == '\0')
{
iPrompt = TRUE;
}
}
if(iPrompt)
{
#ifdef WIN32
if(hwnd == NULL)
{
addError(&pConn->pErrorList,"HY092", "Invalid attribute/option identifier", 0, NULL);
rc = SQL_ERROR;
goto error;
}
iRet = (short)DialogBoxParam((HINSTANCE)gRsGlobalVars.hModule,
MAKEINTRESOURCE(DRIVER_CONNECT_DIALOG), (HWND) hwnd,
(DLGPROC) driverConnectProcLoop, (LPARAM)phdbc);
if(iRet == -1)
{
addError(&pConn->pErrorList,"HY000", "Dialog couldn't created", 0, NULL);
rc = SQL_ERROR;
goto error;
}
else
if(iRet == DRV_CONNECT_DLG_ERROR)
rc = SQL_ERROR;
else
if (!iRet)
rc = SQL_NO_DATA_FOUND;
else
rc = SQL_SUCCESS;
#endif
#if defined LINUX
addError(&pConn->pErrorList,"HY000", "Dialog couldn't created", 0, NULL);
rc = SQL_ERROR;
goto error;
#endif
if(rc != SQL_SUCCESS)
goto error;
}
else
{
if (pConnectProps->szDSN[0] != '\0')
{
pConn->iInternal = TRUE;
rc = RS_CONN_INFO::RS_SQLConnect(phdbc, (SQLCHAR *)(pConnectProps->szDSN), SQL_NTS, (SQLCHAR *)(pConnectProps->szUser), SQL_NTS, (SQLCHAR *)(pConnectProps->szPassword), SQL_NTS);
pConn->iInternal = FALSE;
}
else
{
// Check for AuthProfile
rc = pConn->readAuthProfile(TRUE);
if (rc == SQL_ERROR)
{
goto error;
}
/* DSN less connection
*/
if (pConnectProps->szPort[0] == '\0')
strncpy(pConnectProps->szPort, DEFAULT_PORT, sizeof(pConnectProps->szPort));
if(pConnectProps->szHost[0] == '\0')
{
// When host is empty, the workgroup or cluster ID must be present. With managed VPC value
// the parameters should be supplied in order to identify the corrent instance to connect to.
// If managed VPC is not supplied, the parameters should present because we are making serverless
// connection using the GetClusterCredentials API.
if ((pConnectProps->pIamProps->szClusterId[0] == '\0') &&
(pConnectProps->pIamProps->szWorkGroup[0] == '\0'))
{
addError(
&pConn->pErrorList,
"HY000",
"Required keyword ClusterID or Workgroup not found in connection string for managed VPC connection",
0,
NULL
);
rc = SQL_ERROR;
}
else {
rc = doConnection(pConn);
}
}
else if (pConnectProps->szDatabase[0] == '\0') {
addError(&pConn->pErrorList, "HY000", "Required keyword Database not found in connection string", 0, NULL);
rc = SQL_ERROR;
}
else
{
rc = doConnection(pConn);
}
}
if (rc != SQL_SUCCESS)
goto error;
}
if(szConnStrOut && (cbConnStrOut > 0))
*szConnStrOut = '\0';
if(pConnectProps->szDSN[0])
{
if(szConnStrOut && (cbConnStrOut > 0))
{
strncat((char *)szConnStrOut, "DSN=", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat((char *)szConnStrOut, pConnectProps->szDSN, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat((char *)szConnStrOut, ";", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
}
actualOutputLen += strlen("DSN=");
actualOutputLen += strlen(pConnectProps->szDSN);
actualOutputLen += strlen(";");
}
if(pConnectProps->szDriver[0])
{
if(szConnStrOut && (cbConnStrOut > 0))
{
strncat((char *)szConnStrOut, "Driver=", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat((char *)szConnStrOut, pConnectProps->szDriver, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat((char *)szConnStrOut, ";", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
}
actualOutputLen += strlen("Driver=");
actualOutputLen += strlen(pConnectProps->szDriver);
actualOutputLen += strlen(";");
}
if(pConnectProps->szDatabase[0])
{
pKeyword = (char *)((pConnectProps->iDatabaseKeyWordType == SHORT_NAME_KEYWORD) ? "DB=" : "Database=");
if(szConnStrOut && (cbConnStrOut > 0))
{
strncat((char *)szConnStrOut, pKeyword, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat((char *)szConnStrOut, pConnectProps->szDatabase, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat((char *)szConnStrOut, ";", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
}
actualOutputLen += strlen(pKeyword);
actualOutputLen += strlen(pConnectProps->szDatabase);
actualOutputLen += strlen(";");
}
if(pConnectProps->szUser[0])
{
pKeyword = (char *)((pConnectProps->iUserKeyWordType == SHORT_NAME_KEYWORD) ? "UID=" : "LogonID=");
if(szConnStrOut && (cbConnStrOut > 0))
{
strncat( (char *)szConnStrOut, pKeyword, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, pConnectProps->szUser, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, ";", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
}
actualOutputLen += strlen(pKeyword);
actualOutputLen += strlen(pConnectProps->szUser);
actualOutputLen += strlen(";");
}
if(pConnectProps->szPassword[0])
{
pKeyword = (char *)((pConnectProps->iPasswordKeyWordType == SHORT_NAME_KEYWORD) ? "PWD=" : "Password=");
if(szConnStrOut && (cbConnStrOut > 0))
{
strncat( (char *)szConnStrOut, pKeyword, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, pConnectProps->szPassword, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, ";", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
}
actualOutputLen += strlen(pKeyword);
actualOutputLen += strlen(pConnectProps->szPassword);
actualOutputLen += strlen(";");
}
if(pConnectProps->szHost[0])
{
pKeyword = (char *)((pConnectProps->iHostNameKeyWordType == SHORT_NAME_KEYWORD) ? "Server=" : "HostName=");
if(szConnStrOut && (cbConnStrOut > 0))
{
strncat( (char *)szConnStrOut, pKeyword, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, pConnectProps->szHost, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, ";", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
}
actualOutputLen += strlen(pKeyword);
actualOutputLen += strlen(pConnectProps->szHost);
actualOutputLen += strlen(";");
}
if(pConnectProps->szPort[0])
{
pKeyword = (char *)((pConnectProps->iPortKeyWordType == SHORT_NAME_KEYWORD) ? "Port=" : "PortNumber=");
if(szConnStrOut && (cbConnStrOut > 0))
{
strncat( (char *)szConnStrOut, pKeyword, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, pConnectProps->szPort, (cbConnStrOut - strlen((char *)szConnStrOut)-1));
strncat( (char *)szConnStrOut, ";", (cbConnStrOut - strlen((char *)szConnStrOut)-1));
}
actualOutputLen += strlen(pKeyword);
actualOutputLen += strlen(pConnectProps->szPort);
actualOutputLen += strlen(";");
}
if(pcbConnStrOut)
*pcbConnStrOut = (short) actualOutputLen;
if(szConnStrOut && (cbConnStrOut > 0))
{
if(actualOutputLen > strlen((char *)szConnStrOut))
rc = SQL_SUCCESS_WITH_INFO;
}
else
if(actualOutputLen > 0)
rc = SQL_SUCCESS_WITH_INFO;
}
error:
return rc;
}