int RS_CONN_INFO::doesNeedMoreBrowseConnectStr()

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;
}