DBD-Informix

 view release on metacpan or  search on metacpan

dbdattr.ec  view on Meta::CPAN

    else if (KEY_MATCH(kl, key, "TYPE"))
    {
        /* Returns ODBC (CLI) type numbers. */
        av = newAV();
        retsv = newRV_inc((SV *)av);
        for (i = 1; i <= imp_sth->n_ocols; i++)
        {
            SV      *sv;
            EXEC SQL GET DESCRIPTOR :nm_obind VALUE :i
                :coltype = TYPE, :collength = LENGTH;
            sv = newSViv(map_type_ifmx_to_odbc(coltype, collength));
            av_store(av, i - 1, sv);
        }
    }
    else if (KEY_MATCH(kl, key, "PRECISION"))
    {
        /* Should return CLI precision numbers. */
        av = newAV();
        retsv = newRV_inc((SV *)av);
        for (i = 1; i <= imp_sth->n_ocols; i++)
        {
            SV      *sv;
            EXEC SQL GET DESCRIPTOR :nm_obind VALUE :i
                :coltype = TYPE, :collength = LENGTH;
            sv = newSViv(map_prec_ifmx_to_odbc(coltype, collength));
            av_store(av, i - 1, sv);
        }
    }
    else if (KEY_MATCH(kl, key, "SCALE"))
    {
        /* Should return CLI scale numbers. */
        av = newAV();
        retsv = newRV_inc((SV *)av);
        for (i = 1; i <= imp_sth->n_ocols; i++)
        {
            SV      *sv;
            EXEC SQL GET DESCRIPTOR :nm_obind VALUE :i
                :coltype = TYPE, :collength = LENGTH;
            sv = newSViv(map_scale_ifmx_to_odbc(coltype, collength));
            av_store(av, i - 1, sv);
        }
    }
    else if (KEY_MATCH(kl, key, "NUM_OF_PARAMS"))
    {
        retsv = newSViv((IV)DBIc_NUM_PARAMS(imp_sth));
    }
    else if (KEY_MATCH(kl, key, "NUM_OF_FIELDS"))
    {
        assert(imp_sth->n_ocols == DBIc_NUM_FIELDS(imp_sth));

        /* RT#54426: Fix for NUM_OF_FIELDS > 0 test */
        /* Avoid returning non-zero value on INSERT */
        if (imp_sth->st_type == SQ_SELECT ||
            (imp_sth->st_type == SQ_EXECPROC && imp_sth->n_ocols > 0))
            retsv = newSViv((IV)imp_sth->n_ocols);
        else
            retsv = newSViv(0);
    }
    else if (KEY_MATCH(kl, key, "CursorName"))
    {
        retsv = newSVpv(imp_sth->nm_cursor, 0);
    }
    else if (KEY_MATCH(kl, key, "ParamValues"))
    {
        retsv = dbd_ix_st_bound_parameters(imp_sth);
    }

    /* Informix specific attributes */
    else if (KEY_MATCH(kl, key, ix_typenam))
    {
        char buffer[SQLTYPENAME_BUFSIZ];
        SV      *sv;
        av = newAV();
        retsv = newRV_inc((SV *)av);
        for (i = 1; i <= imp_sth->n_ocols; i++)
        {
            EXEC SQL GET DESCRIPTOR :nm_obind VALUE :i
                :coltype = TYPE, :collength = LENGTH;
            sv = newSVpv(sqltypename(coltype, collength, buffer, sizeof(buffer)), 0);
            av_store(av, i - 1, sv);
        }
    }
    else if (KEY_MATCH(kl, key, ix_fetchab))
    {
        Boolean rv = DBD_IX_BOOLEAN((imp_sth->st_type == SQ_SELECT) ||
                        (imp_sth->st_type == SQ_EXECPROC && imp_sth->n_ocols > 0));
        retsv = newSViv((IV)rv);
    }
    else if (KEY_MATCH(kl, key, ix_blobloc))
    {
        retsv = newSVpv(blob_bindname(imp_sth->dbh->blob_bind), 0);
    }
    else if ((retsv = dbd_ix_getsqlca(imp_sth->dbh, kl, key)) != NULL)
    {
        /* Nothing specific to do */
    }
    else if (KEY_MATCH(kl, key, ix_coltype))
    {
        av = newAV();
        retsv = newRV_inc((SV *)av);
        for (i = 1; i <= imp_sth->n_ocols; i++)
        {
            EXEC SQL GET DESCRIPTOR :nm_obind VALUE :i
                :coltype = TYPE;
            av_store(av, i - 1, newSViv((IV)coltype));
        }
    }
    else if (KEY_MATCH(kl, key, ix_colleng))
    {
        av = newAV();
        retsv = newRV_inc((SV *)av);
        for (i = 1; i <= imp_sth->n_ocols; i++)
        {
            EXEC SQL GET DESCRIPTOR :nm_obind VALUE :i
                :collength = LENGTH;
            av_store(av, i - 1, newSViv((IV)collength));
        }
    }
    else if (KEY_MATCH(kl, key, ix_csrhold))
    {
        retsv = newSViv((IV)imp_sth->is_holdcursor);
    }
    else if (KEY_MATCH(kl, key, ix_scrlcsr))
    {
        retsv = newSViv((IV)imp_sth->is_scrollcursor);
    }
    else if (KEY_MATCH(kl, key, ix_instcsr))
    {
        retsv = newSViv((IV)imp_sth->is_insertcursor);
    }
    else
    {
        dbd_ix_exit(function);
        return Nullsv;
    }

    dbd_ix_exit(function);

    if (av != 0)
        sv_2mortal((SV *)av);

    return sv_2mortal(retsv);
}



( run in 0.629 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )