On Mon, Oct 27, 2003 at 04:50:18PM +0100, Steffen Goeldner wrote: > Tim Bunce wrote: > > > > On Fri, Oct 24, 2003 at 11:00:55AM +0200, Steffen Goeldner wrote: > > > Is there any value in returning a value (pun intended) > > > from STORE? E.g.: > > > > > > sub STORE { > > > ... > > > return 1; > > > > > > For dbd_db_STORE_attrib(), DBI::DBD states: > > > > > > The return value is TRUE if you have handled the > > > attribute or FALSE otherwise. > > > > That's needed so the Driver.xst code knows if it should > > then call SUPER::STORE. > > > > > Does the same rule apply to STORE()? If so, where > > > is the returned value used? > > > > The only way for an application to get the return value is by calling > > STORE explicitly. I guess that might be useful in some situations. > > Three cases cross my mind: > > 1) Return nothing (or an arbitrary value), i.e. the caller shouldn't > use that value. > > 2) Return a boolean value, indicating success or failure. > > 3) Return the new value. > > Tim, can you settle on one of these cases?
I think it has to be 1 unless the driver docs indicate otherwise. > If so, I'd like to include your recommendation into DBI::DBD. Thanks. > BTW: Case 1, something like that: > > sub STORE { > ... > $dbh->SUPER::STORE($attr, $val); > return; > } > > seems to collide with current practice: > > sub begin_work { > ... > $dbh->STORE('BegunWork', 1); > } > > $rc = $dbh->begin_work or die $dbh->errstr; That's a bug. I've changed begin_work to return 1 instead of falling off the end. > P.S.: Funny, a similar question entered the p5p mailing-list > > <http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-10/msg01249.html> Here's the proof from a trace (with a few lines deleted): $ DBI_TRACE=2 perl -MDBI -e '$a = DBI->install_driver("mysql")->{foo}=1' -> DBI->install_driver(mysql) for freebsd perl=5.006001 pid=24349 ruid=307 euid=307 <- install_driver= DBI::dr=HASH(0x81ba9b0) -> STORE in DBD::_::common for DBD::mysql::dr (DBI::dr=HASH(0x810709c)~INNER 'foo' 1) <- STORE= '' at -e line 1 -> FETCH in DBD::_::common for DBD::mysql::dr (DBI::dr=HASH(0x810709c)~INNER 'foo') <- FETCH= undef at -e line 1 note that the FETCH is skipped in a void context: $ DBI_TRACE=2 perl -MDBI -e 'DBI->install_driver("mysql")->{foo}=1' -> DBI->install_driver(mysql) for freebsd perl=5.006001 pid=24348 ruid=307 euid=307 <- install_driver= DBI::dr=HASH(0x81ba9b0) -> STORE in DBD::_::common for DBD::mysql::dr (DBI::dr=HASH(0x81070b4)~INNER 'foo' 1) <- STORE= '' at -e line 1 I should add some notes about that to the docs. It has interesting knock-on issues in relation to a) testing an attribute assignment, and b) performance impact. Thanks. Tim.