cvsuser     02/04/05 14:01:59

  Modified:    P5EEx/Blue/P5EEx/Blue/Repository DBI.pm
  Log:
  did some long-overdue cleanup to use updated DBI routines instead of my homegrown 
ones
  
  Revision  Changes    Path
  1.10      +101 -156  p5ee/P5EEx/Blue/P5EEx/Blue/Repository/DBI.pm
  
  Index: DBI.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Repository/DBI.pm,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -w -r1.9 -r1.10
  --- DBI.pm    19 Mar 2002 22:14:51 -0000      1.9
  +++ DBI.pm    5 Apr 2002 22:01:59 -0000       1.10
  @@ -1,13 +1,13 @@
   
   ######################################################################
  -## File: $Id: DBI.pm,v 1.9 2002/03/19 22:14:51 spadkins Exp $
  +## File: $Id: DBI.pm,v 1.10 2002/04/05 22:01:59 spadkins Exp $
   ######################################################################
   
   use P5EEx::Blue::P5EE;
   use P5EEx::Blue::Repository;
   
   package P5EEx::Blue::Repository::DBI;
  -$VERSION = do { my @r=(q$Revision: 1.9 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r};
  +$VERSION = do { my @r=(q$Revision: 1.10 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r};
   
   @ISA = ( "P5EEx::Blue::Repository" );
   
  @@ -222,121 +222,84 @@
       $err ? $err : "";
   }
   
  -######################################################################
  -# SQL EXECUTE METHODS (new methods not defined in P5EEx::Blue::Repository)
  -######################################################################
  -
  -# $colvararr = $rep->exec_select_row($sql);
  -sub exec_select_row {
  -    my ($self, $sql) = @_;
  -    my (@row, $dbh, $sth, $rc);
  -
  -    if (!defined $self->{dbh}) {
  -        $self->{error} = "Not connected to database";
  -        return ()
  -    }
  -    $dbh = $self->{dbh};
  -    delete $self->{error};
  -    $self->{sql} = $sql;
  -
  -    $sth = $dbh->prepare($sql);
  -    if ($DBI::err) {
  -        return();
  -    }
  -
  -    $rc =  $sth->execute;
  -    if ($DBI::err) {
  -        return();
  -    }
  -
  -    @row = $sth->fetchrow;
  -    if ($DBI::err) {
  -        return();
  -    }
  -
  -    $sth->finish;
  -    if ($DBI::err) {
  -        return();
  -    }
  -
  -    \@row;
  -}
  -
  -# @colvararr = $rep->exec_select($sql);
  -sub exec_select {
  -    my ($self, $sql, $startrow, $endrow) = @_;
  -    my (@rows, @row, $dbh, $sth, $rc, $rownum);
  -
  -    if (!defined $self->{dbh}) {
  -        $self->{error} = "Not connected to database";
  -        return ()
  -    }
  -    $dbh = $self->{dbh};
  -    delete $self->{error};
  -    $self->{sql} = $sql;
  -
  -    $sth = $dbh->prepare($sql);
  -    if ($DBI::err) {
  -        return();
  -    }
  -
  -    $rc =  $sth->execute;
  -    if ($DBI::err) {
  -        return();
  -    }
  +# modified from the DBD::_::db::selectall_arrayref in DBI.pm
  +sub selectrange_arrayref {
  +    my ($self, $stmt, $startrow, $endrow, $attr, @bind) = @_;
  +    my $dbh = $self->{dbh};
  +    return [] if (!$dbh);
   
  +    my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr);
  +    return unless $sth;
  +    $sth->execute(@bind) || return;
  +    my $slice = $attr->{Slice}; # typically undef, else hash or array ref
  +    if (!$slice and $slice=$attr->{Columns}) {
  +        if (ref $slice eq 'ARRAY') { # map col idx to perl array idx
  +            $slice = [ @{$attr->{Columns}} ];       # take a copy
  +            for (@$slice) { $_-- }
  +        }
  +    }
  +    return $self->fetchrange_arrayref($sth, $startrow, $endrow, $slice);
  +}
  +
  +# modified from the DBD::_::st::fetchall_arrayref in DBI.pm
  +sub fetchrange_arrayref {
  +    my ($self, $sth, $startrow, $endrow, $slice) = @_;
  +    $slice = [] if (! defined $slice);
  +    $startrow = 0 if (!defined $startrow);
  +    $endrow = 0 if (!defined $endrow);
  +    my $mode = ref $slice;
  +    my @rows;
  +    my $row;
  +    my ($rownum);
  +    if ($mode eq 'ARRAY') {
  +        # we copy the array here because fetch (currently) always
  +        # returns the same array ref. XXX
  +        if (@$slice) {
       $rownum = 0;
  -    while (1) {
  -        @row = $sth->fetchrow;
  +            while ($row = $sth->fetch) {
           $rownum++;
  -        if ($DBI::err) {
  -            return();
  +                last if ($endrow > 0 && $rownum > $endrow);
  +                push @rows, [ @{$row}[ @$slice] ] if ($rownum >= $startrow);
           }
  -        if ($#row < 0 || ($endrow > 0 && $rownum > $endrow)) {
  -            $sth->finish;
  -            if ($DBI::err) {
  -                return();
  +            $sth->finish if ($endrow > 0 && $rownum > $endrow);
               }
  -            last;
  +        else {
  +            # return $sth->_fetchall_arrayref;
  +            $rownum = 0;
  +            while ($row = $sth->fetch) {
  +                $rownum++;
  +                last if ($endrow > 0 && $rownum > $endrow);
  +                push @rows, [ @$row ] if ($rownum >= $startrow);
           }
  -        if ($rownum >= $startrow) {
  -            push(@rows, [@row]);
  +            $sth->finish if ($endrow > 0 && $rownum > $endrow);
           }
       }
  -    \@rows;
  +    elsif ($mode eq 'HASH') {
  +        if (keys %$slice) {
  +            my @o_keys = keys %$slice;
  +            my @i_keys = map { lc } keys %$slice;
  +            $rownum = 0;
  +            while ($row = $sth->fetchrow_hashref('NAME_lc')) {
  +                my %hash;
  +                @hash{@o_keys} = @{$row}{@i_keys};
  +                $rownum++;
  +                last if ($endrow > 0 && $rownum > $endrow);
  +                push @rows, \%hash if ($rownum >= $startrow);
   }
  -
  -# $ok = $rep->exec_sql($sql);
  -sub exec_sql {
  -    my ($self, $sql) = @_;
  -    my (@data, @row, $dbh, $sth, $rc);
  -
  -    if (!defined $self->{dbh}) {
  -        $self->{error} = "Not connected to database";
  -        return 0;
  +            $sth->finish if ($endrow > 0 && $rownum > $endrow);
       }
  -    $dbh = $self->{dbh};
  -    delete $self->{error};
  -    $self->{numrows} = 0;
  -    $self->{sql} = $sql;
  -
  -    $sth = $dbh->prepare($sql);
  -    if ($DBI::err) {
  -        return(0);
  +        else {
  +            # XXX assumes new ref each fetchhash
  +            while ($row = $sth->fetchrow_hashref()) {
  +                $rownum++;
  +                last if ($endrow > 0 && $rownum > $endrow);
  +                push @rows, $row if ($rownum >= $startrow);
       }
  -
  -    $rc =  $sth->execute;
  -    $self->{numrows} = $rc;
  -    if ($DBI::err) {
  -        return(0);
  +            $sth->finish if ($endrow > 0 && $rownum > $endrow);
       }
  -
  -    $sth->finish;
  -    if ($DBI::err) {
  -        return(0);
       }
  -
  -    1;
  +    else { Carp::croak("fetchall_arrayref($mode) invalid") }
  +    return \@rows;
   }
   
   ######################################################################
  @@ -1171,7 +1134,7 @@
   # $row = $rep->select_row ($table, \@cols, \@params, \%paramvalues);
   sub select_row {
       my $self = shift;
  -    my ($table, $sql);
  +    my ($dbh, $table, $sql);
       $table = $_[0];
       if ($self->{table}{$table}{rawaccess}) {
           $sql = $self->mk_select_rows_sql(@_);
  @@ -1179,7 +1142,9 @@
       else {
           $sql = $self->mk_select_joined_rows_sql(@_);
       }
  -    $self->exec_select_row($sql);
  +    $dbh = $self->{dbh};
  +    return undef if (!$dbh);
  +    return $dbh->selectrow_arrayref($sql);
   }
   
   # NOTE: everything after the first line is optional
  @@ -1191,7 +1156,7 @@
   # TODO: rethink $startrow/$endrow vs. $numrows/$skiprows
   sub select_rows {
       my $self = shift;
  -    my ($table, $startrow, $endrow, $sql);
  +    my ($dbh, $table, $startrow, $endrow, $sql);
       ($table, $startrow, $endrow) = @_[(0,5,6)];
       if ($self->{table}{$table}{rawaccess}) {
           $sql = $self->mk_select_rows_sql(@_);
  @@ -1199,14 +1164,16 @@
       else {
           $sql = $self->mk_select_joined_rows_sql(@_);
       }
  -    $self->exec_select($sql, $startrow, $endrow);
  +    return $self->selectrange_arrayref($sql, $startrow, $endrow);
   }
   
   # $ok = $rep->insert_row ($table, \@cols, \@row);
   sub insert_row {
       my ($self, $table, $cols, $row) = @_;
       my $sql = $self->mk_insert_row_sql($table, $cols, $row);
  -    $self->exec_sql($sql);
  +    my $dbh = $self->{dbh};
  +    return 0 if (!defined $dbh);
  +    return $dbh->do($sql);
   }
   
   # $ok = $rep->insert_rows ($table, \@cols, \@rows);
  @@ -1214,11 +1181,14 @@
       my ($self, $table, $cols, $rows) = @_;
       my ($row, $sql, $nrows, $ok);
      
  +    my $dbh = $self->{dbh};
  +    return 0 if (!defined $dbh);
  +
       $ok = 1;
       foreach $row (@$rows) {
           $sql = $self->mk_insert_row_sql($table, $cols, $row);
           $nrows += $self->{numrows};
  -        if (!$self->exec_sql($sql)) {
  +        if (!$dbh->do($sql)) {
               $self->{numrows} = $nrows;
               $ok = 0;
               last;
  @@ -1232,61 +1202,36 @@
   sub update_row {
       my ($self, $table, $cols, $row, $keycolidx) = @_;
       my $sql = $self->mk_update_row_sql($table, $cols, $row, $keycolidx);
  -    $self->exec_sql($sql);
  +    my $dbh = $self->{dbh};
  +    return 0 if (!defined $dbh);
  +    return $dbh->do($sql);
   }
   
   # $ok = $rep->update_rows($table, \@cols, \@row, \@params, \%paramvalues);
   sub update_rows {
       my ($self, $table, $cols, $row, $params, $paramvalues) = @_;
       my $sql = $self->mk_update_rows_sql($table, $cols, $row, $params, $paramvalues);
  -    $self->exec_sql($sql);
  +    my $dbh = $self->{dbh};
  +    return 0 if (!defined $dbh);
  +    return $dbh->do($sql);
   }
   
  -# $ok = $rep->store_row  ($table, \@cols, \@row, \@keycolidx, $update_first);
  -#sub store_row {
  -#    my ($self, $table, $cols, $row, $keycolidx, $update_first) = @_;
  -#    my ($update_sql, $insert_sql, $success);
  -#
  -#    #print "store_row($table,\n   [",
  -#    #    join(",",@$cols), "],\n   [",
  -#    #    join(",",@$row), "],\n   [",
  -#    #    join(",",@$keycolidx), "], $update_first);\n";
  -#
  -#    $success = 0;
  -#    if ($update_first) {
  -#        $update_sql = $self->mk_update_row_sql($table,$cols,$row,$keycolidx);
  -#        $success = $self->exec_sql($update_sql);
  -#        $success = 0 if ($self->{numrows} == 0);     # SQL succeeded but found no 
rows to update
  -#        if (!$success) {
  -#            $insert_sql = $self->mk_insert_row_sql($table,$cols,$row);
  -#            $success = $self->exec_sql($insert_sql);
  -#        }
  -#    }
  -#    else {
  -#        $insert_sql = $self->mk_insert_row_sql($table,$cols,$row);
  -#        $success = $self->exec_sql($insert_sql);
  -#        if (!$success) {
  -#            $update_sql = $self->mk_update_row_sql($table,$cols,$row,$keycolidx);
  -#            $success = $self->exec_sql($update_sql);
  -#            $success = 0 if ($self->{numrows} == 0);     # SQL succeeded but found 
no rows to update
  -#        }
  -#    }
  -#
  -#    $success;
  -#}
  -
   # $ok = $rep->delete_row ($table, \@cols, \@row, \@keycolidx);
   sub delete_row {
       my $self = shift;
       my $sql = $self->mk_delete_row_sql(@_);
  -    $self->exec_sql($sql);
  +    my $dbh = $self->{dbh};
  +    return 0 if (!defined $dbh);
  +    return $dbh->do($sql);
   }
   
   # $ok = $rep->delete_rows($table, \@params, \%paramvalues);
   sub delete_rows {
       my $self = shift;
       my $sql = $self->mk_delete_rows_sql(@_);
  -    $self->exec_sql($sql);
  +    my $dbh = $self->{dbh};
  +    return 0 if (!defined $dbh);
  +    return $dbh->do($sql);
   }
   
   ######################################################################
  
  
  


Reply via email to