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";
}
}
}