DBD-SearchServer
view release on metacpan or search on metacpan
SV *
dbd_st_FETCH_attrib (SV *sth, imp_sth_t *imp_sth, SV *keysv)
{
STRLEN kl;
char *key = SvPV(keysv,kl);
int i;
SV *retsv = NULL;
/* Default to caching results for DBI dispatch quick_FETCH */
int cacheit = TRUE;
if (kl==13 && strEQ(key, "NUM_OF_PARAMS")) {
return Nullsv; /* handled by DBI */
}
if (!imp_sth->done_desc && !dbd_describe(sth, imp_sth)) {
/* dbd_describe has already called ora_error() */
return Nullsv; /* XXX not quite the right thing to do? */
}
i = DBIc_NUM_FIELDS(imp_sth);
if (kl == 7 && strEQ(key, "lengths")) {
AV *av = newAV();
retsv = newRV(sv_2mortal((SV*)av));
while(--i >= 0)
av_store(av, i, newSViv((IV)imp_sth->fbh[i].dsize));
} else if (kl == 4 && strEQ(key, "TYPE")) {
AV *av = newAV();
retsv = newRV(sv_2mortal((SV*)av));
while(--i >= 0)
av_store(av, i, newSViv(imp_sth->fbh[i].dbtype));
} else if (kl == 5 && strEQ(key, "SCALE")) {
AV *av = newAV();
retsv = newRV(sv_2mortal((SV*)av));
while(--i >= 0)
av_store(av, i, newSViv(imp_sth->fbh[i].scale));
} else if (kl == 9 && strEQ(key, "PRECISION")) {
AV *av = newAV();
retsv = newRV(sv_2mortal((SV*)av));
while(--i >= 0)
av_store(av, i, newSViv(imp_sth->fbh[i].prec));
} else if (kl==8 && strEQ(key, "NULLABLE")) {
AV *av = newAV();
retsv = newRV(sv_2mortal((SV*)av));
while(--i >= 0)
av_store(av, i, boolSV(imp_sth->fbh[i].nullok));
} else if ((kl == 14 && strEQ(key, "ss_last_row_id")) ||
(kl == 15 && strEQ(key, "ful_last_row_id"))
) { /* compatibility with DBD::Fulcrum */
/* thanks to Loic Dachary for this... */
retsv = newSViv( imp_sth->ss_last_row_id );
cacheit = FALSE; /* don't let row ids be cached... */
} else if (kl == 4 && strEQ(key, "NAME")) {
AV *av = newAV();
retsv = newRV((SV*)av);
while(--i >= 0)
av_store(av, i, newSVpv((char*)imp_sth->fbh[i].cbuf,0));
} else if (kl == 10 && strEQ(key, "CursorName")) {
/* Thanks to Peter Wyngaard for this ... */
char cursor_name[SQL_MAX_CURSOR_NAME_LEN + 1];
if (SQLGetCursorName (imp_sth->phstmt,
cursor_name,
SQL_MAX_CURSOR_NAME_LEN,
NULL)
== SQL_SUCCESS)
retsv = newSVpv (cursor_name, 0);
else
retsv = Nullsv;
}
else {
return Nullsv;
}
if (cacheit) { /* cache for next time (via DBI quick_FETCH) */
SV **svp = hv_fetch((HV*)SvRV(sth), key, kl, 1);
sv_free(*svp);
*svp = retsv;
(void)SvREFCNT_inc(retsv); /* so sv_2mortal won't free it */
}
return sv_2mortal(retsv);
}
void
stmt_dump(SQLHSTMT hstmt)
{
FILE *fp = DBILOGFP;
I32 outopt;
fprintf(fp, "SearchServer-specific Options for stmt hndl: '%x'\n\t", hstmt);
SQLGetStmtOption(hstmt, SQL_CONCURRENCY, &outopt);
fprintf(fp, "SQL_CONCURRENCY: %x, ", outopt);
SQLGetStmtOption(hstmt, SQL_CURSOR_TYPE, &outopt);
fprintf(fp, "SQL_CURSOR_TYPE: %x, ", outopt);
SQLGetStmtOption(hstmt, SQL_MAX_ROWS, &outopt);
fprintf(fp, "SQL_MAX_ROWS: %x, ", outopt);
SQLGetStmtOption(hstmt, SQL_QUERY_TIMEOUT, &outopt);
fprintf(fp, "SQL_QUERY_TIMEOUT: %x, ", outopt);
SQLGetStmtOption(hstmt, SQL_ROWSET_SIZE, &outopt);
fprintf(fp, "SQL_ROWSET_SIZE: %x, ", outopt);
SQLGetStmtOption(hstmt, SQL_SS_CAPABLE, &outopt);
fprintf(fp, "\n\tSQL_SS_CAPABLE: %x ", outopt);
if (outopt & SQL_SS_KEEPRESULT) fprintf(fp, "keepresult, ");
if (outopt & SQL_SS_NOTIFYMAXROWS) fprintf(fp, "notifymaxrows, ");
if (outopt & SQL_SS_NOTIFYTIMEOUT) fprintf(fp, "notifytimeout, ");
if (outopt & SQL_SS_NOTIFYNOROWS) fprintf(fp, "notifynorows, ");
if (outopt & SQL_SS_NOTIFYDOCSTAT) fprintf(fp, "notifydocstat, ");
SQLGetStmtOption(hstmt, SQL_SS_SHOW_MATCHES, &outopt);
fprintf(fp,"\n\tSQL_SS_SHOW_MATCHES: %x, ", outopt);
SQLGetStmtOption(hstmt, SQL_SS_SHOW_SGR, &outopt);
fprintf(fp,"SQL_SS_SHOW_SGR: %x", outopt);
SQLGetStmtOption(hstmt, SQL_SS_ROW_ID, &outopt);
fprintf(fp, "\n\tSQL_SS_ROW_ID: %x ", outopt);
fprintf(fp,"\n");
}
/* --------------------------------------- */
( run in 0.636 second using v1.01-cache-2.11-cpan-39bf76dae61 )