SQLRETURN SQL_API RS_CONN_INFO::RS_SQLBrowseConnect()

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