cvsuser     04/12/14 07:42:15

  Modified:    App-Repository/lib/App/Repository DBI.pm
  Log:
  reconnect on error in _get_rows() and _get_row()
  
  Revision  Changes    Path
  1.21      +65 -21    p5ee/App-Repository/lib/App/Repository/DBI.pm
  
  Index: DBI.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/App-Repository/lib/App/Repository/DBI.pm,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- DBI.pm    1 Dec 2004 20:19:49 -0000       1.20
  +++ DBI.pm    14 Dec 2004 15:42:14 -0000      1.21
  @@ -1,13 +1,13 @@
   
   ######################################################################
  -## File: $Id: DBI.pm,v 1.20 2004/12/01 20:19:49 spadkins Exp $
  +## File: $Id: DBI.pm,v 1.21 2004/12/14 15:42:14 spadkins Exp $
   ######################################################################
   
   use App;
   use App::Repository;
   
   package App::Repository::DBI;
  -$VERSION = do { my @r=(q$Revision: 1.20 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
  +$VERSION = do { my @r=(q$Revision: 1.21 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
   
   @ISA = ( "App::Repository" );
   
  @@ -178,6 +178,7 @@
           my $dsn = $self->_dsn();
           my $attr = $self->_attr();
           $self->{dbh} = DBI->connect($dsn, $self->{dbuser}, $self->{dbpass}, 
$attr);
  +        die "Can't connect to database" if (!$self->{dbh});
       }
   
       &App::sub_exit(defined $self->{dbh}) if ($App::trace);
  @@ -342,14 +343,38 @@
       $self->{sql} = $sql;
   
       $dbh = $self->{dbh};
  -    return undef if (!$dbh);
  +    if (!$dbh) {
  +        $self->_connect();
  +        $dbh = $self->{dbh};
  +    }
   
       my $debug_sql = $self->{context}{options}{debug_sql};
       if ($debug_sql) {
           print "DEBUG_SQL: _get_row()\n";
           print $sql;
       }
  -    $row = $dbh->selectrow_arrayref($sql);
  +    while (1) {
  +        eval {
  +            $row = $dbh->selectrow_arrayref($sql);
  +        };
  +        if ($@) {
  +            $row = undef;
  +            if ($@ =~ /Lost connection/ || $@ =~ /server has gone away/) {
  +                $self->{context}->log("DBI Exception (retrying) in 
_get_row(): $@");
  +                $self->_disconnect();
  +                sleep(1);
  +                $self->_connect();
  +                $dbh = $self->{dbh};
  +            }
  +            else {
  +                $self->{context}->log("DBI Exception (fail) in _get_row(): 
$@");
  +                die $@;
  +            }
  +        }
  +        else {
  +            last;
  +        }
  +    }
       if ($debug_sql) {
           print "DEBUG_SQL: nrows [", (defined $row ? 1 : 0), "] 
$DBI::errstr\n";
           if ($debug_sql >= 2) {
  @@ -366,7 +391,7 @@
       &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $options) = @_;
   
  -    my ($sql, $dbh, $rows, $startrow, $endrow);
  +    my ($sql, $rows, $startrow, $endrow);
       if ($self->{table}{$table}{rawaccess}) {
           $sql = $self->_mk_select_sql($table, $params, $cols, $options);
       }
  @@ -375,8 +400,7 @@
       }
       $self->{sql} = $sql;
   
  -    $dbh = $self->{dbh};
  -    return undef if (!$dbh);
  +    $self->_connect() if (!$self->{dbh});
   
       $options  = {} if (!$options);
       $startrow = $options->{startrow} || 0;
  @@ -387,7 +411,27 @@
           print "DEBUG_SQL: _get_rows()\n";
           print $sql;
       }
  -    $rows     = $self->_selectrange_arrayref($sql, $startrow, $endrow);
  +    while (1) {
  +        eval {
  +            $rows = $self->_selectrange_arrayref($sql, $startrow, $endrow);
  +        };
  +        if ($@) {
  +            $rows = [];
  +            if ($@ =~ /Lost connection/ || $@ =~ /server has gone away/) {
  +                $self->{context}->log("DBI Exception (retrying) in 
_get_rows(): $@");
  +                $self->_disconnect();
  +                sleep(1);
  +                $self->_connect();
  +            }
  +            else {
  +                $self->{context}->log("DBI Exception (fail) in _get_rows(): 
$@");
  +                die $@;
  +            }
  +        }
  +        else {
  +            last;
  +        }
  +    }
       if ($debug_sql) {
           print "DEBUG_SQL: nrows [", (defined $rows ? ($#$rows+1) : 0), "] 
$DBI::errstr\n";
           if ($debug_sql >= 2) {
  @@ -1263,25 +1307,25 @@
   
   sub _require_tables {
       &App::sub_entry if ($App::trace >= 3);
  -    my ($self, $dbexpr, $reqd_tables, $tablealiashref, $require_type) = @_;
  +    my ($self, $dbexpr, $reqd_tables, $relationship_defs, $require_type) = 
@_;
       #print "_require_tables($dbexpr,...,...,$require_type)\n";
  -    my ($tablealias, $tablealias2, @tablealias, %tableseen, $dependencies);
  +    my ($relationship, $relationship2, @relationship, %tableseen, 
$dependencies);
       while ($dbexpr =~ s/([a-zA-Z_][a-zA-Z_0-9]*)\.[a-zA-Z_][a-zA-Z_0-9]*//) {
  -        if (defined $tablealiashref->{$1} && !$tableseen{$1}) {
  -            push(@tablealias, $1);
  +        if (defined $relationship_defs->{$1} && !$tableseen{$1}) {
  +            push(@relationship, $1);
               $tableseen{$1} = 1;
           }
  -        while ($tablealias = pop(@tablealias)) {
  -            if (! defined $reqd_tables->{$tablealias}) {
  -                $reqd_tables->{$tablealias} = $require_type;
  -                #print "table required: $tablealias => $require_type\n";
  -                $dependencies = $tablealiashref->{$tablealias}{dependencies};
  -                push(@tablealias, @$dependencies)
  +        while ($relationship = pop(@relationship)) {
  +            if (! defined $reqd_tables->{$relationship}) {
  +                $reqd_tables->{$relationship} = $require_type;
  +                #print "table required: $relationship => $require_type\n";
  +                $dependencies = 
$relationship_defs->{$relationship}{dependencies};
  +                push(@relationship, @$dependencies)
                      if (defined $dependencies && ref($dependencies) eq 
"ARRAY");
               }
  -            elsif ($reqd_tables->{$tablealias} < $require_type) {
  -                $reqd_tables->{$tablealias} = $require_type;
  -                #print "table required: $tablealias => $require_type\n";
  +            elsif ($reqd_tables->{$relationship} < $require_type) {
  +                $reqd_tables->{$relationship} = $require_type;
  +                #print "table required: $relationship => $require_type\n";
               }
           }
       }
  
  
  

Reply via email to