Re: promised trace flags change - a bit late

"Martin J. Evans" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Organization Easysoft Limited
Message-ID <[email protected]>
Greg,

I've tried to add some background to explain where these changes came from. I know Merijn has replied already. Personally, I don't need any extra space for DBD only level tracing as I now mostly use flags but I have no objection to Merijn adding it.

On 09/02/11 02:53, Greg Sabino Mullane wrote:
> 
>> 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.
> 
> Not sure if this has been covered upthread, but DBD::Pg makes heavy 
> use of tracing flags;

Then you are ok since you can set a flag specific to DBD::Pg and get only that tracing and not trace level tracing. Few DBDs use trace flags and in fact few DBDs use DBIc_TRACE macro at all and mostly examine the trace level directly.

> I'm not sure what you mean by trace level 
> being no good for DBD but not DBI output. If DBD::Pg, this is 
> as simple as:

Trace level is no good to get DBD only tracing since level 1 and 2 is for DBI and anything after that is DBD. To get DBD tracing with trace level you'd have to set level 3 at least and that would give you DBI level 1 and 2 plus DBD level 3. Some people (Merijn, John) wanted only DBD tracing and implemented dbd_verbose. Tux asked when I was going to implement odbc_verbose on #dbi and when I looked it had been implemented as a separate flag in their DBDs and therefore an extra check was required every time you thought you wanted to trace. I didn't like that.

In addition, at the LPW speaking to Tim I mentioned I had implemented some trace flags in DBD::ODBC which were probably generic in nature and agreed to add them to DBI. Whilst I was there I thought I could sort the trace DBD only issue out as well by adding a DBD trace flag.
 
> $dbh->trace('pglibpq'); ## as one example
> 
> We even have a specific flag for all DBD-specific and non-DBI output:
> 
> $dbh->trace('DBD');

Which is now duplicated in DBI for all DBDs. I see you implemented that as set all my trace flags if DBD set
 
	sub parse_trace_flag {
		my ($class, $flag) = @_;
		return (0x7FFFFF00 - 0x08000000) if $flag eq 'DBD'; ## all but the prefix

I didn't realise you did that and although I can see why it means you've added a flag with an uppercase name which is reserved for DBI. I'm not sure you'll ever see DBD in your parse_trace_flags after 1.617 so you'll need to do something similar to what I did (below) in addition to keeping what you already have (above) to cover older DBIs before 1.617.
 
> Also, can you elaborate more on what things the CON and ENC will 
> output? I'm wondering how similar the CON is to the DBD::Pg's 
> 'pglogin' flag:

Ok. DBD::ODBC had a flag called odbc_connection which only output connection specific tracing. In ODBC, a lot happens at connect time and often something happens at connect time which has an affect later. Sometimes all I needed from people was connect tracing so I added the flag. All I've done to DBI is added a CON flag which is documented as 

  trace connection process

>   =item pglogin
> 
>   Outputs a message showing the connection string right before a new 
>   database connection is attempted, a message when the connection 
>   was successful, and a message right after the database has been 
>   disconnected. Also output if trace level is 5 or greater.
> 
> 

Sounds the same to me.

The ENC flag is for encoding tracing. In DBD::ODBC it was/is called odbc_unicode and Tim suggested encoding was better. It is documented as:

  trace encoding (unicode translations etc)

ok, not a great description. In ODBC there are 2 different APIs for ANSI and Unicode and DBD::ODBC has to do a lot of translation of UCS2 to UTF-8 and vice versa. Also because the API is different, different functions are called and this is purely dependent on whether the Perl strings (say to SQLDriverConnect/SQLPrepare etc) are UTF-8 encoded or whether the data retrieved from the database is UCS2 or not. I use the ENC flag to trace encoding specific places.

Since it sounds like you already use flags you could (if you wish) do what I did (as I was already using flags) which is something like this:

/* DBI defines the following but not until 1.617 so we replicate here for now */
/* will remove when DBD::ODBC requires 1.617 or above */
#ifndef DBIf_TRACE_SQL
# define DBIf_TRACE_SQL 0x00000100
#endif
#ifndef DBIf_TRACE_CON
# define DBIf_TRACE_CON 0x00000200
#endif
#ifndef DBIf_TRACE_ENC
# define DBIf_TRACE_ENC 0x00000400
#endif
#ifndef DBIf_TRACE_DBD
# define DBIf_TRACE_DBD 0x00000800
#endif
#ifndef DBIf_TRACE_TXN
# define DBIf_TRACE_DBD 0x000001000
#endif

/* combined DBI trace connection and encoding flags with DBD::ODBC ones */
/* Historically DBD::ODBC had 2 flags before they were made DBI ones */
/* DBI used to only have SQL flag */
#define UNICODE_TRACING (0x02000000|DBIf_TRACE_ENC|DBIf_TRACE_DBD)
#define CONNECTION_TRACING (0x04000000|DBIf_TRACE_CON|DBIf_TRACE_DBD)
#define DBD_TRACING DBIf_TRACE_DBD
#define TRANSACTION_TRACING (DBIf_TRACE_TXN|DBIf_TRACE_DBD)
#define SQL_TRACING (DBIf_TRACE_SQL|DBIf_TRACE_DBD)

So my flags were odbc_connection 0x04000000 and odbc_unicode 0x02000000. I simply combine my flags with DBI's new ones for the similar purpose and DBIc_TRACE does all the work for me. DBI already had SQL flag. In addition, I or DBIf_TRACE_DBD in to ensure I get all my tracing when the DBD flag is set.

So for connection tracing I do:

  if (DBIc_TRACE(imp_dbh, CONNECTION_TRACING, 0, 3))

which will trace if:

o DBI's CON flag is set
o odbc_connection flag is set
o DBI's DBD flag i set
o trace level is > 3

I could have been even more specific with that 0 to say only trace if any of the flags are set if level is also over N but I don't care for that.

Also, Tim made some changes to stop some DBI tracing at startup when only flags are set so we achieved the goal of DBD-only tracing with adding any new mechanism and now just need to persuade more DBD authors to use DBIc_TRACE instead of what more do which is

	if (DBIS->debug >= 2 || dbd_verbose >= 3 ) {

Hope this answers your queries.

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.