void data_sources(drh, attr = NULL) SV* drh; SV* attr; PROTOTYPE: $;$ PPCODE: { #ifdef DBD_ODBC_NO_DATASOURCES /* D_imp_drh(drh); imp_drh->henv = SQL_NULL_HENV; dbd_error(drh, (RETCODE) SQL_ERROR, "data_sources: SOLID doesn't implement SQLDataSources()");*/ XSRETURN(0); #else int numDataSources = 0; UWORD fDirection = SQL_FETCH_FIRST; RETCODE rc; UCHAR dsn[SQL_MAX_DSN_LENGTH+1+9 /* strlen("DBI:ODBC:") */]; SWORD dsn_length; UCHAR description[256]; SWORD description_length; D_imp_drh(drh); if (!imp_drh->connects) { rc = SQLAllocEnv(&imp_drh->henv); if (!SQL_ok(rc)) { imp_drh->henv = SQL_NULL_HENV; dbd_error(drh, rc, "data_sources/SQLAllocEnv"); XSRETURN(0); } } strcpy(dsn, "dbi:ODBC:"); while (1) { rc = SQLDataSources(imp_drh->henv, fDirection, dsn+9, /* strlen("DBI:ODBC:") */ SQL_MAX_DSN_LENGTH, &dsn_length, description, sizeof(description), &description_length); if (!SQL_ok(rc)) { if (rc != SQL_NO_DATA_FOUND) { /* * Temporarily increment imp_drh->connects, so * that dbd_error uses our henv. */ imp_drh->connects++; dbd_error(drh, rc, "data_sources/SQLDataSources"); imp_drh->connects--; } break; } ST(numDataSources++) = newSVpv(dsn, dsn_length+9 /* strlen("dbi:ODBC:") */ ); fDirection = SQL_FETCH_NEXT; } if (!imp_drh->connects) { SQLFreeEnv(imp_drh->henv); imp_drh->henv = SQL_NULL_HENV; } XSRETURN(numDataSources); #endif /* no data sources */ }