On Sat, 5 Feb 2011 12:29:09 +0000, Tim Bunce <tim.bu...@pobox.com>
wrote:

> On Fri, Feb 04, 2011 at 08:00:13PM +0000, Martin J. Evans wrote:
> > Tim,
> > 
> > At the LPW I think I promised to add connection and encoding trace
> > flags to DBI which add to the already existing SQL flag. I never got
> > around to it and Merijn reminded me today on #dbi. The change is
> > trivial and once implemented I will replace DBD::ODBC trace flags
> > for connection and encoding with the standard DBI ones. There only
> > remains 2 small issues wrt to this which need confirming:
> > 
> > 1. DBI currently says
> >     return 0x00000100 if $name eq 'SQL';
> > 
> >    and as there is no macro for 0x00000100 I have the following in
> > DBD::ODBC:
> > 
> > /* Can't find a constant in DBI for SQL tracing but it is 256 */
> > #define SQL_TRACE_FLAG 0x100
> > 
> > and then code like this:
> > 
> >    if (DBIc_TRACE(imp_dbh, SQL_TRACE_FLAG, 0, 3)) {
> >        TRACE1(imp_dbh, "    SQLExecDirect %s\n", SvPV_nolen(statement));
> >    }
> > 
> > Should there be macros for DBI's trace flags
> 
> Yes. I'd suggest
> 
>     #define DBIf_TRACE_SQL   0x00000100
> 
> > and if so where do they go (in DBIXS.h?)
> 
> Just above DBIc_TRACE_MATCHES.
> 
> > 2. I propose adding connection and encoding flags to DBI - so far
> > they've kept pretty short:
> > 
> >   ALL
> >   SQL
> > 
> > so I've replicated this with:
> > 
> >     sub parse_trace_flag {
> >     my ($h, $name) = @_;
> >     #      0xddDDDDrL (driver, DBI, reserved, Level)
> >     return 0x00000100 if $name eq 'SQL';
> >     return 0x00000200 if $name eq 'CON';
> >     return 0x00000400 if $name eq 'ENC';
> >     return;
> >     }
> > 
> > and:
> > 
> > Currently the DBI only defines four trace flags:
> > 
> >   ALL - turn on all DBI and driver flags (not recommended)
> >   SQL - trace SQL statements executed
> >         (not yet implemented in DBI but implemented in some DBDs)
> >   CON - trace connection process
> >         (not yet implemented in DBI but implemented in some DBDs)
> >   ENC - trace encoding (unicode translations etc)
> >         (not yet implemented in DBI but implemented in some DBDs)
> > 
> > is this ok?
> 
> I'm not a huge fan of short names in general, but in this case I think
> it's reasonable.
> 
> > and 2 supplementals:
> > 
> > 3. I could look into implementing some/all those flags in DBI but it
> > seems these areas are pretty much covered with trace levels right
> > now
> 
> I think it's worth adding CON. It would enable connect and disconnect to
> be traced *with no other output*. 
> 
> > and in any case, I cannot find prepare in DBI (for SQL tracing)
> > anyway.
> 
> The trace flag checking would need to be applied in XS_DBI_dispatch
> and controlled by the 'Internal Method Attributes' (dbi_ima_st).
> 
> I'm thinking it would work along these lines:
> 
>     When a method with the CON trace flag is called and the current
>     trace setting on the handle has the CON trace flag set, then the trace
>     level will be set to min(trace_level,2) for the duration of the call.
> 
> Sound ok?
> 
> (I've partly implemented that but not tested it yet.)
> 
> > 4. Lastly (and not wanting to get in Merijn's way who agreed to look
> > at it) but at the same workshop you discussed dbd_verbose (or
> > whatever some DBDs have added support for) with Merijn and we think
> > you said there is space in the trace settings for DBD trace
> > settings. Apparently some DBDs only want DBD tracing and not DBI
> > tracing so trace level is no good as it always includes DBI tracing.
> > I think you were talking about reserving some space for DBDs only -
> > perhaps you could remind us - the idea being settings (or a setting)
> > which outputs DBD tracing but not DBI tracing.
> 
> As you note above, the current trace settings are encoded into an int:
> 
>       #      0xddDDDDrL (driver, DBI, reserved, Level)
> 
> Where L is the DBI trace level (0-16) and the rest are bit flags.
> The 4 reserved bits could be used as a driver trace level (0-16).

#   0xddlDDDrL (driver, driver-level, DBI, reserved, Level)

would be perfect in my world.

Why I started the whole debug discussion so long ago, was that I by now
trust the way DBI does handle what it has to handle, and 95% of the
time I run into trouble, I just want to see what the driver (DBD) is
doing in the back.

So far I didn't get all the authors into a straight line. We all had
our own vision in what was most useful to debug our own DBD without
looking at how other DBD's did their debugging, and I must say I am
just as guilty.

Now back to that "need", I invented $DBD_VERBOSE => $dbh->{dbd_verbose}
to skip all the DBI messages (as said, they only caused noise to what I
wanted to see).

back to 0xddlDDDrL

l than is "level" to DBD, what "L" is to DBI

How many bits in DDDD do you think will ever be used? If we now use 2
or 3, wouldn't it be better to change to

#  0xddlDDDrL ?

Which would mean that we stay 100% backward compatible (as the first D
of DDDD was only reserved but never used.

With this scheme, it is extremely easy for all drivers to update their
docs to match DBI. Those drivers that used a level will just have to
use the 'l', those that used flags will (still) have to use the dd.

We could then document the use and support of DBD_VERBOSE to
automatically translate to the ddl part. If a DBD already supported
$DBD_VERBOSE instead of "ddl", it will work just as it did, if the DBD
updates to the new scheme (requiring DBI-1.xxx that supports it), then
the "upgrade" is automatic and doesn't change a thing from the user
point of view.

Am I being messy? Or does this all make sense?

-- 
H.Merijn Brand  http://tux.nl      Perl Monger  http://amsterdam.pm.org/
using 5.00307 through 5.12 and porting perl5.13.x on HP-UX 10.20, 11.00,
11.11, 11.23 and 11.31, OpenSuSE 10.1, 11.0 .. 11.3 and AIX 5.2 and 5.3.
http://mirrors.develooper.com/hpux/           http://www.test-smoke.org/
http://qa.perl.org      http://www.goldmark.org/jeff/stupid-disclaimers/

Reply via email to