On Wed, Mar 19, 2003 at 12:36:28AM -0500, Rudy Lippan wrote: > On Tue, 18 Mar 2003, Tim Bunce wrote: > > > > > 2. When you get a chance, could you send me your column info patch, so > > > that I can apply it before mucking too with the perl code? > > > > Attached. > > Can you resend? I did not seem to get the attachment?
Oops, forgot. Attached. I've tweaked it slightly to use quote_identifier(), which I'm presuming you're supporting (probably via adding get_info() data). Some of the CHAR_SET_* and COLLATION_* fields could possibly be added for mysql v4.1. > > > Also looking at the auto reconenct, I think I can see why it defaults to > > > on, but for the life of me, I don't understand why this 'fix' was put into > > > the driver instead of telling people to fix their code. Grrr. > > > > I can. It's a very useful feature for some environments like mod_perl. > > If the database server has been bounced you don't want the next few > > requests (one for each child httpd) to fail. > > I try to make my code robust against such things; I ping the db and > reconnect if needed. Doing it in the driver for all server interactions is a more 'robust' approach as it's impractical to do so it completely in the application. > > > Anyway, I > > > have a patch to add the mysql_auto_reconnect Attrubite. I left it > > > defaulting to on, however, because of the existing code that depnds on the > > > feature > > > > Fine. A way to get a count of how many auto reconnects have been > > made would be handy, but not important for me as I'll probably just > > disable it. > > I am doing the counts, but as for reporting the stats I was thinking more > something like > > %stats = %{$dbh->{mysql_STATS}}; > > $recn = $stats->{auto_reconnects}; > > So we don't end up polluting the attributes with statistics if the number > grows. Thoughts? You're assuming the number will grow significantly :) I'd keep an IV in the imp_dbh struct and intercept a FETCH of 'mysql_auto_reconnects'. In future a FETCH of 'mysql_dbh_stats' could trigger construction of a hash with a bunch of stats and return a ref to that. Um, looks like you're doing roughly that in your patch. > > It certainly needs to be made very clear that any use of LOCK TABLE > > or GET_LOCK with DBD::mysql is currently unsafe as the locks can > > be lost without notice. > > Well it looks like you will also get the magic reconnect with AutoCommit > off too. mysql_real_connect() sets mysql.reconnect = 1, so the mysql > libraries will automatically reconnect to the database on execute if > needed?? Since mysql_real_execute() would always work, the DBD::mysql > auto reconnect code was not being exercised (at least against > 4.0.11-gamma.) > > > Rudy > > ps. I have attached a first draft ofn the auto_reconnect patch (I want to > do some more testing before I check it into CVS). The patch also fixes a > problem where srings were not being quoted if they had been used in > numeric context before passed to execute(). By forcing all to SQL_VARCHAR. That's worth noting in the docs because (I think) some mysql SQL expressions/functions behave differently if given a number or a string. > @@ -1047,11 +1056,11 @@ > char *key = SvPV(keysv, kl); > SV *cachesv = Nullsv; > int cacheit = FALSE; > + bool newval = SvTRUE(valuesv); newval doesn't seem like a good name for this. bool_value perhaps. > @@ -1091,6 +1100,12 @@ > + } else if (strlen("mysql_auto_reconnect") > + == kl && strEQ(key,"mysql_auto_reconnect") ) Are you presuming the compiler will optimize strlen("mysql_auto_reconnect") at compile time? I'd use kl==20 instead. > + { > + /*XXX: Does DBI handle the magic ? */ > + imp_dbh->auto_reconnect = newval; What magic, specifically? > @@ -1157,6 +1172,10 @@ > } > > switch(*key) { > + case 'a': > + if (kl == strlen("auto_reconnect") && strEQ(key, "auto_reconnect")) > + result = sv_2mortal(newSViv(imp_dbh->auto_reconnect)); > + break; Should have mysql_ prefix. Tim.