in src/odbc/rsodbc/rsconnect.cpp [2635:2805]
int RS_CONN_INFO::doesNeedMoreBrowseConnectStr(char *_szConnStrIn,char *szConnStrOut, SWORD cbConnStrOut, SWORD *pcbConnStrOut,
int iBrowseIteration, RS_CONN_INFO *pConn)
{
int iNeedMoreData = 0;
char *pKeyword, *pDrvKeyword, *pDsnKeyword;
int iUpdated = 0;
size_t cbBrowseConnectOutStr = INITIAL_CONNECT_STR_LEN;
char *pszBrowseConnectOutStr = (char *)rs_malloc(cbBrowseConnectOutStr);
char *szConnStrIn = NULL;
RS_CONNECT_PROPS_INFO *pConnectProps = pConn->pConnectProps;
char tempBuf[MAX_IDEN_LEN];
char tempBuf2[MAX_IDEN_LEN];
char *szRequiredConnKeywords[MAX_REQUIRED_CONNECT_KEYWORDS] =
{
"Database=",
"HostName=",
"PortNumber=",
"LogonID=",
NULL
};
char *szRequiredConnKeywordsSynonyms[MAX_REQUIRED_CONNECT_KEYWORDS] =
{
"DB=",
"Server=",
"PORT=",
"UID=",
NULL
};
char *szOptionalConnKeywords[MAX_OPTIONAL_CONNECT_KEYWORDS] =
{
"Password=",
NULL
};
char *szOptionalConnKeywordsSynonyms[MAX_OPTIONAL_CONNECT_KEYWORDS] =
{
"PWD=",
NULL
};
int i;
pszBrowseConnectOutStr[0] = '\0';
if(_szConnStrIn && *_szConnStrIn != '\0')
{
szConnStrIn = rs_strdup(_szConnStrIn, SQL_NTS);
pDrvKeyword = stristr(szConnStrIn,"Driver");
pDsnKeyword = stristr(szConnStrIn,"DSN");
if(pDrvKeyword || pDsnKeyword)
{
if (pDsnKeyword) {
// Parse the input string for DSN
pConn->parseConnectString(szConnStrIn, SQL_NTS, FALSE, TRUE);
}
/* Required keywords */
for(i = 0;i < MAX_REQUIRED_CONNECT_KEYWORDS;i++)
{
if(szRequiredConnKeywords[i] == NULL)
break;
pKeyword = stristr(szConnStrIn,szRequiredConnKeywords[i]);
if(!pKeyword)
pKeyword = stristr(szConnStrIn,szRequiredConnKeywordsSynonyms[i]);
if(!pKeyword && pDsnKeyword) {
tempBuf[0] = '\0';
rs_strncpy(tempBuf2, szRequiredConnKeywords[i], sizeof(tempBuf2));
tempBuf2[strlen(tempBuf2) -1] = '\0'; // Remove "="
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, tempBuf2, "", tempBuf, MAX_IDEN_LEN, ODBC_INI);
if (tempBuf[0] == '\0') {
rs_strncpy(tempBuf2, szRequiredConnKeywordsSynonyms[i],sizeof(tempBuf2));
tempBuf2[strlen(tempBuf2) -1] = '\0'; // Remove "="
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, tempBuf2, "", tempBuf, MAX_IDEN_LEN, ODBC_INI);
}
if (tempBuf[0] != '\0')
pKeyword = pDsnKeyword; // DSN contains required keyword
else
pKeyword = NULL;
} // DSN
if(!pKeyword)
{
pszBrowseConnectOutStr = appendStr(pszBrowseConnectOutStr, &cbBrowseConnectOutStr, szRequiredConnKeywords[i]);
pszBrowseConnectOutStr = appendStr(pszBrowseConnectOutStr, &cbBrowseConnectOutStr,"?;");
iUpdated = 1;
}
} // Loop
/* Optional keywords */
if(iBrowseIteration == 1)
{
for(i = 0;i < MAX_OPTIONAL_CONNECT_KEYWORDS;i++)
{
if(szOptionalConnKeywords[i] == NULL)
break;
pKeyword = stristr(szConnStrIn,szOptionalConnKeywords[i]);
if(!pKeyword)
pKeyword = stristr(szConnStrIn,szOptionalConnKeywordsSynonyms[i]);
if(!pKeyword && pDsnKeyword) {
tempBuf[0] = '\0';
rs_strncpy(tempBuf2, szOptionalConnKeywords[i],sizeof(tempBuf2));
tempBuf2[strlen(tempBuf2) -1] = '\0'; // Remove "="
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, tempBuf2, "", tempBuf, MAX_IDEN_LEN, ODBC_INI);
if (tempBuf[0] == '\0') {
rs_strncpy(tempBuf2, szOptionalConnKeywordsSynonyms[i],sizeof(tempBuf2));
tempBuf2[strlen(tempBuf2) -1] = '\0'; // Remove "="
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, tempBuf2, "", tempBuf, MAX_IDEN_LEN, ODBC_INI);
}
if (tempBuf[0] != '\0')
pKeyword = pDsnKeyword; // DSN contains required keyword
else
pKeyword = NULL;
} // DSN
if(!pKeyword)
{
pszBrowseConnectOutStr = appendStr(pszBrowseConnectOutStr, &cbBrowseConnectOutStr,"*");
pszBrowseConnectOutStr = appendStr(pszBrowseConnectOutStr, &cbBrowseConnectOutStr, szOptionalConnKeywords[i]);
pszBrowseConnectOutStr = appendStr(pszBrowseConnectOutStr, &cbBrowseConnectOutStr,"?;");
iUpdated = 1;
}
} // Loop
} // Iteration 1
}
else
iNeedMoreData = -1;
// Free mem
szConnStrIn = (char *)rs_free(szConnStrIn);
}
else
iNeedMoreData = -1;
if(iUpdated)
{
iNeedMoreData = 1;
if(szConnStrOut)
{
strncpy(szConnStrOut,pszBrowseConnectOutStr,cbConnStrOut - 1);
if(pcbConnStrOut)
*pcbConnStrOut = (SWORD)strlen((char *)szConnStrOut);
}
else
{
if (pcbConnStrOut)
*pcbConnStrOut = (SWORD)strlen((char *)pszBrowseConnectOutStr);
}
}
pszBrowseConnectOutStr = (char *)rs_free(pszBrowseConnectOutStr);
return iNeedMoreData;
}