RETCODE SQL_API OPENSEARCHAPI_GetDiagField()

in sql-odbc/src/sqlodbc/opensearch_api30.c [52:340]


RETCODE SQL_API OPENSEARCHAPI_GetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle,
                                   SQLSMALLINT RecNumber,
                                   SQLSMALLINT DiagIdentifier, PTR DiagInfoPtr,
                                   SQLSMALLINT BufferLength,
                                   SQLSMALLINT *StringLengthPtr) {
    RETCODE ret = SQL_ERROR, rtn;
    ConnectionClass *conn;
    StatementClass *stmt;
    SQLLEN rc;
    SQLSMALLINT pcbErrm;
    ssize_t rtnlen = -1;
    int rtnctype = SQL_C_CHAR;

    MYLOG(OPENSEARCH_TRACE, "entering rec=%d\n", RecNumber);
    switch (HandleType) {
        case SQL_HANDLE_ENV:
            switch (DiagIdentifier) {
                case SQL_DIAG_CLASS_ORIGIN:
                case SQL_DIAG_SUBCLASS_ORIGIN:
                case SQL_DIAG_CONNECTION_NAME:
                case SQL_DIAG_SERVER_NAME:
                    rtnlen = 0;
                    if (DiagInfoPtr && BufferLength > rtnlen) {
                        ret = SQL_SUCCESS;
                        *((char *)DiagInfoPtr) = '\0';
                    } else
                        ret = SQL_SUCCESS_WITH_INFO;
                    break;
                case SQL_DIAG_MESSAGE_TEXT:
                    ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, NULL, NULL,
                                         DiagInfoPtr, BufferLength,
                                         StringLengthPtr, 0);
                    break;
                case SQL_DIAG_NATIVE:
                    rtnctype = SQL_C_LONG;
                    ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, NULL,
                                         (SQLINTEGER *)DiagInfoPtr, NULL, 0,
                                         NULL, 0);
                    break;
                case SQL_DIAG_NUMBER:
                    rtnctype = SQL_C_LONG;
                    ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, NULL, NULL, NULL, 0,
                                         NULL, 0);
                    if (SQL_SUCCEEDED(ret)) {
                        *((SQLINTEGER *)DiagInfoPtr) = 1;
                    }
                    break;
                case SQL_DIAG_SQLSTATE:
                    rtnlen = 5;
                    ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, DiagInfoPtr, NULL,
                                         NULL, 0, NULL, 0);
                    if (SQL_SUCCESS_WITH_INFO == ret)
                        ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_RETURNCODE: /* driver manager returns */
                    break;
                case SQL_DIAG_CURSOR_ROW_COUNT:
                case SQL_DIAG_ROW_COUNT:
                case SQL_DIAG_DYNAMIC_FUNCTION:
                case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
                    /* options for statement type only */
                    break;
            }
            break;
        case SQL_HANDLE_DBC:
            conn = (ConnectionClass *)Handle;
            switch (DiagIdentifier) {
                case SQL_DIAG_CLASS_ORIGIN:
                case SQL_DIAG_SUBCLASS_ORIGIN:
                case SQL_DIAG_CONNECTION_NAME:
                    rtnlen = 0;
                    if (DiagInfoPtr && BufferLength > rtnlen) {
                        ret = SQL_SUCCESS;
                        *((char *)DiagInfoPtr) = '\0';
                    } else
                        ret = SQL_SUCCESS_WITH_INFO;
                    break;
                case SQL_DIAG_SERVER_NAME:
                    rtnlen = strlen(CC_get_DSN(conn));
                    if (DiagInfoPtr) {
                        strncpy_null(DiagInfoPtr, CC_get_DSN(conn),
                                     BufferLength);
                        ret = (BufferLength > rtnlen ? SQL_SUCCESS
                                                     : SQL_SUCCESS_WITH_INFO);
                    } else
                        ret = SQL_SUCCESS_WITH_INFO;
                    break;
                case SQL_DIAG_MESSAGE_TEXT:
                    ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, NULL, NULL,
                                             DiagInfoPtr, BufferLength,
                                             StringLengthPtr, 0);
                    break;
                case SQL_DIAG_NATIVE:
                    rtnctype = SQL_C_LONG;
                    ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, NULL,
                                             (SQLINTEGER *)DiagInfoPtr, NULL, 0,
                                             NULL, 0);
                    break;
                case SQL_DIAG_NUMBER:
                    rtnctype = SQL_C_LONG;
                    ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, NULL, NULL,
                                             NULL, 0, NULL, 0);
                    if (SQL_SUCCEEDED(ret)) {
                        *((SQLINTEGER *)DiagInfoPtr) = 1;
                    }
                    break;
                case SQL_DIAG_SQLSTATE:
                    rtnlen = 5;
                    ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, DiagInfoPtr,
                                             NULL, NULL, 0, NULL, 0);
                    if (SQL_SUCCESS_WITH_INFO == ret)
                        ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_RETURNCODE: /* driver manager returns */
                    break;
                case SQL_DIAG_CURSOR_ROW_COUNT:
                case SQL_DIAG_ROW_COUNT:
                case SQL_DIAG_DYNAMIC_FUNCTION:
                case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
                    /* options for statement type only */
                    break;
            }
            break;
        case SQL_HANDLE_STMT:
            conn = (ConnectionClass *)SC_get_conn(((StatementClass *)Handle));
            switch (DiagIdentifier) {
                case SQL_DIAG_CLASS_ORIGIN:
                case SQL_DIAG_SUBCLASS_ORIGIN:
                case SQL_DIAG_CONNECTION_NAME:
                    rtnlen = 0;
                    if (DiagInfoPtr && BufferLength > rtnlen) {
                        ret = SQL_SUCCESS;
                        *((char *)DiagInfoPtr) = '\0';
                    } else
                        ret = SQL_SUCCESS_WITH_INFO;
                    break;
                case SQL_DIAG_SERVER_NAME:
                    rtnlen = strlen(CC_get_DSN(conn));
                    if (DiagInfoPtr) {
                        strncpy_null(DiagInfoPtr, CC_get_DSN(conn),
                                     BufferLength);
                        ret = (BufferLength > rtnlen ? SQL_SUCCESS
                                                     : SQL_SUCCESS_WITH_INFO);
                    } else
                        ret = SQL_SUCCESS_WITH_INFO;
                    break;
                case SQL_DIAG_MESSAGE_TEXT:
                    ret = OPENSEARCHAPI_StmtError(Handle, RecNumber, NULL, NULL,
                                          DiagInfoPtr, BufferLength,
                                          StringLengthPtr, 0);
                    break;
                case SQL_DIAG_NATIVE:
                    rtnctype = SQL_C_LONG;
                    ret = OPENSEARCHAPI_StmtError(Handle, RecNumber, NULL,
                                          (SQLINTEGER *)DiagInfoPtr, NULL, 0,
                                          NULL, 0);
                    break;
                case SQL_DIAG_NUMBER:
                    rtnctype = SQL_C_LONG;
                    *((SQLINTEGER *)DiagInfoPtr) = 0;
                    ret = SQL_NO_DATA_FOUND;
                    stmt = (StatementClass *)Handle;
                    rtn = OPENSEARCHAPI_StmtError(Handle, -1, NULL, NULL, NULL, 0,
                                          &pcbErrm, 0);
                    switch (rtn) {
                        case SQL_SUCCESS:
                        case SQL_SUCCESS_WITH_INFO:
                            ret = SQL_SUCCESS;
                            if (pcbErrm > 0 && stmt->opensearch_error)

                                *((SQLINTEGER *)DiagInfoPtr) =
                                    (pcbErrm - 1) / stmt->opensearch_error->recsize + 1;
                            break;
                        default:
                            break;
                    }
                    break;
                case SQL_DIAG_SQLSTATE:
                    rtnlen = 5;
                    ret = OPENSEARCHAPI_StmtError(Handle, RecNumber, DiagInfoPtr, NULL,
                                          NULL, 0, NULL, 0);
                    if (SQL_SUCCESS_WITH_INFO == ret)
                        ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_CURSOR_ROW_COUNT:
                    rtnctype = SQL_C_LONG;
                    stmt = (StatementClass *)Handle;
                    rc = -1;
                    if (stmt->status == STMT_FINISHED) {
                        QResultClass *res = SC_get_Curres(stmt);

                        /*if (!res)
                            return SQL_ERROR;*/
                        if (stmt->proc_return > 0)
                            rc = 0;
                        else if (res && QR_NumResultCols(res) > 0
                                 && !SC_is_fetchcursor(stmt))
                            rc = QR_get_num_total_tuples(res) - res->dl_count;
                    }
                    *((SQLLEN *)DiagInfoPtr) = rc;
                    MYLOG(OPENSEARCH_ALL, "rc=" FORMAT_LEN "\n", rc);
                    ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_ROW_COUNT:
                    rtnctype = SQL_C_LONG;
                    stmt = (StatementClass *)Handle;
                    *((SQLLEN *)DiagInfoPtr) = stmt->diag_row_count;
                    ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_ROW_NUMBER:
                    rtnctype = SQL_C_LONG;
                    *((SQLLEN *)DiagInfoPtr) = SQL_ROW_NUMBER_UNKNOWN;
                    ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_COLUMN_NUMBER:
                    rtnctype = SQL_C_LONG;
                    *((SQLINTEGER *)DiagInfoPtr) = SQL_COLUMN_NUMBER_UNKNOWN;
                    ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_RETURNCODE: /* driver manager returns */
                    break;
            }
            break;
        case SQL_HANDLE_DESC:
            conn = DC_get_conn(((DescriptorClass *)Handle));
            switch (DiagIdentifier) {
                case SQL_DIAG_CLASS_ORIGIN:
                case SQL_DIAG_SUBCLASS_ORIGIN:
                case SQL_DIAG_CONNECTION_NAME:
                    rtnlen = 0;
                    if (DiagInfoPtr && BufferLength > rtnlen) {
                        ret = SQL_SUCCESS;
                        *((char *)DiagInfoPtr) = '\0';
                    } else
                        ret = SQL_SUCCESS_WITH_INFO;
                    break;
                case SQL_DIAG_SERVER_NAME:
                    rtnlen = strlen(CC_get_DSN(conn));
                    if (DiagInfoPtr) {
                        strncpy_null(DiagInfoPtr, CC_get_DSN(conn),
                                     BufferLength);
                        ret = (BufferLength > rtnlen ? SQL_SUCCESS
                                                     : SQL_SUCCESS_WITH_INFO);
                    } else
                        ret = SQL_SUCCESS_WITH_INFO;
                    break;
                case SQL_DIAG_MESSAGE_TEXT:
                case SQL_DIAG_NATIVE:
                case SQL_DIAG_NUMBER:
                    break;
                case SQL_DIAG_SQLSTATE:
                    rtnlen = 5;
                    ret = OPENSEARCHAPI_DescError(Handle, RecNumber, DiagInfoPtr, NULL,
                                          NULL, 0, NULL, 0);
                    if (SQL_SUCCESS_WITH_INFO == ret)
                        ret = SQL_SUCCESS;
                    break;
                case SQL_DIAG_RETURNCODE: /* driver manager returns */
                    break;
                case SQL_DIAG_CURSOR_ROW_COUNT:
                case SQL_DIAG_ROW_COUNT:
                case SQL_DIAG_DYNAMIC_FUNCTION:
                case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
                    rtnctype = SQL_C_LONG;
                    /* options for statement type only */
                    break;
            }
            break;
        default:
            ret = SQL_ERROR;
    }
    if (SQL_C_LONG == rtnctype) {
        if (SQL_SUCCESS_WITH_INFO == ret)
            ret = SQL_SUCCESS;
        if (StringLengthPtr)
            *StringLengthPtr = sizeof(SQLINTEGER);
    } else if (rtnlen >= 0) {
        if (rtnlen >= BufferLength) {
            if (SQL_SUCCESS == ret)
                ret = SQL_SUCCESS_WITH_INFO;
            if (BufferLength > 0)
                ((char *)DiagInfoPtr)[BufferLength - 1] = '\0';
        }
        if (StringLengthPtr)
            *StringLengthPtr = (SQLSMALLINT)rtnlen;
    }
    MYLOG(OPENSEARCH_TRACE, "leaving %d\n", ret);
    return ret;
}