in src/odbc/rsodbc/rsconnect.cpp [916:1056]
SQLRETURN SQL_API RS_CONN_INFO::RS_SQLBrowseConnect(SQLHDBC phdbc,
SQLCHAR *szConnStrIn,
SQLSMALLINT cbConnStrIn,
SQLCHAR *szConnStrOut,
SQLSMALLINT cbConnStrOut,
SQLSMALLINT *pcbConnStrOut)
{
SQLRETURN rc = SQL_SUCCESS;
int iNeedMoreData = 0;
char *pszBrowseConnectInStr = NULL;
char *pConnStr;
RS_CONNECT_PROPS_INFO *pConnectProps;
size_t actualOutputLen = 0;
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 ((cbConnStrIn != SQL_NTS) && (cbConnStrIn < 0))
{
addError(&pConn->pErrorList,"HY000","Invalid connection string length", 0, NULL);
rc = SQL_ERROR;
goto error;
}
pszBrowseConnectInStr = rs_strdup((char *)szConnStrIn, cbConnStrIn);
pConnectProps = pConn->pConnectProps;
if(pConn->iBrowseIteration == 0)
{
pConn->resetConnectProps();
pConn->setConnectStr(pszBrowseConnectInStr);
}
else
pConn->appendConnectStr(pszBrowseConnectInStr);
// Free it bcoz we already copied it.
pszBrowseConnectInStr = (char *)rs_free(pszBrowseConnectInStr);
(pConn->iBrowseIteration)++;
pConnStr = pConn->getConnectStr();
iNeedMoreData = RS_CONN_INFO::doesNeedMoreBrowseConnectStr(pConnStr, (char *)szConnStrOut, cbConnStrOut, pcbConnStrOut, pConn->iBrowseIteration, pConn);
if(iNeedMoreData > 0)
{
rc = SQL_NEED_DATA;
goto error;
}
else
if(iNeedMoreData < 0)
{
addError(&pConn->pErrorList,"01S00","Invalid connection string attribute", 0, NULL);
rc = SQL_ERROR;
pConn->iBrowseIteration = 0;
goto error;
}
else
pConn->iBrowseIteration = 0;
// Parse the input string for DSN
pConn->parseConnectString(pConnStr, SQL_NTS, FALSE, TRUE);
// Read reg using DSN
pConn->readMoreConnectPropsFromRegistry(TRUE);
// Parse the input string for all
pConn->parseConnectString(pConnStr, SQL_NTS, TRUE, FALSE);
initTraceFromConnectionString(pConn->pConnectProps);
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
{
/* DSN less connection
*/
// Check for AuthProfile
rc = pConn->readAuthProfile(TRUE);
if (rc == SQL_ERROR)
{
goto error;
}
if(pConnectProps->szHost[0] == '\0'
|| pConnectProps->szPort[0] == '\0'
|| pConnectProps->szDatabase[0] == '\0'
|| pConnectProps->szUser[0] == '\0')
{
addError(&pConn->pErrorList,"HY000", "Required keyword(s) HOST/PORT/Database/UID does not found in connection string", 0, NULL);
rc = SQL_ERROR;
}
else
{
rc = doConnection(pConn);
}
}
if(rc != SQL_SUCCESS)
goto error;
if(pConnStr)
actualOutputLen = strlen(pConnStr);
if(pcbConnStrOut)
*pcbConnStrOut = (short)actualOutputLen;
if(szConnStrOut && (cbConnStrOut > 0))
{
*szConnStrOut = '\0';
strncpy((char *)szConnStrOut,pConnStr,cbConnStrOut-1);
}
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;
}