in reply to problems wrapping DBI

Don't hardcode the classname. This will break inheritance, if you ever need it. Also, you weren't using strict in your package. Shame on you! :)

package db_dave; use strict; use DBI; use vars qw/ @ISA /; @ISA = qw/DBI/; sub new { my $class = shift; my $dbh = DBI->connect('dbi:Oracle:foo', 'foo', 'foo', { RaiseErro +r => 1 }) || die "Cant' connect: $DBI::errstr"; my $data = { _dbh => $dbh }; bless $data, $class; return $data; } sub runsql_returnString_NEW { my ($self, $q, $err) = @_; my $dbh = $self->{ _dbh }; my $sth = $dbh->prepare($q); $sth->execute || &error($q, $err); # <- why do you have a regular +function in an OO module? my $returnstring; while (my @array = $sth->fetchrow) { # ?? You're overwriting this every time :( # I can't tell what type of data structure you want $returnstring = $array[0]; } $sth->finish; return $returnstring; }

That should give you a start (though the code is untested). It needs a lot of work.

Cheers,
Ovid

Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

Replies are listed 'Best First'.
Re: (Ovid) Re: problems wrapping DBI
by mr.dunstan (Monk) on Dec 17, 2001 at 23:27 UTC
    Thanks Ovid - you've given me some great perl nuggets that helped really explain how to work object oriented coding in perl! I figured since this was so helpful to me, I'd post my code, fixed up, since you posted on this thread, maybe this can help someone else. (I personally am going to use this stuff for quick and dirty data cleanup tasks...)

    You guys were right about reinventing the wheel, I'm sure there are much better modules out there that would be better for maintainability's sake - I just wanted to do this as an exercise and got exactly what I wanted!

    Thanks again...
    package db_dave; use strict; use DBI; use vars qw/ @ISA /; @ISA = qw/DBI/; sub new { my $class = shift; my ($db, $username, $password) = @_; if ($password eq "") { print STDOUT "## enter password for " . $username . "\@" . $db + . ": "; $password = <STDIN>; chomp $password; if ($password eq "") {die;} } my $dbh = DBI->connect("dbi:Oracle:" . $db, $username, $password, +{ RaiseError => 1 }) || die "Cant' connect: $DBI::errstr"; my $data = { _dbh => $dbh }; bless $data, $class; print STDERR "\n## connected \n"; return $data; } sub disconnect { my ($self, $q, $err) = @_; my $dbh = $self->{ _dbh }; $dbh->disconnect; print STDERR "\n## disconnected \n\n"; return; } sub runsql_string { my ($self, $q, $err) = @_; my $dbh = $self->{ _dbh }; my $sth = $dbh->prepare($q); print STDERR "\n## runsql_string: $q \n"; $sth->execute || die; my $returnstring; my @array; while (@array = $sth->fetchrow) { $returnstring = $array[0];} my $stringcount = @array; if ($stringcount > 1) { die; } $sth->finish; if ($::DEBUG) { print STDERR "[0] " . $returnstring . "\n"; } return $returnstring; } =begin testing use strict; use DBI; use lib "./"; use db_dave; $::DEBUG = "1"; # prints query results my $dbh = new db_dave("foo", "foo", "foo"); my $err = "error"; $q = "select count(*) from table"; $dbh->runsql_string($q, $err) . "\n"; $dbh->disconnect; =end testing


    -mr.dunstan