Using DBI methods

Bradley Baetz bbaetz at student.usyd.edu.au
Sun Aug 18 13:49:37 UTC 2002


This got kind of long, but do read it all carefully.

In bug 163290, I'm moving the various DB stuff into a separate file, 
Bugzilla/DB.pm.

For the moment, this is being transferred fairly literally into an OO 
infrastructure.

However, it seems to me that it may be worth being able to use the DBI
methods directly. |perldoc DBI| lists those, for the interested.

Advantages:

1) Can use stuff like:
  my ($a, $b) = $dbh->selectrow_array("SELECT a,b FROM foo WHERE 
                                       prim_key=7");

or selectall_arrayref, and so on

which is nicer/cleaner/faster/easier to read than our sendsql+fetch stuff

2) We get to use DBI's error handling + exceptions - currently we only 
check for errors in one place, which is bad.

Note that all of these can reasonably easily be added to the current 
setup, but it starts to become less worthwhile/more complicated/etc as we 
go on

3) Can be faster - by using the routines as written in C in the DBI/DBD
  - unlikely to be really noticable since we don't tend to move large 
volumes of data to/from the db, but every bit helps.

4) No more state stack
  - don't have to worry about forgetting to push/pop the state stack -
simply get a new statement handle when you need one from teh globally 
available dbh when needed.

Disadvantages:

1) New syntax required
  - We can (and will) keep the old syntax arround for backwards 
compatability, though, for the reasonably future.
  - Mixing FetchOneColumn() and fetchrow_arrayref (for example) on ehte 
same statement handle won't work, because of the internal buffer 
MoreSQLData needs to determine emptyness.

2) Its slightly messier
  - Need to keep statment objects arround explicitly, rather than 
implicitly

3) We need to up the required DBI version
  - The currently required version dates to July 1999 (1.13). To use the 
HandleError stuff to do custom SQL error messages, we need 1.21 (Feb 2002)
  - Its also needed to subclass DBI, which is what we need for taint 
checking, and supporting the old (current) syntax (speaking of which, I 
should email the dbi list about the taint stuff...)
  - It has a lot of the cross-db stuff for transactions which we will need 
at some point
  - DBI-1.21 comes with debian stable and RH7.2/7.3 at least. Its not that 
hard to install it though, anyway

  - If DBI does add a 'TaintInOnly' mode, then we'll require that at some 
point, although probably not right away (or even at all for 2.18)

4) we need to up the required perl version to 5.005_03
  - that DBI version requires 5.005_03. We've been talking about it for a 
while, and 5.8 is now out, so requring the latest 5.005 release shouldn't 
be an issue, although I know that afranke will disagree...
  - Do note that the latest DBI version has a note that it may not support
5.005 for much longer. This may become an issue for us at some point in
the future.

What do people think about the above?

'Feature' removal:

I also plan to remove the following two features:

a) SQL log should indent the log as statements are pushed to the stack
  - If we no longer have a stack and have sth's which can be finshed in 
    an order different to when they were started, this is a pain to do.
  - The results don't really look any better, because very very very few of
    our SQL statements fit into 80 columns, let alone 80-8*depth. so it
    wraps anyway
  - More importantly, this doesn't actually work. It took me 15 minutes to 
    work out why not, and it hasn't worked since it was checked in almost 
    two years ago. Why? Because the case in |SavedSQLStates| is wrong.
    Why didn't this trigger a 'used only once' warning? Because it got
    added to the silliness stuff in a warning fix-up (bug 72862) :)

b) In theory, Param("shutdownhtml") will currently work even for scripts 
which don't |require 'CGI.pl'|.

Pre-templatisation/2.16, the check was in PutHeader, which was too 
late (and not called for non-CGIs anyway) Now, its in CGI.pl's toplevel 
stuff.

The current behaviour of having MoreSQLData() return 0 is a pain to 
re-implement, plus its buggy, and may cause stuff to happen which 
shouldn't (eg what if one of these calls is trying to regenerate the 
versioncache, or its a security check, or something?)

(I just checked, and regenerating the versioncache with shutdownhtml set 
does result in one which is empty.)

Eventually this will happen somewhere apart from CGI.pl, but for the
moment... This will cause different behaviour in non-cgi stuff, but I
consider an error (which Bugzilla::DB::connect will generate) to be 
preferable than generating bogus data/empty versioncache/etc

I'd be incredibly surprised if any of those programs work with shutdown 
html anyway - collectstats, for example, dies when it can't read from the 
product table a product which is in the versioncache.

(I'm tossing up between |connect| returning undef, dieing, or throwing an 
exception, and leaning towards the exception, which will basically mean a 
die)

If you object to the removal of any of the above please let me know ASAP.

Bradley




More information about the developers mailing list