DBD-Oracle
view release on metacpan or search on metacpan
D_imp_sth(sth);
CODE:
{
XSRETURN_IV( imp_sth->fetch_position);
}
void
ora_fetch_scroll(sth,fetch_orient,fetch_offset)
SV * sth
IV fetch_orient
IV fetch_offset
PREINIT:
D_imp_sth(sth);
CODE:
{
AV *av;
imp_sth->fetch_orient=fetch_orient;
imp_sth->fetch_offset=fetch_offset;
av = dbd_st_fetch(sth,imp_sth);
imp_sth->fetch_offset = 1; /* default back to 1 for fetch */
imp_sth->fetch_orient=OCI_FETCH_NEXT; /* default back to fetch next */
ST(0) = (av) ? sv_2mortal(newRV((SV *)av)) : &PL_sv_undef;
}
void
ora_bind_param_inout_array(sth, param, av_ref, maxlen, attribs)
SV * sth
SV * param
SV * av_ref
IV maxlen
SV * attribs
CODE:
{
IV sql_type = 0;
D_imp_sth(sth);
SV *av_value;
if (!SvROK(av_ref) || SvTYPE(SvRV(av_ref)) != SVt_PVAV)
croak("bind_param_inout_array needs a reference to a array value");
av_value = av_ref;
if (SvREADONLY(av_value))
croak("Modification of a read-only value attempted");
if (attribs) {
if (SvNIOK(attribs)) {
sql_type = SvIV(attribs);
attribs = Nullsv;
}
else {
SV **svp;
DBD_ATTRIBS_CHECK("bind_param", sth, attribs);
DBD_ATTRIB_GET_IV(attribs, "ora_type",4, svp, sql_type);
}
}
ST(0) = dbd_bind_ph(sth, imp_sth, param,av_value, sql_type, attribs, TRUE, maxlen)
? &PL_sv_yes : &PL_sv_no;
}
void
ora_fetch(sth)
SV * sth
PPCODE:
/* fetchrow: but with scalar fetch returning NUM_FIELDS for Oraperl */
/* This code is called _directly_ by Oraperl.pm bypassing the DBI. */
/* as a result we have to do some things ourselves (like calling */
/* CLEAR_ERROR) and we loose the tracing that the DBI offers :-( */
D_imp_sth(sth);
AV *av;
int debug = DBIc_DEBUGIV(imp_sth);
if (DBIS->debug > debug)
debug = DBIS->debug;
DBIh_CLEAR_ERROR(imp_sth);
if (GIMME == G_SCALAR) { /* XXX Oraperl */
/* This non-standard behaviour added only to increase the */
/* performance of the oraperl emulation layer (Oraperl.pm) */
if (!imp_sth->done_desc && !dbd_describe(sth, imp_sth))
XSRETURN_UNDEF;
XSRETURN_IV(DBIc_NUM_FIELDS(imp_sth));
}
if (debug >= 2)
PerlIO_printf(DBILOGFP, " -> ora_fetch\n");
av = dbd_st_fetch(sth, imp_sth);
if (av) {
int num_fields = AvFILL(av)+1;
int i;
EXTEND(sp, num_fields);
for(i=0; i < num_fields; ++i) {
PUSHs(AvARRAY(av)[i]);
}
if (debug >= 2)
PerlIO_printf(DBILOGFP, " <- (...) [%d items]\n", num_fields);
}
else {
if (debug >= 2)
PerlIO_printf(DBILOGFP, " <- () [0 items]\n");
}
if (debug >= 2 && SvTRUE(DBIc_ERR(imp_sth)))
PerlIO_printf(DBILOGFP, " !! ERROR: %s %s",
neatsvpv(DBIc_ERR(imp_sth),0), neatsvpv(DBIc_ERRSTR(imp_sth),0));
void
ora_execute_array(sth, tuples, exe_count, tuples_status, err_count, cols=&PL_sv_undef)
SV * sth
SV * tuples
IV exe_count
SV * tuples_status
SV * cols
SV * err_count
PREINIT:
D_imp_sth(sth);
int retval;
CODE:
/* XXX Need default bindings if any phs are so far unbound(?) */
/* XXX this code is duplicated in selectrow_arrayref above */
if (DBIc_ROW_COUNT(imp_sth) > 0) /* reset for re-execute */
DBIc_ROW_COUNT(imp_sth) = 0;
retval = ora_st_execute_array(sth, imp_sth, tuples, tuples_status,
cols, (ub4)exe_count,err_count);
/* XXX Handle return value ... like DBI::execute_array(). */
/* remember that dbd_st_execute must return <= -2 for error */
if (retval == 0) /* ok with no rows affected */
XST_mPV(0, "0E0"); /* (true but zero) */
OCILobLocatorIsInit_log_stat(imp_dbh, imp_dbh->envhp,imp_dbh->errhp,locator,&is_init,status);
if (status != OCI_SUCCESS) {
oci_error(dbh, imp_dbh->errhp, status, "OCILobLocatorIsInit ora_lob_is_init");
ST(0) = &PL_sv_undef;
}
else {
ST(0) = sv_2mortal(newSVuv(is_init));
}
void
ora_lob_length(dbh, locator)
SV *dbh
OCILobLocator *locator
PREINIT:
D_imp_dbh(dbh);
sword status;
ub4 len = 0;
CODE:
OCILobGetLength_log_stat(imp_dbh, imp_dbh->svchp, imp_dbh->errhp, locator, &len, status);
if (status != OCI_SUCCESS) {
oci_error(dbh, imp_dbh->errhp, status, "OCILobGetLength ora_lob_length");
ST(0) = &PL_sv_undef;
}
else {
ST(0) = sv_2mortal(newSVuv(len));
}
void
ora_lob_chunk_size(dbh, locator)
SV *dbh
OCILobLocator *locator
PREINIT:
D_imp_dbh(dbh);
sword status;
ub4 chunk_size = 0;
CODE:
OCILobGetChunkSize_log_stat(imp_dbh, imp_dbh->svchp, imp_dbh->errhp, locator, &chunk_size, status);
if (status != OCI_SUCCESS) {
oci_error(dbh, imp_dbh->errhp, status, "OCILobGetChunkSize");
ST(0) = &PL_sv_undef;
}
else {
ST(0) = sv_2mortal(newSVuv(chunk_size));
}
MODULE = DBD::Oracle PACKAGE = DBD::Oracle::dr
void
init_oci(drh)
SV * drh
CODE:
D_imp_drh(drh);
dbd_init_oci(DBIS) ;
dbd_init_oci_drh(imp_drh) ;
void
DESTROY(drh)
SV * drh
PPCODE:
/* keep in sync with default DESTROY in DBI.xs (currently there is no dr default) */
D_imp_drh(drh);
ST(0) = &PL_sv_yes;
dbd_dr_destroy(drh, imp_drh);
( run in 2.952 seconds using v1.01-cache-2.11-cpan-71847e10f99 )