in src/odbc/rsodbc/rsconnect.cpp [1970:2425]
int RS_CONN_INFO::parseConnectString(char *szConnStrIn, size_t cbConnStrIn, int append,int onlyDSN)
{
RS_CONN_INFO *pConn = this;
int valid = TRUE;
RS_CONNECT_PROPS_INFO *pConnectProps = pConn->pConnectProps;
RS_CONN_ATTR_INFO *pConnAttr = pConn->pConnAttr;
RS_IAM_CONN_PROPS_INFO *pIamProps = pConnectProps->pIamProps;
RS_PROXY_CONN_PROPS_INFO *pHttpsProps = pConnectProps->pHttpsProps;
RS_TCP_PROXY_CONN_PROPS_INFO *pTcpProxyProps = pConnectProps->pTcpProxyProps;
if(!pConnectProps->pIamProps){
pConnectProps->pIamProps = (RS_IAM_CONN_PROPS_INFO *)rs_calloc(1, sizeof(RS_IAM_CONN_PROPS_INFO));
pIamProps = pConnectProps->pIamProps;
}
if(!pConnectProps->pHttpsProps){
pConnectProps->pHttpsProps = (RS_PROXY_CONN_PROPS_INFO *)rs_calloc(1,sizeof(RS_PROXY_CONN_PROPS_INFO));
pHttpsProps = pConnectProps->pHttpsProps;
}
if (!pConnectProps->pTcpProxyProps) {
pConnectProps->pTcpProxyProps = (RS_TCP_PROXY_CONN_PROPS_INFO *)rs_calloc(
1, sizeof(RS_TCP_PROXY_CONN_PROPS_INFO));
pTcpProxyProps = pConnectProps->pTcpProxyProps;
}
// Internal lambda function applied to each extracted key-value
auto processKeyVal = [&](const char *pname, const char *pval) {
if (onlyDSN) {
// We are looking for only DSN first.
if (_stricmp(pname, RS_DSN) == 0) {
if (pConnectProps->szDSN[0] == '\0') {
strncpy(pConnectProps->szDSN, pval, MAX_IDEN_LEN - 1);
pConnectProps->szDSN[MAX_IDEN_LEN - 1] = '\0';
}
}
} else {
/*
* Store the value, if same param is not repeated.
*/
if (_stricmp(pname, RS_HOST_NAME) == 0 ||
_stricmp(pname, RS_HOST) == 0 || _stricmp(pname, RS_SERVER) == 0) {
pConnectProps->iHostNameKeyWordType =
(_stricmp(pname, RS_HOST_NAME) == 0) ? LONG_NAME_KEYWORD
: SHORT_NAME_KEYWORD;
if (CAN_OVERRIDE_DSN || pConnectProps->szHost[0] == '\0') {
strncpy(pConnectProps->szHost, pval, MAX_IDEN_LEN - 1);
pConnectProps->szHost[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_PORT_NUMBER) == 0 ||
_stricmp(pname, RS_PORT) == 0) {
pConnectProps->iPortKeyWordType =
(_stricmp(pname, RS_PORT_NUMBER) == 0)
? LONG_NAME_KEYWORD
: SHORT_NAME_KEYWORD;
if (CAN_OVERRIDE_DSN || pConnectProps->szPort[0] == '\0') {
strncpy(pConnectProps->szPort, pval, MAX_IDEN_LEN - 1);
pConnectProps->szPort[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_DATABASE) == 0 ||
_stricmp(pname, RS_DB) == 0) {
pConnectProps->iDatabaseKeyWordType =
(_stricmp(pname, RS_DATABASE) == 0)
? LONG_NAME_KEYWORD
: SHORT_NAME_KEYWORD;
if (CAN_OVERRIDE_DSN ||
pConnectProps->szDatabase[0] == '\0') {
strncpy(pConnectProps->szDatabase, pval,
MAX_IDEN_LEN - 1);
pConnectProps->szDatabase[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_LOGON_ID) == 0 ||
_stricmp(pname, RS_UID) == 0) {
pConnectProps->iUserKeyWordType =
(_stricmp(pname, RS_LOGON_ID) == 0)
? LONG_NAME_KEYWORD
: SHORT_NAME_KEYWORD;
if (CAN_OVERRIDE_DSN || pConnectProps->szUser[0] == '\0') {
strncpy(pConnectProps->szUser, pval, MAX_IDEN_LEN - 1);
pConnectProps->szUser[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_USER) == 0) {
if (CAN_OVERRIDE_DSN || pConnectProps->szUser[0] == '\0') {
strncpy(pConnectProps->szUser, pval, MAX_IDEN_LEN - 1);
pConnectProps->szUser[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_PASSWORD) == 0 ||
_stricmp(pname, RS_PWD) == 0) {
pConnectProps->iPasswordKeyWordType =
(_stricmp(pname, RS_PASSWORD) == 0)
? LONG_NAME_KEYWORD
: SHORT_NAME_KEYWORD;
if (CAN_OVERRIDE_DSN ||
pConnectProps->szPassword[0] == '\0') {
strncpy(pConnectProps->szPassword, pval,
MAX_IDEN_LEN - 1);
pConnectProps->szPassword[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_DSN) == 0) {
if (CAN_OVERRIDE_DSN || pConnectProps->szDSN[0] == '\0') {
strncpy(pConnectProps->szDSN, pval, MAX_IDEN_LEN - 1);
pConnectProps->szDSN[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_DRIVER) == 0) {
if (CAN_OVERRIDE_DSN ||
pConnectProps->szDriver[0] == '\0') {
strncpy(pConnectProps->szDriver, pval,
MAX_IDEN_LEN - 1);
pConnectProps->szDriver[MAX_IDEN_LEN - 1] = '\0';
}
// Read DSN-less connection info from amazon.redshiftodbc.ini
readCscOptionsForDsnlessConnection(pConnectProps);
} else if (_stricmp(pname, RS_LOGIN_TIMEOUT) == 0 ||
_stricmp(pname, "LT") == 0) {
sscanf(pval, "%d", &pConnAttr->iLoginTimeout);
} else if (_stricmp(pname, RS_APPLICATION_USING_THREADS) == 0 ||
_stricmp(pname, "AUT") == 0) {
sscanf(pval, "%d", &pConnectProps->iApplicationUsingThreads);
} else if (_stricmp(pname, RS_FETCH_REF_CURSOR) == 0 ||
_stricmp(pname, "FRC") == 0) {
sscanf(pval, "%d", &pConnectProps->iFetchRefCursor);
} else if (_stricmp(pname, RS_TRANSACTION_ERROR_BEHAVIOR) == 0 ||
_stricmp(pname, "TEB") == 0) {
sscanf(pval, "%d", &pConnectProps->iTransactionErrorBehavior);
} else if (_stricmp(pname, RS_CONNECTION_RETRY_COUNT) == 0 ||
_stricmp(pname, "CRC") == 0) {
sscanf(pval, "%d", &pConnectProps->iConnectionRetryCount);
} else if (_stricmp(pname, RS_CONNECTION_RETRY_DELAY) == 0 ||
_stricmp(pname, "CRD") == 0) {
sscanf(pval, "%d", &pConnectProps->iConnectionRetryDelay);
} else if (_stricmp(pname, RS_QUERY_TIMEOUT) == 0 ||
_stricmp(pname, "QT") == 0) {
sscanf(pval, "%d", &pConnectProps->iQueryTimeout);
} else if (_stricmp(pname, RS_CLIENT_PROTOCOL_VERSION) == 0) {
sscanf(pval, "%d", &pConnectProps->iClientProtocolVersion);
} else if (_stricmp(pname, RS_INITIALIZATION_STRING) == 0 ||
_stricmp(pname, "IS") == 0) {
if (pConnectProps->pInitializationString == NULL)
pConnectProps->pInitializationString = rs_strdup(pval, SQL_NTS);
} else if (_stricmp(pname, RS_TRACE) == 0) {
sscanf(pval, "%d", &pConnAttr->iTrace);
if (pConnAttr->iTrace == SQL_OPT_TRACE_ON)
pConnectProps->iTraceLevel = LOG_LEVEL_DEBUG;
else if (pConnAttr->iTrace == SQL_OPT_TRACE_OFF)
pConnectProps->iTraceLevel = LOG_LEVEL_OFF;
} else if (_stricmp(pname, RS_TRACE_FILE) == 0) {
pConnAttr->pTraceFile = (char *)rs_free(pConnAttr->pTraceFile);
pConnAttr->pTraceFile = rs_strdup(pval, SQL_NTS);
} else if (_stricmp(pname, RS_TRACE_LEVEL) == 0) {
sscanf(pval, "%d", &pConnectProps->iTraceLevel);
if (pConnectProps->iTraceLevel == LOG_LEVEL_DEBUG)
pConnAttr->iTrace = SQL_OPT_TRACE_ON;
else if (pConnectProps->iTraceLevel == LOG_LEVEL_OFF)
pConnAttr->iTrace = SQL_OPT_TRACE_OFF;
} else if (_stricmp(pname, RS_CSC_ENABLE) == 0) {
sscanf(pval, "%d", &pConnectProps->iCscEnable);
if ((pConnectProps->iCscEnable) && (pConnectProps->iCscEnable != 1))
pConnectProps->iCscEnable = 0;
} else if (_stricmp(pname, RS_CSC_MAX_FILE_SIZE) == 0) {
sscanf(pval, "%lld", &pConnectProps->llCscMaxFileSize);
} else if (_stricmp(pname, RS_CSC_PATH) == 0) {
if (pval) {
strncpy(pConnectProps->szCscPath, pval, MAX_PATH - 1);
pConnectProps->szCscPath[MAX_PATH - 1] = '\0';
}
} else if (_stricmp(pname, RS_CSC_THRESHOLD) == 0) {
sscanf(pval, "%lld", &pConnectProps->llCscThreshold);
} else if (_stricmp(pname, RS_ENCRYPTION_METHOD) == 0 ||
_stricmp(pname, "EM") == 0) {
sscanf(pval, "%d", &pConnectProps->iEncryptionMethod);
if (pConnectProps->iEncryptionMethod == 0)
rs_strncpy(pConnectProps->szSslMode, "disable",
sizeof(pConnectProps->szSslMode));
} else if (_stricmp(pname, RS_SSL_MODE) == 0) {
if (pval) strncpy(pConnectProps->szSslMode, pval, MAX_IDEN_LEN);
} else if (_stricmp(pname, RS_VALIDATE_SERVER_CERTIFICATE) == 0 ||
_stricmp(pname, "VSC") == 0) {
sscanf(pval, "%d", &pConnectProps->iValidateServerCertificate);
} else if (_stricmp(pname, RS_TRUST_STORE) == 0 ||
_stricmp(pname, "TS") == 0) {
if (pval) {
strncpy(pConnectProps->szTrustStore, pval, MAX_PATH - 1);
pConnectProps->szTrustStore[MAX_PATH - 1] = '\0';
}
} else if (_stricmp(pname, RS_KERBEROS_SERVICE_NAME) == 0 ||
_stricmp(pname, "KSN") == 0) {
if (pval) {
strncpy(pConnectProps->szKerberosServiceName, pval,
MAX_IDEN_LEN - 1);
pConnectProps->szKerberosServiceName[MAX_IDEN_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_STREAMING_CURSOR_ROWS) == 0 ||
_stricmp(pname, "SCR") == 0) {
sscanf(pval, "%d", &pConnectProps->iStreamingCursorRows);
if (pConnectProps->iStreamingCursorRows < 0)
pConnectProps->iStreamingCursorRows = 0;
} else if (_stricmp(pname, RS_DATABASE_METADATA_CURRENT_DB_ONLY) == 0) {
bool bVal = convertToBoolVal(pval);
pConnectProps->iDatabaseMetadataCurrentDbOnly = (bVal) ? 1 : 0;
} else if (_stricmp(pname, RS_READ_ONLY) == 0) {
bool bVal = convertToBoolVal(pval);
pConnectProps->iReadOnly = (bVal) ? 1 : 0;
} else if (_stricmp(pname, RS_KEEP_ALIVE) == 0) {
if (pval) {
strncpy(pConnectProps->szKeepAlive, pval, MAX_NUMBER_BUF_LEN - 1);
pConnectProps->szKeepAlive[MAX_NUMBER_BUF_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_APPLICATION_NAME) == 0) {
if (pval) {
rs_strncpy(pConnAttr->szApplicationName, pval,
sizeof(pConnAttr->szApplicationName));
}
} else if (_stricmp(pname, RS_COMPRESSION) == 0) {
if (pval) {
rs_strncpy(pConnAttr->szCompression, pval,
sizeof(pConnAttr->szCompression));
if (getGlobalLogVars()->isInitialized) {
RS_LOG_INFO("RSCNN", "Compression is set to: %s", pConnAttr->szCompression);
}
}
} else if (_stricmp(pname, RS_KEEP_ALIVE_IDLE) == 0) {
if (pval) {
strncpy(pConnectProps->szKeepAliveIdle, pval, MAX_NUMBER_BUF_LEN - 1);
pConnectProps->szKeepAliveIdle[MAX_NUMBER_BUF_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_KEEP_ALIVE_COUNT) == 0) {
if (pval) {
strncpy(pConnectProps->szKeepAliveCount, pval,
MAX_NUMBER_BUF_LEN - 1);
pConnectProps->szKeepAliveCount[MAX_NUMBER_BUF_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_KEEP_ALIVE_INTERVAL) == 0) {
if (pval) {
strncpy(pConnectProps->szKeepAliveInterval, pval,
MAX_NUMBER_BUF_LEN - 1);
pConnectProps->szKeepAliveInterval[MAX_NUMBER_BUF_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_MIN_TLS) == 0) {
if (pval) {
strncpy(pConnectProps->szMinTLS, pval, MAX_NUMBER_BUF_LEN - 1);
pConnectProps->szMinTLS[MAX_NUMBER_BUF_LEN - 1] = '\0';
}
} else if (_stricmp(pname, RS_IAM) == 0) {
pConnectProps->isIAMAuth = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_HTTPS_PROXY_HOST) == 0) {
rs_strncpy(pHttpsProps->szHttpsHost, pval,
sizeof(pHttpsProps->szHttpsHost));
} else if (_stricmp(pname, RS_HTTPS_PROXY_PORT) == 0) {
sscanf(pval, "%d", &(pHttpsProps->iHttpsPort));
} else if (_stricmp(pname, RS_HTTPS_PROXY_USER_NAME) == 0) {
rs_strncpy(pHttpsProps->szHttpsUser, pval,
sizeof(pHttpsProps->szHttpsUser));
} else if (_stricmp(pname, RS_HTTPS_PROXY_PASSWORD) == 0) {
rs_strncpy(pHttpsProps->szHttpsPassword, pval,
sizeof(pHttpsProps->szHttpsPassword));
} else if (_stricmp(pname, RS_IDP_USE_HTTPS_PROXY) == 0) {
pHttpsProps->isUseProxyForIdp = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_AUTH_TYPE) == 0) {
rs_strncpy(pIamProps->szAuthType, pval,
sizeof(pIamProps->szAuthType));
} else if (_stricmp(pname, RS_CLUSTER_ID) == 0) {
rs_strncpy(pIamProps->szClusterId, pval,
sizeof(pIamProps->szClusterId));
} else if (_stricmp(pname, RS_REGION) == 0) {
rs_strncpy(pIamProps->szRegion, pval, sizeof(pIamProps->szRegion));
} else if (_stricmp(pname, RS_END_POINT_URL) == 0) {
rs_strncpy(pIamProps->szEndpointUrl, pval,
sizeof(pIamProps->szEndpointUrl));
} else if (_stricmp(pname, RS_IAM_STS_ENDPOINT_URL) == 0) {
rs_strncpy(pIamProps->szStsEndpointUrl, pval,
sizeof(pIamProps->szStsEndpointUrl));
} else if (_stricmp(pname, RS_VPC_ENDPOINT_URL) == 0) {
rs_strncpy(pIamProps->szManagedVpcUrl, pval,
sizeof(pIamProps->szManagedVpcUrl));
} else if (_stricmp(pname, RS_DB_USER) == 0) {
rs_strncpy(pIamProps->szDbUser, pval, sizeof(pIamProps->szDbUser));
} else if (_stricmp(pname, RS_DB_GROUPS) == 0) {
rs_strncpy(pIamProps->szDbGroups, pval,
sizeof(pIamProps->szDbGroups));
} else if (_stricmp(pname, RS_DB_GROUPS_FILTER) == 0) {
rs_strncpy(pIamProps->szDbGroupsFilter, pval,
sizeof(pIamProps->szDbGroupsFilter));
} else if (_stricmp(pname, RS_AUTO_CREATE) == 0) {
pIamProps->isAutoCreate = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_SERVERLESS) == 0) {
pIamProps->isServerless = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_WORKGROUP) == 0) {
rs_strncpy(pIamProps->szWorkGroup, pval,
sizeof(pIamProps->szWorkGroup));
} else if (_stricmp(pname, RS_FORCE_LOWER_CASE) == 0) {
pIamProps->isForceLowercase = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_IDP_RESPONSE_TIMEOUT) == 0) {
sscanf(pval, "%ld", &(pIamProps->lIdpResponseTimeout));
} else if (_stricmp(pname, RS_IAM_DURATION) == 0) {
sscanf(pval, "%ld", &(pIamProps->lIAMDuration));
} else if (_stricmp(pname, RS_ACCESS_KEY_ID) == 0) {
rs_strncpy(pIamProps->szAccessKeyID, pval,
sizeof(pIamProps->szAccessKeyID));
} else if (_stricmp(pname, RS_SECRET_ACCESS_KEY) == 0) {
rs_strncpy(pIamProps->szSecretAccessKey, pval,
sizeof(pIamProps->szSecretAccessKey));
} else if (_stricmp(pname, RS_SESSION_TOKEN) == 0) {
rs_strncpy(pIamProps->szSessionToken, pval,
sizeof(pIamProps->szSessionToken));
} else if (_stricmp(pname, RS_PROFILE) == 0) {
rs_strncpy(pIamProps->szProfile, pval, sizeof(pIamProps->szProfile));
} else if (_stricmp(pname, RS_INSTANCE_PROFILE) == 0) {
pIamProps->isInstanceProfile = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_PLUGIN_NAME) == 0) {
rs_strncpy(pIamProps->szPluginName, pval,
sizeof(pIamProps->szPluginName));
} else if (_stricmp(pname, RS_PREFERRED_ROLE) == 0) {
rs_strncpy(pIamProps->szPreferredRole, pval,
sizeof(pIamProps->szPreferredRole));
} else if (_stricmp(pname, RS_IDP_HOST) == 0) {
rs_strncpy(pIamProps->szIdpHost, pval, sizeof(pIamProps->szIdpHost));
} else if (_stricmp(pname, RS_LOGIN_TO_RP) == 0) {
rs_strncpy(pIamProps->szLoginToRp, pval,
sizeof(pIamProps->szLoginToRp));
} else if (_stricmp(pname, RS_IDP_TENANT) == 0) {
rs_strncpy(pIamProps->szIdpTenant, pval,
sizeof(pIamProps->szIdpTenant));
} else if (_stricmp(pname, RS_CLIENT_ID) == 0) {
rs_strncpy(pIamProps->szClientId, pval,
sizeof(pIamProps->szClientId));
} else if (_stricmp(pname, RS_SCOPE) == 0) {
rs_strncpy(pIamProps->szScope, pval, sizeof(pIamProps->szScope));
} else if (_stricmp(pname, RS_CLIENT_SECRET) == 0) {
rs_strncpy(pIamProps->szClientSecret, pval,
sizeof(pIamProps->szClientSecret));
} else if (_stricmp(pname, RS_LOGIN_URL) == 0) {
rs_strncpy(pIamProps->szLoginUrl, pval,
sizeof(pIamProps->szLoginUrl));
} else if (_stricmp(pname, RS_PARTNER_SPID) == 0) {
rs_strncpy(pIamProps->szPartnerSpid, pval,
sizeof(pIamProps->szPartnerSpid));
} else if (_stricmp(pname, RS_APP_ID) == 0) {
rs_strncpy(pIamProps->szAppId, pval, sizeof(pIamProps->szAppId));
} else if (_stricmp(pname, RS_APP_NAME) == 0) {
rs_strncpy(pIamProps->szAppName, pval, sizeof(pIamProps->szAppName));
} else if (_stricmp(pname, RS_WEB_IDENTITY_TOKEN) == 0) {
int len = strlen(pval) + 1;
pIamProps->pszJwt = (char *)rs_calloc(sizeof(char), len);
rs_strncpy(pIamProps->pszJwt, pval, len);
} else if (_stricmp(pname, RS_NATIVE_KEY_PROVIDER_NAME) == 0) {
rs_strncpy(pConnectProps->szProviderName, pval, MAX_IDEN_LEN);
} else if (_stricmp(pname, RS_ROLE_ARN) == 0) {
rs_strncpy(pIamProps->szRoleArn, pval, sizeof(pIamProps->szRoleArn));
} else if (_stricmp(pname, RS_ROLE_SESSION_NAME) == 0) {
rs_strncpy(pIamProps->szRoleSessionName, pval,
sizeof(pIamProps->szRoleSessionName));
} else if (_stricmp(pname, RS_SSL_INSECURE) == 0) {
pIamProps->isSslInsecure = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_GROUP_FEDERATION) == 0) {
pIamProps->isGroupFederation = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_DISABLE_CACHE) == 0) {
pIamProps->isDisableCache = convertToBoolVal(pval);
} else if (_stricmp(pname, RS_IDP_PORT) == 0) {
sscanf(pval, "%d", &(pIamProps->iIdpPort));
} else if (_stricmp(pname, RS_LISTEN_PORT) == 0) {
sscanf(pval, "%ld", &(pIamProps->lListenPort));
} else if (_stricmp(pname, RS_DURATION) == 0) {
sscanf(pval, "%ld", &(pIamProps->lDuration));
} else if (_stricmp(pname, RS_TCP_PROXY_HOST) == 0) {
rs_strncpy(pTcpProxyProps->szHost, pval,
sizeof(pTcpProxyProps->szHost));
} else if (_stricmp(pname, RS_TCP_PROXY_PORT) == 0) {
rs_strncpy(pTcpProxyProps->szPort, pval,
sizeof(pTcpProxyProps->szPort));
} else if (_stricmp(pname, RS_TCP_PROXY_USER_NAME) == 0) {
rs_strncpy(pTcpProxyProps->szUser, pval,
sizeof(pTcpProxyProps->szUser));
} else if (_stricmp(pname, RS_TCP_PROXY_PASSWORD) == 0) {
rs_strncpy(pTcpProxyProps->szPassword, pval,
sizeof(pTcpProxyProps->szPassword));
} else if (_stricmp(pname, RS_IAM_AUTH_PROFILE) == 0) {
rs_strncpy(pIamProps->szAuthProfile, pval,
sizeof(pIamProps->szAuthProfile));
} else if (_stricmp(pname, RS_IAM_STS_CONNECTION_TIMEOUT) == 0) {
sscanf(pval, "%d", &(pIamProps->iStsConnectionTimeout));
} else if (_stricmp(pname, RS_BASIC_AUTH_TOKEN) == 0) {
rs_strncpy(pIamProps->szBasicAuthToken, pval,
sizeof(pIamProps->szBasicAuthToken));
} else if (_stricmp(pname, RS_TOKEN_TYPE) == 0) {
rs_strncpy(pIamProps->szTokenType, pval,
sizeof(pIamProps->szTokenType));
} else if (_stricmp(pname, RS_IDENTITY_NAMESPACE) == 0) {
rs_strncpy(pIamProps->szIdentityNamespace, pval,
sizeof(pIamProps->szIdentityNamespace));
} else if (_stricmp(pname, RS_ISSUER_URL) == 0){
rs_strncpy(pIamProps->szIssuerUrl, pval,
sizeof(pIamProps->szIssuerUrl));
} else if (_stricmp(pname, RS_IDC_REGION) == 0){
rs_strncpy(pIamProps->szIdcRegion, pval,
sizeof(pIamProps->szIdcRegion));
} else if (_stricmp(pname, RS_IDC_CLIENT_DISPLAY_NAME) == 0) {
rs_strncpy(pIamProps->szIdcClientDisplayName, pval,
sizeof(pIamProps->szIdcClientDisplayName));
} else if (_stricmp(pname, RS_IAM_CA_FILE) == 0) {
if (pval) {
strncpy(pIamProps->szCaFile, pval,
sizeof(pIamProps->szCaFile));
strncpy(pConnectProps->szCaFile, pval,
sizeof(pConnectProps->szCaFile));
}
} else if (_stricmp(pname, RS_IAM_CA_PATH) == 0) {
if (pval) {
strncpy(pIamProps->szCaPath, pval,
sizeof(pIamProps->szCaPath));
strncpy(pConnectProps->szCaPath, pval,
sizeof(pConnectProps->szCaPath));
}
} else if (_stricmp(pname, RS_STRING_TYPE) == 0) {
if (pval)
strncpy(pConnectProps->szStringType, pval,
sizeof(pConnectProps->szStringType));
} else if (_stricmp(pname, RS_LOG_LEVEL_OPTION_NAME) == 0) {
if (pval) {
sscanf(pval, "%d", &pConnectProps->iLogLevel);
}
} else if (_stricmp(pname, RS_LOG_PATH_OPTION_NAME) == 0) {
if (pval) {
strncpy(pConnectProps->szLogPath, pval,
sizeof(pConnectProps->szLogPath));
}
}
#ifdef WIN32
else if (_stricmp(pname, RS_KERBEROS_API) == 0 ||
_stricmp(pname, "KSA") == 0) {
if (pval) {
strncpy(pConnectProps->szKerberosAPI, pval, MAX_IDEN_LEN - 1);
pConnectProps->szKerberosAPI[MAX_IDEN_LEN - 1] = '\0';
}
}
#endif
else {
if (append) {
// Add into connect string pointer
pConn->appendConnectAttribueStr(pname, pval);
}
}
}
}; // end of processKeyVal function
std::string connStr = cbConnStrIn == SQL_NTS
? std::string(szConnStrIn)
: std::string(szConnStrIn, cbConnStrIn);
auto connectionSettingsMap = parseConnectionString(connStr);
for (auto &kv : connectionSettingsMap) {
processKeyVal(kv.first.c_str(), kv.second.c_str());
}
return valid;
}