I've had a series of discussions with several DBD authors and others because I wanted to get better support for Driver-side trace message handling in a portable way.
My DBD::Unify supports $dbh->{dbd_verbose} since a *long* time, and Tim never saw the generic value of that, but now that John Scoles has used it for himself in DBD::Oracle and others showed interest too, it might be well worth to take the discussion to a wider board. Here's a summary, '»' marked lines are proposed additions/changes. I hope I interpreted all opinions correctly. DBI $h->trace ($trace_setting [, $output ]); $h may be 'DBI' $trace_setting is a (combined) flag, which supports 1..15 Simple debug level "SQL" All SQL statements executed (not yet implemented) "ALL" All DBI *and* Driver flags » "DBD" All Driver flags » $h->trace ("DBD=7") could be an alternative to set the level "1|pglib" Combinations of a DBI debug level and driver flags, which have to be parsed by parse_trace_flags () » "1|4" Combination of a DBI debug level and a driver debug level » "|4" Driver-side only debug level, will NOT alter the current DBI debug level $trace_setting can be stored in $ENV{DBI_TRACE} » Driver side $trace_settings can be stored in $ENV{DBD_TRACE} (note that this /was/ DBD_VERBOSE in previous discussions, but DBD_TRACE is more in line with the above) #define DBIc_TRACE_LEVEL_MASK 0x0000000F #define DBIc_TRACE_FLAGS_MASK 0xFFFFFF00 Is 0x00000000F0 supposed to be the Driver *level* mask? $output can be a filename or an output handle. The latter is very nice in combination with perlIO my $trace = ""; open my $th, ">", \$trace; $dbh->trace (4, $th); ... $dbh->trace (0); # Trace log now in $trace; Handles can get there own (inherited) $trace_setting using the $h->{TraceLevel} = "2|14"; » $h->{dbd_verbose} = 4; » the dbd_verbose attribute is internally implemented as uni_verbose, » pg_verbose, ora_verbose, ... but offers a generic alias to » dbd_verbose, so that writing cross-database portable scripts will be » much easier. There is no policy regarding DBD tracing. DBD::Unify uses a trace *level*, which is by default inherited from dbis->debug (XS), but DBD::Pg uses flags DBI - Uses trace *level* (flags SQL or ALL set all) 0 - Trace disabled. 1 - Trace top-level DBI method calls returning with results or errors. 2 - As above, adding tracing of top-level method entry with parameters. 3 - As above, adding some high-level information from the driver and some internal information from the DBI. 4 - As above, adding more detailed information from the driver. This is the first level to trace all the rows being fetched. 5 to 15 - As above but with more and more internal information. DBD::Unify - Uses trace *level* 0 - Trace disabled 1 - No messages defined (yet) 2 - Level 1 plus main method entry and exit points: 3 - Level 2 plus errors and additional return codes and field types and values: 4 - Level 3 plus some content info: 5 - Level 4 plus internal coding for exchanges and low(er) level return codes: 6 - Level 5 plus destroy/cleanup states: 7 - No messages (yet) set to level 7 and up. DBD::Oracle - Uses trace *level* Uses level 1..6, but does not document what the output is DBD::Pg - uses trace *flags* AND *level* from DBI. Level 4 or higher sets all flags pglibpq - Outputs the name of each libpq function (without arguments) immediately before running it. pgstart - Outputs the name of each internal DBD::Pg function, and other information such as the function arguments or important global variables, as each function starts pgend - Outputs a simple message at the very end of each internal DBD::Pg function. pgprefix - Forces each line of trace output to begin with the string "dbdpg: " pglogin - Outputs a message showing the connection string right before a new database connection is attempted (on with level 5 or up) DBD::MySQL - Cannot find anything in the docs about tracing DBD::ODBC - Only supports one trace flag odbcdev - flag is used to output development tracing so it should not be relevant in normal use. DBD::ODBC outputs tracing at levels 3 and above (as levels 1 and 2 are reserved for DBI). Where is it stated that levels 1 and 2 are DBI only? All of the people I talked to agree that is is often useful to see Driver-only tracing/debugging, as by now we do trust that DBI is Doing The Right Thing (TM) The problem with the current definition of the trace_flags, is that, even though most drivers still work with a trace *level*, it only supports trace *flags*. My implementation and suggestion of $h->{dbd_verbose} is a nice workaround to start with, but it would be easier to lift it to the trace method, so that Driver-only tracing is more standardized http://search.cpan.org/~timb/DBI-1.607/lib/DBI/DBD.pm#Other_database_handle_methods -- H.Merijn Brand Amsterdam Perl Mongers http://amsterdam.pm.org/ using & porting perl 5.6.2, 5.8.x, 5.10.x, 5.11.x on HP-UX 10.20, 11.00, 11.11, 11.23, and 11.31, SuSE 10.1, 10.2, and 10.3, AIX 5.2, and Cygwin. http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/ http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/