static RETCODE SQL_API IPDGetField()

in sql-odbc/src/sqlodbc/opensearch_api30.c [1299:1439]


static RETCODE SQL_API IPDGetField(DescriptorClass *desc, SQLSMALLINT RecNumber,
                                   SQLSMALLINT FieldIdentifier, PTR Value,
                                   SQLINTEGER BufferLength,
                                   SQLINTEGER *StringLength) {
    UNUSED(BufferLength);
    RETCODE ret = SQL_SUCCESS;
    SQLINTEGER ival = 0, len = 0, rettype = 0;
    PTR ptr = NULL;
    const IPDFields *ipdopts = (const IPDFields *)&(desc->ipdf);
    SQLSMALLINT para_idx;

    switch (FieldIdentifier) {
        case SQL_DESC_ARRAY_STATUS_PTR:
        case SQL_DESC_ROWS_PROCESSED_PTR:
        case SQL_DESC_COUNT:
            break;
        default:
            if (RecNumber <= 0 || RecNumber > ipdopts->allocated) {
                MYLOG(OPENSEARCH_ALL, "RecN=%d allocated=%d\n", RecNumber,
                      ipdopts->allocated);
                DC_set_error(desc, DESC_BAD_PARAMETER_NUMBER_ERROR,
                             "bad parameter number");
                return SQL_ERROR;
            }
    }
    para_idx = RecNumber - 1;
    switch (FieldIdentifier) {
        case SQL_DESC_ARRAY_STATUS_PTR:
            rettype = SQL_IS_POINTER;
            ptr = ipdopts->param_status_ptr;
            break;
        case SQL_DESC_ROWS_PROCESSED_PTR:
            rettype = SQL_IS_POINTER;
            ptr = ipdopts->param_processed_ptr;
            break;
        case SQL_DESC_UNNAMED:
            rettype = SQL_IS_SMALLINT;
            ival = NAME_IS_NULL(ipdopts->parameters[para_idx].paramName)
                       ? SQL_UNNAMED
                       : SQL_NAMED;
            break;
        case SQL_DESC_TYPE:
            rettype = SQL_IS_SMALLINT;
            switch (ipdopts->parameters[para_idx].SQLType) {
                case SQL_TYPE_DATE:
                case SQL_TYPE_TIME:
                case SQL_TYPE_TIMESTAMP:
                    ival = SQL_DATETIME;
                    break;
                default:
                    ival = ipdopts->parameters[para_idx].SQLType;
            }
            break;
        case SQL_DESC_DATETIME_INTERVAL_CODE:
            rettype = SQL_IS_SMALLINT;
            switch (ipdopts->parameters[para_idx].SQLType) {
                case SQL_TYPE_DATE:
                    ival = SQL_CODE_DATE;
                    break;
                case SQL_TYPE_TIME:
                    ival = SQL_CODE_TIME;
                    break;
                case SQL_TYPE_TIMESTAMP:
                    ival = SQL_CODE_TIMESTAMP;
                    break;
                default:
                    ival = 0;
            }
            break;
        case SQL_DESC_CONCISE_TYPE:
            rettype = SQL_IS_SMALLINT;
            ival = ipdopts->parameters[para_idx].SQLType;
            break;
        case SQL_DESC_COUNT:
            rettype = SQL_IS_SMALLINT;
            ival = ipdopts->allocated;
            break;
        case SQL_DESC_PARAMETER_TYPE:
            rettype = SQL_IS_SMALLINT;
            ival = ipdopts->parameters[para_idx].paramType;
            break;
        case SQL_DESC_PRECISION:
            rettype = SQL_IS_SMALLINT;
            switch (ipdopts->parameters[para_idx].SQLType) {
                case SQL_TYPE_DATE:
                case SQL_TYPE_TIME:
                case SQL_TYPE_TIMESTAMP:
                case SQL_DATETIME:
                    ival = ipdopts->parameters[para_idx].decimal_digits;
                    break;
            }
            break;
        case SQL_DESC_SCALE:
            rettype = SQL_IS_SMALLINT;
            switch (ipdopts->parameters[para_idx].SQLType) {
                case SQL_NUMERIC:
                    ival = ipdopts->parameters[para_idx].decimal_digits;
                    break;
            }
            break;
        case SQL_DESC_ALLOC_TYPE: /* read-only */
            rettype = SQL_IS_SMALLINT;
            ival = SQL_DESC_ALLOC_AUTO;
            break;
        case SQL_DESC_CASE_SENSITIVE: /* read-only */
        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
        case SQL_DESC_FIXED_PREC_SCALE: /* read-only */
        case SQL_DESC_LENGTH:
        case SQL_DESC_LOCAL_TYPE_NAME: /* read-only */
        case SQL_DESC_NAME:
        case SQL_DESC_NULLABLE: /* read-only */
        case SQL_DESC_NUM_PREC_RADIX:
        case SQL_DESC_OCTET_LENGTH:
        case SQL_DESC_ROWVER:    /* read-only */
        case SQL_DESC_TYPE_NAME: /* read-only */
        case SQL_DESC_UNSIGNED:  /* read-only */
        default:
            ret = SQL_ERROR;
            DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,
                         "invalid descriptor identifier");
    }
    switch (rettype) {
        case 0:
        case SQL_IS_INTEGER:
            len = sizeof(SQLINTEGER);
            *((SQLINTEGER *)Value) = 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;
    }

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