DBD-SearchServer

 view release on metacpan or  search on metacpan

dbdimp.c  view on Meta::CPAN

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 )