Skip to content

Commit

Permalink
Merge branch 'fb109733' of https://github.com/rurban/DBD-mysql into r…
Browse files Browse the repository at this point in the history
…urban-fb109733

Conflicts:
	dbdimp.c
  • Loading branch information
CaptTofu committed Nov 15, 2014
2 parents f551659 + df58d60 commit 283c5df
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 48 deletions.
5 changes: 1 addition & 4 deletions dbdimp.c
Expand Up @@ -1996,7 +1996,7 @@ static int my_login(pTHX_ SV* dbh, imp_dbh_t *imp_dbh)
char* password;
char* mysql_socket;
int result;
int fresh = 0;
int fresh = 0;
D_imp_xxh(dbh);

/* TODO- resolve this so that it is set only if DBI is 1.607 */
Expand Down Expand Up @@ -2052,10 +2052,7 @@ static int my_login(pTHX_ SV* dbh, imp_dbh_t *imp_dbh)
password, dbname, imp_dbh) ? TRUE : FALSE;
if (fresh && !result) {
/* Prevent leaks, but do not free in case of a reconnect. See #97625 */
do_error(dbh, mysql_errno(imp_dbh->pmysql),
mysql_error(imp_dbh->pmysql) ,mysql_sqlstate(imp_dbh->pmysql));
Safefree(imp_dbh->pmysql);
imp_dbh->pmysql = NULL;
}
return result;
}
Expand Down
105 changes: 61 additions & 44 deletions t/rt85919-fetch-lost-connection.t
@@ -1,44 +1,61 @@
use strict;
use warnings;
use DBI;
use Test::More;
use lib 't', '.';
use vars qw($table $test_dsn $test_user $test_password $mdriver);
require 'lib.pl';

my $dbh;
eval {$dbh= DBI->connect($test_dsn, $test_user, $test_password,
{ RaiseError => 1, PrintError => 0, AutoCommit => 0 });};
if ($@) {
plan skip_all => "ERROR: $@. Can't continue test";
}
my $sth;
my $ok = eval {
print "Connecting...\n";
ok( $sth = $dbh->do('SET wait_timeout = 5'), 'set wait_timeout');
print "Sleeping...\n";
sleep 7;
my $sql = 'SELECT 1';
if (1) {
ok( $sth = $dbh->prepare($sql), 'prepare SQL');
ok( $sth->execute(), 'execute SQL');
my @res = $sth->fetchrow_array();
is ( $res[0], undef, 'no rows returned');
ok( $sth->finish(), 'finish');
$sth = undef;
}
else {
print "Selecting...\n";
my @res = $dbh->selectrow_array($sql);
}
$dbh->disconnect();
$dbh = undef;
1;
};
if (not $ok) {
is ( $DBI::err, 2006, 'Received error 2006' );
is ( $DBI::errstr, 'MySQL server has gone away', 'Received MySQL server has gone away');
eval { $sth->finish(); } if defined $sth;
eval { $dbh->disconnect(); } if defined $dbh;
}
done_testing();
use strict;
use warnings;
use DBI;
use Test::More;
use lib 't', '.';
use vars qw($table $test_dsn $test_user $test_password $mdriver);
require 'lib.pl';

my $dbh;
eval {$dbh= DBI->connect($test_dsn, $test_user, $test_password,
{ RaiseError => 1, PrintError => 0, AutoCommit => 0 });};
if ($@) {
plan skip_all => "ERROR: $@. Can't continue test";
}
my $sth;
my $ok = eval {
print "Connecting...\n";
ok( $sth = $dbh->do('SET wait_timeout = 5'), 'set wait_timeout');
print "Sleeping...\n";
sleep 7;
my $sql = 'SELECT 1';
if (1) {
ok( $sth = $dbh->prepare($sql), 'prepare SQL');
ok( $sth->execute(), 'execute SQL');
my @res = $sth->fetchrow_array();
is ( $res[0], undef, 'no rows returned');
ok( $sth->finish(), 'finish');
$sth = undef;
}
else {
print "Selecting...\n";
my @res = $dbh->selectrow_array($sql);
}
$dbh->disconnect();
$dbh = undef;
1;
};
if (not $ok) {
is ( $DBI::err, 2006, 'Received error 2006' );
is ( $DBI::errstr, 'MySQL server has gone away', 'Received MySQL server has gone away');
eval { $sth->finish(); } if defined $sth;
eval { $dbh->disconnect(); } if defined $dbh;
}

if (0) {
# This causes the use=after-free crash in RT #97625.
# different testcase by killing the service. which is of course
# not doable in a general testscript and highly system dependent.
system(qw(sudo service mysql start));
use DBI;
my $dbh = DBI->connect("DBI:mysql:database=test:port=3306");
$dbh->{mysql_auto_reconnect} = 1; # without this is works
my $select = sub { $dbh->do(q{SELECT 1}) for 1 .. 10; };
$select->();
system qw(sudo service mysql stop);
$select->();
ok(1, "dbh did not crash on closed connection");
system(qw(sudo service mysql start));
}

done_testing();

0 comments on commit 283c5df

Please sign in to comment.