static RETCODE SQL_API APDGetField()

in sql-odbc/src/sqlodbc/opensearch_api30.c [1038:1185]


static RETCODE SQL_API APDGetField(DescriptorClass *desc, SQLSMALLINT RecNumber,
                                   SQLSMALLINT FieldIdentifier, PTR Value,
                                   SQLINTEGER BufferLength,
                                   SQLINTEGER *StringLength) {
    UNUSED(BufferLength);
    RETCODE ret = SQL_SUCCESS;
    SQLLEN ival = 0;
    SQLINTEGER len, rettype = 0;
    PTR ptr = NULL;
    const APDFields *opts = (const APDFields *)&(desc->apdf);
    SQLSMALLINT para_idx;

    len = sizeof(SQLINTEGER);
    switch (FieldIdentifier) {
        case SQL_DESC_ARRAY_SIZE:
        case SQL_DESC_ARRAY_STATUS_PTR:
        case SQL_DESC_BIND_OFFSET_PTR:
        case SQL_DESC_BIND_TYPE:
        case SQL_DESC_COUNT:
            break;
        default:
            if (RecNumber <= 0 || RecNumber > opts->allocated) {
                MYLOG(OPENSEARCH_ALL, "RecN=%d allocated=%d\n", RecNumber,
                      opts->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_SIZE:
            rettype = SQL_IS_LEN;
            ival = opts->paramset_size;
            break;
        case SQL_DESC_ARRAY_STATUS_PTR:
            rettype = SQL_IS_POINTER;
            ptr = opts->param_operation_ptr;
            break;
        case SQL_DESC_BIND_OFFSET_PTR:
            rettype = SQL_IS_POINTER;
            ptr = opts->param_offset_ptr;
            break;
        case SQL_DESC_BIND_TYPE:
            ival = opts->param_bind_type;
            break;

        case SQL_DESC_TYPE:
            rettype = SQL_IS_SMALLINT;
            switch (opts->parameters[para_idx].CType) {
                case SQL_C_TYPE_DATE:
                case SQL_C_TYPE_TIME:
                case SQL_C_TYPE_TIMESTAMP:
                    ival = SQL_DATETIME;
                    break;
                default:
                    ival = opts->parameters[para_idx].CType;
            }
            break;
        case SQL_DESC_DATETIME_INTERVAL_CODE:
            rettype = SQL_IS_SMALLINT;
            switch (opts->parameters[para_idx].CType) {
                case SQL_C_TYPE_DATE:
                    ival = SQL_CODE_DATE;
                    break;
                case SQL_C_TYPE_TIME:
                    ival = SQL_CODE_TIME;
                    break;
                case SQL_C_TYPE_TIMESTAMP:
                    ival = SQL_CODE_TIMESTAMP;
                    break;
                default:
                    ival = 0;
                    break;
            }
            break;
        case SQL_DESC_CONCISE_TYPE:
            rettype = SQL_IS_SMALLINT;
            ival = opts->parameters[para_idx].CType;
            break;
        case SQL_DESC_DATA_PTR:
            rettype = SQL_IS_POINTER;
            ptr = opts->parameters[para_idx].buffer;
            break;
        case SQL_DESC_INDICATOR_PTR:
            rettype = SQL_IS_POINTER;
            ptr = opts->parameters[para_idx].indicator;
            break;
        case SQL_DESC_OCTET_LENGTH:
            ival = opts->parameters[para_idx].buflen;
            break;
        case SQL_DESC_OCTET_LENGTH_PTR:
            rettype = SQL_IS_POINTER;
            ptr = opts->parameters[para_idx].used;
            break;
        case SQL_DESC_COUNT:
            rettype = SQL_IS_SMALLINT;
            ival = opts->allocated;
            break;
        case SQL_DESC_ALLOC_TYPE: /* read-only */
            rettype = SQL_IS_SMALLINT;
            if (DC_get_embedded(desc))
                ival = SQL_DESC_ALLOC_AUTO;
            else
                ival = SQL_DESC_ALLOC_USER;
            break;
        case SQL_DESC_NUM_PREC_RADIX:
            ival = 10;
            break;
        case SQL_DESC_PRECISION:
            rettype = SQL_IS_SMALLINT;
            ival = opts->parameters[para_idx].precision;
            break;
        case SQL_DESC_SCALE:
            rettype = SQL_IS_SMALLINT;
            ival = opts->parameters[para_idx].scale;
            break;
        case SQL_DESC_DATETIME_INTERVAL_PRECISION:
        case SQL_DESC_LENGTH:
        default:
            ret = SQL_ERROR;
            DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,
                         "invalid descriptor identifer");
    }
    switch (rettype) {
        case SQL_IS_LEN:
            len = sizeof(SQLLEN);
            *((SQLLEN *)Value) = ival;
            break;
        case 0:
        case SQL_IS_INTEGER:
            len = sizeof(SQLINTEGER);
            *((SQLINTEGER *)Value) = (SQLINTEGER)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;
}