Index: server/Slim/DataStores/DBI/DataModel.pm =================================================================== --- server/Slim/DataStores/DBI/DataModel.pm (revision 3108) +++ server/Slim/DataStores/DBI/DataModel.pm (working copy) @@ -79,11 +79,9 @@ close $fh; } -sub db_Main { - my $class = shift; - - return $dbh if defined $dbh; - +sub db_Connect { + my $class = shift; + my $dbname = Slim::Utils::OSDetect::OS() eq 'unix' ? '.slimserversql.db' : 'slimserversql.db'; $dbname = catdir(Slim::Utils::Prefs::get('cachedir'), $dbname); @@ -119,7 +117,17 @@ } $::d_info && Slim::Utils::Misc::msg("Connected to database $source\n"); + return $dbh; +} + +sub db_Main { + my $class = shift; + + return $dbh if defined $dbh; + + $dbh = $class->db_Connect(); + my $version; my $nextversion; do { @@ -218,12 +226,20 @@ sub getMetaInformation { my $class = shift; - + my $self = shift; + + if(!$dbh->ping()){ + $dbh = $class->db_Connect(); + } $dbh->selectrow_array("SELECT track_count, total_time FROM metainformation"); } sub setMetaInformation { my ($class, $track_count, $total_time) = @_; + + if(!$dbh->ping()){ + $dbh = $class->db_Connect(); + } $dbh->do("UPDATE metainformation SET track_count = " . $track_count . ", total_time = " . $total_time); } @@ -626,8 +642,12 @@ # XXX - wrap in eval? my $sth; - + eval { + if(!$dbh->ping()){ + $dbh = $class->db_Connect(); + } + $sth = $dbh->prepare_cached($sql); $sth->execute(@bind); }; @@ -780,6 +800,17 @@ } } +#overload search() to check if the connection is still alive +sub search { + my $self = shift; + + if(!$dbh->ping()){ + $dbh = $self->db_Connect(); + } + + $self->SUPER::search(@_); +} + 1; __END__ Index: server/Slim/DataStores/DBI/DBIStore.pm =================================================================== --- server/Slim/DataStores/DBI/DBIStore.pm (revision 3108) +++ server/Slim/DataStores/DBI/DBIStore.pm (working copy) @@ -338,7 +338,9 @@ $track->update(); $self->_updateTrackValidity($track); - + if(!$self->{'dbh'}->ping()) { + $self->{'dbh'} = Slim::DataStores::DBI::DataModel->db_Connect(); + } $self->{'dbh'}->commit() if $commit; } @@ -422,6 +424,9 @@ $self->_updateTrackValidity($track); + if(!$self->{'dbh'}->ping()) { + $self->{'dbh'} = Slim::DataStores::DBI::DataModel->db_Connect(); + } $self->{'dbh'}->commit() if $args->{'commit'}; return $track; @@ -535,6 +540,10 @@ } $track->delete(); + + if(!$self->{'dbh'}->ping()) { + $self->{'dbh'} = Slim::DataStores::DBI::DataModel->db_Connect(); + } $self->{'dbh'}->commit() if $commit; $::d_info && Slim::Utils::Misc::msg("cleared $url from database\n"); @@ -700,6 +709,9 @@ } # We're done. + if(!$self->{'dbh'}->ping()) { + $self->{'dbh'} = Slim::DataStores::DBI::DataModel->db_Connect(); + } $self->{'dbh'}->commit(); $::d_info && Slim::Utils::Misc::msg("Finished with cleanupStaleTableEntries()\n"); @@ -768,7 +780,10 @@ $self->{'lastTrack'} = {}; $::d_info && Slim::Utils::Misc::msg("forceCommit: syncing to the database.\n"); - + + if(!$self->{'dbh'}->ping()) { + $self->{'dbh'} = Slim::DataStores::DBI::DataModel->db_Connect(); + } $self->{'dbh'}->commit(); $Slim::DataStores::DBI::DataModel::dirtyCount = 0;