RETCODE SQL_API OPENSEARCHAPI_ConnectError()

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