static RETCODE SQL_API IRDGetField()

in sql-odbc/src/sqlodbc/opensearch_api30.c [1187:1297]


static RETCODE SQL_API IRDGetField(DescriptorClass *desc, SQLSMALLINT RecNumber,
                                   SQLSMALLINT FieldIdentifier, PTR Value,
                                   SQLINTEGER BufferLength,
                                   SQLINTEGER *StringLength) {
    RETCODE ret = SQL_SUCCESS;
    SQLLEN ival = 0;
    SQLINTEGER len = 0, rettype = 0;
    PTR ptr = NULL;
    BOOL bCallColAtt = FALSE;
    const IRDFields *opts = &(desc->irdf);

    switch (FieldIdentifier) {
        case SQL_DESC_ROWVER: /* read-only */
            // Database is read-only, and does not support transactions
            rettype = SQL_IS_SMALLINT;
            ival = SQL_FALSE;
            break;
        case SQL_DESC_ARRAY_STATUS_PTR:
            rettype = SQL_IS_POINTER;
            ptr = opts->rowStatusArray;
            break;
        case SQL_DESC_ROWS_PROCESSED_PTR:
            rettype = SQL_IS_POINTER;
            ptr = opts->rowsFetched;
            break;
        case SQL_DESC_ALLOC_TYPE: /* read-only */
            rettype = SQL_IS_SMALLINT;
            ival = SQL_DESC_ALLOC_AUTO;
            break;
        case SQL_DESC_AUTO_UNIQUE_VALUE:           /* read-only */
        case SQL_DESC_CASE_SENSITIVE:              /* read-only */
        case SQL_DESC_DATETIME_INTERVAL_PRECISION: /* read-only */
        case SQL_DESC_NUM_PREC_RADIX:              /* read-only */
            rettype = SQL_IS_INTEGER;
            bCallColAtt = TRUE;
            break;
        case SQL_DESC_DISPLAY_SIZE:                /* read-only */
        case SQL_DESC_LENGTH:                      /* read-only */
        case SQL_DESC_OCTET_LENGTH:                /* read-only */
            rettype = SQL_IS_LEN;
            bCallColAtt = TRUE;
            break;
        case SQL_DESC_NULLABLE:                    /* read-only */
        case SQL_DESC_FIXED_PREC_SCALE:            /* read-only */
        case SQL_DESC_DATETIME_INTERVAL_CODE:      /* read-only */
        case SQL_DESC_CONCISE_TYPE:                /* read-only */
        case SQL_DESC_COUNT:                       /* read-only */
        case SQL_DESC_PRECISION:                   /* read-only */
        case SQL_DESC_SCALE:                       /* read-only */
        case SQL_DESC_SEARCHABLE:                  /* read-only */
        case SQL_DESC_TYPE:                        /* read-only */
        case SQL_DESC_UNNAMED:                     /* read-only */
        case SQL_DESC_UNSIGNED:                    /* read-only */
        case SQL_DESC_UPDATABLE:                   /* read-only */
            rettype = SQL_IS_SMALLINT;
            bCallColAtt = TRUE;
            break;
        case SQL_DESC_BASE_COLUMN_NAME: /* read-only */
        case SQL_DESC_BASE_TABLE_NAME:  /* read-only */
        case SQL_DESC_CATALOG_NAME:     /* read-only */
        case SQL_DESC_LABEL:            /* read-only */
        case SQL_DESC_LITERAL_PREFIX:   /* read-only */
        case SQL_DESC_LITERAL_SUFFIX:   /* read-only */
        case SQL_DESC_LOCAL_TYPE_NAME:  /* read-only */
        case SQL_DESC_NAME:             /* read-only */
        case SQL_DESC_SCHEMA_NAME:      /* read-only */
        case SQL_DESC_TABLE_NAME:       /* read-only */
        case SQL_DESC_TYPE_NAME:        /* read-only */
            rettype = SQL_NTS;
            bCallColAtt = TRUE;
            break;
        default:
            ret = SQL_ERROR;
            DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,
                         "invalid descriptor identifier");
    }
    if (bCallColAtt) {
        SQLSMALLINT pcbL;
        StatementClass *stmt;

        stmt = opts->stmt;
        ret = OPENSEARCHAPI_ColAttributes(stmt, RecNumber, FieldIdentifier, Value,
                                  (SQLSMALLINT)BufferLength, &pcbL, &ival);
        len = pcbL;
    }
    switch (rettype) {
        case 0:
        case SQL_IS_INTEGER:
            len = sizeof(SQLINTEGER);
            *((SQLINTEGER *)Value) = (SQLINTEGER)ival;
            break;
        case SQL_IS_UINTEGER:
            len = sizeof(SQLUINTEGER);
            *((SQLUINTEGER *)Value) = (SQLUINTEGER)ival;
            break;
        case SQL_IS_SMALLINT:
            len = sizeof(SQLSMALLINT);
            *((SQLSMALLINT *)Value) = (SQLSMALLINT)ival;
            break;
        case SQL_IS_POINTER:
            len = sizeof(SQLPOINTER);
            *((void **)Value) = ptr;
            break;
        case SQL_NTS:
            break;
    }

    if (StringLength)
        *StringLength = len;
    return ret;
}