Merijn  and I have implimented it in DBD::Oracle and DBD::Unify
respectifully.  I amd about to review the thread and see if I have to
manke any futher changes to DBD::Oracle.

It think the key is gettin Tim B on board.

I myself have fount it a great help when debugging as most of bugs that
come up with DBD::Oracle have to do with OCI nd not DBI.

Just my 2c for today

Cheers
John SColes

> H.Merijn Brand wrote:
>> 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
>>
>
> Did anything come of this thread - perhaps I missed the tail end of it.
>
> I'd still like to produce DBD-specific tracing without DBI tracing so
> would be interested in any result.
>
> Martin
> --
> Martin J. Evans
> Easysoft Limited
> http://www.easysoft.com
>


Reply via email to