in sql-odbc/src/sqlodbc/environ.c [198:322]
RETCODE SQL_API OPENSEARCHAPI_ConnectError(HDBC hdbc, SQLSMALLINT RecNumber,
SQLCHAR *szSqlState,
SQLINTEGER *pfNativeError,
SQLCHAR *szErrorMsg,
SQLSMALLINT cbErrorMsgMax,
SQLSMALLINT *pcbErrorMsg, UWORD flag) {
UNUSED(flag);
ConnectionClass *conn = (ConnectionClass *)hdbc;
EnvironmentClass *env = (EnvironmentClass *)conn->henv;
char *msg;
int status;
BOOL once_again = FALSE;
ssize_t msglen;
MYLOG(OPENSEARCH_ERROR, "entering hdbc=%p <%d>\n", hdbc, cbErrorMsgMax);
if (RecNumber != 1 && RecNumber != -1)
return SQL_NO_DATA_FOUND;
if (cbErrorMsgMax < 0)
return SQL_ERROR;
if (CONN_EXECUTING == conn->status || !CC_get_error(conn, &status, &msg)
|| NULL == msg) {
MYLOG(OPENSEARCH_ERROR, "CC_Get_error returned nothing.\n");
if (NULL != szSqlState)
strncpy_null((char *)szSqlState, "00000", SIZEOF_SQLSTATE);
if (NULL != pcbErrorMsg)
*pcbErrorMsg = 0;
if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0))
szErrorMsg[0] = '\0';
return SQL_NO_DATA_FOUND;
}
MYLOG(OPENSEARCH_ERROR, "CC_get_error: status = %d, msg = #%s#\n", status, msg);
msglen = strlen(msg);
if (NULL != pcbErrorMsg) {
*pcbErrorMsg = (SQLSMALLINT)msglen;
if (cbErrorMsgMax == 0)
once_again = TRUE;
else if (msglen >= cbErrorMsgMax)
*pcbErrorMsg = cbErrorMsgMax - 1;
}
if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0))
strncpy_null((char *)szErrorMsg, msg, cbErrorMsgMax);
if (NULL != pfNativeError)
*pfNativeError = status;
if (NULL != szSqlState) {
if (conn->sqlstate[0])
strncpy_null((char *)szSqlState, conn->sqlstate, SIZEOF_SQLSTATE);
else
switch (status) {
case CONN_OPTION_VALUE_CHANGED:
opensearch_sqlstate_set(env, szSqlState, "01S02", "01S02");
break;
case CONN_TRUNCATED:
opensearch_sqlstate_set(env, szSqlState, "01004", "01004");
/* data truncated */
break;
case CONN_INIREAD_ERROR:
opensearch_sqlstate_set(env, szSqlState, "IM002", "IM002");
/* data source not found */
break;
case CONNECTION_SERVER_NOT_REACHED:
case CONN_OPENDB_ERROR:
opensearch_sqlstate_set(env, szSqlState, "08001", "08001");
/* unable to connect to data source */
break;
case CONN_INVALID_AUTHENTICATION:
case CONN_AUTH_TYPE_UNSUPPORTED:
opensearch_sqlstate_set(env, szSqlState, "28000", "28000");
break;
case CONN_STMT_ALLOC_ERROR:
opensearch_sqlstate_set(env, szSqlState, "HY001", "S1001");
/* memory allocation failure */
break;
case CONN_IN_USE:
opensearch_sqlstate_set(env, szSqlState, "HY000", "S1000");
/* general error */
break;
case CONN_UNSUPPORTED_OPTION:
opensearch_sqlstate_set(env, szSqlState, "HYC00", "IM001");
/* driver does not support this function */
break;
case CONN_INVALID_ARGUMENT_NO:
opensearch_sqlstate_set(env, szSqlState, "HY009", "S1009");
/* invalid argument value */
break;
case CONN_TRANSACT_IN_PROGRES:
opensearch_sqlstate_set(env, szSqlState, "HY011", "S1011");
break;
case CONN_NO_MEMORY_ERROR:
opensearch_sqlstate_set(env, szSqlState, "HY001", "S1001");
break;
case CONN_NOT_IMPLEMENTED_ERROR:
opensearch_sqlstate_set(env, szSqlState, "HYC00", "S1C00");
break;
case CONN_ILLEGAL_TRANSACT_STATE:
opensearch_sqlstate_set(env, szSqlState, "25000", "S1010");
break;
case CONN_VALUE_OUT_OF_RANGE:
opensearch_sqlstate_set(env, szSqlState, "HY019", "22003");
break;
case CONNECTION_COULD_NOT_SEND:
case CONNECTION_COULD_NOT_RECEIVE:
case CONNECTION_COMMUNICATION_ERROR:
case CONNECTION_NO_RESPONSE:
opensearch_sqlstate_set(env, szSqlState, "08S01", "08S01");
break;
default:
opensearch_sqlstate_set(env, szSqlState, "HY000", "S1000");
/* general error */
break;
}
}
MYLOG(OPENSEARCH_DEBUG,
" szSqlState = '%s',len=" FORMAT_SSIZE_T ", szError='%s'\n",
szSqlState ? (char *)szSqlState : PRINT_NULL, msglen,
szErrorMsg ? (char *)szErrorMsg : PRINT_NULL);
if (once_again) {
CC_set_errornumber(conn, status);
return SQL_SUCCESS_WITH_INFO;
} else
return SQL_SUCCESS;
}