SQLRETURN SQL_API RS_CONN_INFO::RS_SQLDriverConnect()

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