|
Packit |
d03604 |
#!/usr/local/bin/perl -w
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
# $Id$
|
|
Packit |
d03604 |
#
|
|
Packit |
d03604 |
# Copyright (c) 1994-1998 Tim Bunce
|
|
Packit |
d03604 |
#
|
|
Packit |
d03604 |
# See COPYRIGHT section in DBI.pm for usage and distribution rights.
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
# This is now mostly an empty shell I experiment with.
|
|
Packit |
d03604 |
# The real tests have moved to t/*.t
|
|
Packit |
d03604 |
# See t/*.t for more detailed tests.
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
BEGIN {
|
|
Packit |
d03604 |
print "$0 @ARGV\n";
|
|
Packit |
d03604 |
print q{DBI test application $Revision$}."\n";
|
|
Packit |
d03604 |
$| = 1;
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
use blib;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
use DBI;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
use DBI::DBD; # simple test to make sure it's okay
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
use Config;
|
|
Packit |
d03604 |
use Getopt::Long;
|
|
Packit |
d03604 |
use strict;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
our $has_devel_leak = eval {
|
|
Packit |
d03604 |
local $^W = 0; # silence "Use of uninitialized value $DynaLoader::args[0] in subroutine entry";
|
|
Packit |
d03604 |
require Devel::Leak;
|
|
Packit |
d03604 |
};
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
$::opt_d = 0;
|
|
Packit |
d03604 |
$::opt_l = '';
|
|
Packit |
d03604 |
$::opt_h = 0;
|
|
Packit |
d03604 |
$::opt_m = 0; # basic memory leak test: "perl test.pl -m NullP"
|
|
Packit |
d03604 |
$::opt_t = 0; # thread test
|
|
Packit |
d03604 |
$::opt_n = 0; # counter for other options
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
GetOptions(qw(d=i h=i l=s m=i t=i n=i))
|
|
Packit |
d03604 |
or die "Usage: $0 [-d n] [-h n] [-m n] [-t n] [-n n] [drivername]\n";
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
my $count = 0;
|
|
Packit |
d03604 |
my $ps = (-d '/proc') ? "ps -lp " : "ps -l";
|
|
Packit |
d03604 |
my $driver = $ARGV[0] || ($::opt_m ? 'NullP' : 'ExampleP');
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
# Now ask for some information from the DBI Switch
|
|
Packit |
d03604 |
my $switch = DBI->internal;
|
|
Packit |
d03604 |
$switch->trace($::opt_h); # 2=detailed handle trace
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
DBI->trace($::opt_d, $::opt_l) if $::opt_d || $::opt_l;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
print "Switch: $switch->{'Attribution'}, $switch->{'Version'}\n";
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
print "Available Drivers: ",join(", ",DBI->available_drivers(1)),"\n";
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
my $dbh = DBI->connect("dbi:$driver:", '', '', { RaiseError=>1 }) or die;
|
|
Packit |
d03604 |
$dbh->trace($::opt_h);
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
if (0) {
|
|
Packit |
d03604 |
DBI->trace(3);
|
|
Packit |
d03604 |
my $h = DBI->connect('dbi:NullP:','','', { RootClass=>'MyTestDBI', DbTypeSubclass=>'foo, bar' });
|
|
Packit |
d03604 |
DBI->trace(0);
|
|
Packit |
d03604 |
{ # only works after 5.004_04:
|
|
Packit |
d03604 |
warn "RaiseError= '$h->{RaiseError}' (pre local)\n";
|
|
Packit |
d03604 |
local($h->{RaiseError});# = undef;
|
|
Packit |
d03604 |
warn "RaiseError= '$h->{RaiseError}' (post local)\n";
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
warn "RaiseError= '$h->{RaiseError}' (post local block)\n";
|
|
Packit |
d03604 |
exit 1;
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
if ($::opt_m) {
|
|
Packit |
d03604 |
#$dbh->trace(9);
|
|
Packit |
d03604 |
my $level = $::opt_m;
|
|
Packit |
d03604 |
my $cnt = $::opt_n || 10000;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
print "Using $driver, same dbh...\n";
|
|
Packit |
d03604 |
for (my $i=0; $i<$cnt; ++$i) { mem_test($dbh, undef, $level, undef, undef, undef) }
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
print "Using NullP, reconnecting each time...\n";
|
|
Packit |
d03604 |
for (my $i=0; $i<$cnt; ++$i) { mem_test(undef, ['dbi:NullP:'], $level, undef, undef, undef) }
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
print "Using ExampleP, reconnecting each time...\n";
|
|
Packit |
d03604 |
my $r_develleak = 0;
|
|
Packit |
d03604 |
mem_test(undef, ['dbi:NullP:'], $level, undef, undef, \$r_develleak) while 1;
|
|
Packit |
d03604 |
#mem_test(undef, ['dbi:mysql:VC'], $level, "select * from campaigns where length(?)>0", 0, undef) while 1;
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
elsif ($::opt_t) {
|
|
Packit |
d03604 |
thread_test();
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
else {
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
# new experimental connect_test_perf method
|
|
Packit |
d03604 |
DBI->connect_test_perf("dbi:$driver:", '', '', {
|
|
Packit |
d03604 |
dbi_loops=>3, dbi_par=>20, dbi_verb=>1
|
|
Packit |
d03604 |
});
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
require Benchmark;
|
|
Packit |
d03604 |
print "Testing handle creation speed...\n";
|
|
Packit |
d03604 |
my $null_dbh = DBI->connect('dbi:NullP:','','');
|
|
Packit |
d03604 |
my $null_sth = $null_dbh->prepare(''); # create one to warm up
|
|
Packit |
d03604 |
$count = 20_000;
|
|
Packit |
d03604 |
$count /= 10 if $ENV{DBI_AUTOPROXY};
|
|
Packit |
d03604 |
my $i = $count;
|
|
Packit |
d03604 |
my $t1 = new Benchmark;
|
|
Packit |
d03604 |
$null_dbh->prepare('') while $i--;
|
|
Packit |
d03604 |
my $td = Benchmark::timediff(Benchmark->new, $t1);
|
|
Packit |
d03604 |
my $tds= Benchmark::timestr($td);
|
|
Packit |
d03604 |
my $dur = $td->cpu_a || (1/$count); # fudge if cpu_a==0
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
printf "%5d NullP sth/s perl %8s %s (%s %s %s) %fs\n\n",
|
|
Packit |
d03604 |
$count/$dur, $], $Config{archname},
|
|
Packit |
d03604 |
$Config{gccversion} ? 'gcc' : $Config{cc},
|
|
Packit |
d03604 |
(split / /, $Config{gccversion}||$Config{ccversion}||'')[0]||'',
|
|
Packit |
d03604 |
$Config{optimize},
|
|
Packit |
d03604 |
$dur/$count;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
$null_dbh->disconnect;
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
$dbh->disconnect;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
#DBI->trace(4);
|
|
Packit |
d03604 |
print "$0 done\n";
|
|
Packit |
d03604 |
exit 0;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
sub mem_test { # harness to help find basic leaks
|
|
Packit |
d03604 |
my ($orig_dbh, $connect, $level, $select, $params, $r_develleak) = @_;
|
|
Packit |
d03604 |
$select ||= "select mode,ino,name from ?";
|
|
Packit |
d03604 |
$params ||= [ '.' ];
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
# this can be used to force a 'leak' to check memory use reporting
|
|
Packit |
d03604 |
#$main::leak .= " " x 1000;
|
|
Packit |
d03604 |
system("echo $count; $ps$$") if (($count++ % 2000) == 0);
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
my $dbh = $orig_dbh || do {
|
|
Packit |
d03604 |
my ($dsn, $u, $p, $attr) = @$connect;
|
|
Packit |
d03604 |
$attr->{RaiseError} = 1;
|
|
Packit |
d03604 |
DBI->connect($dsn, $u, $p, $attr);
|
|
Packit |
d03604 |
};
|
|
Packit |
d03604 |
my $cursor_a;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
my ($dl_count, $dl_handle);
|
|
Packit |
d03604 |
if ($has_devel_leak && $$r_develleak++) {
|
|
Packit |
d03604 |
$dbh->trace(2);
|
|
Packit |
d03604 |
$dl_count = Devel::Leak::NoteSV($dl_handle);
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
my $rows;
|
|
Packit |
d03604 |
$cursor_a = $dbh->prepare($select) if $level >= 2;
|
|
Packit |
d03604 |
$cursor_a->execute(@$params) if $level >= 3;
|
|
Packit |
d03604 |
$cursor_a->fetchrow_hashref() if $level >= 4;
|
|
Packit |
d03604 |
$rows = $cursor_a->fetchall_arrayref({}) if $level >= 4;
|
|
Packit |
d03604 |
$cursor_a->finish if $cursor_a && $cursor_a->{Active};
|
|
Packit |
d03604 |
undef $cursor_a;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
@{$dbh->{ChildHandles}} = ();
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
die Devel::Leak::CheckSV($dl_handle)-$dl_count
|
|
Packit |
d03604 |
if $dl_handle;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
$dbh->disconnect unless $orig_dbh;
|
|
Packit |
d03604 |
undef $dbh;
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
sub thread_test {
|
|
Packit |
d03604 |
require Thread;
|
|
Packit |
d03604 |
my $dbh = DBI->connect("dbi:ExampleP:.", "", "") || die $DBI::err;
|
|
Packit |
d03604 |
#$dbh->trace(4);
|
|
Packit |
d03604 |
my @t;
|
|
Packit |
d03604 |
print "Starting $::opt_t threads:\n";
|
|
Packit |
d03604 |
foreach(1..$::opt_t) {
|
|
Packit |
d03604 |
print "$_\n";
|
|
Packit |
d03604 |
push @t, Thread->new(\&thread_test_loop, $dbh, $::opt_n||99);
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
print "Small sleep to allow threads to progress\n";
|
|
Packit |
d03604 |
sleep 2;
|
|
Packit |
d03604 |
print "Joining threads:\n";
|
|
Packit |
d03604 |
foreach(@t) {
|
|
Packit |
d03604 |
print "$_\n";
|
|
Packit |
d03604 |
$_->join
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
sub thread_test_loop {
|
|
Packit |
d03604 |
my $dbh = shift;
|
|
Packit |
d03604 |
my $i = shift || 10;
|
|
Packit |
d03604 |
while($i-- > 0) {
|
|
Packit |
d03604 |
$dbh->selectall_arrayref("select * from ?", undef, ".");
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
}
|
|
Packit |
d03604 |
|
|
Packit |
d03604 |
# end.
|