Author: turnstep
Date: Sat Mar 26 13:05:05 2011
New Revision: 14775

Added:
   DBD-Pg/trunk/testme.tmp   (contents, props changed)

Log:
Quick little testing file I use: might as well clean it up and make it public.


Added: DBD-Pg/trunk/testme.tmp
==============================================================================
--- (empty file)
+++ DBD-Pg/trunk/testme.tmp     Sat Mar 26 13:05:05 2011
@@ -0,0 +1,89 @@
+#!/usr/bin/env perl
+
+BEGIN {
+       use lib '.', 'blib/lib', 'blib/arch';
+       system 'make';
+}
+
+use strict;
+use warnings;
+use DBI ':sql_types';
+use Data::Dumper;
+use YAML;
+use DBD::Pg qw/:pg_types/;
+use Data::Peek;
+
+use vars qw/$sth $info $count $SQL/;
+
+my $tracelevel = shift || 0;
+$ENV{DBI_TRACE} = $tracelevel;
+
+my $DSN = 'DBI:Pg:dbname=postgres';
+my $dbh = DBI->connect($DSN, '', '', 
{AutoCommit=>0,RaiseError=>1,PrintError=>0})
+  or die "Connection failed!\n";
+
+my $me = $dbh->{Driver}{Name};
+print "DBI is version $DBI::VERSION, I am $me, version of DBD::Pg is 
$DBD::Pg::VERSION\n";
+
+memory_leak_test_bug_65734();
+
+exit;
+
+sub memory_leak_test_bug_65734 {
+
+       ## Memory leak when an array appears in the bind variables
+
+       ## Set things up
+       $dbh->do('CREATE TEMPORARY TABLE tbl1 (id SERIAL PRIMARY KEY, val 
INTEGER[])');
+       $dbh->do('CREATE TEMPORARY TABLE tbl2 (id SERIAL PRIMARY KEY, val 
INTEGER)');
+
+       ## Subroutine that performs the leaking action
+       sub leakmaker1 {
+               $dbh->do('INSERT INTO tbl1(val) VALUES (?)', undef, [123]);
+       }
+
+       ## Control subroutine that does not leak
+       sub leakmaker2 {
+               $dbh->do('INSERT INTO tbl2(val) VALUES (?)', undef, 123);
+       }
+
+       leakcheck(\&leakmaker1,1000);
+
+       exit;
+
+} ## end of memory_leak_test_bug_65734
+
+
+sub leakcheck {
+
+       my $sub = shift;
+       my $count = shift || 1000;
+       my $maxsize = shift || 100000;
+
+       ## Safety check:
+       if (exists $ENV{DBI_TRACE} and $ENV{DBI_TRACE} != 0 and $ENV{DBI_TRACE} 
!= 42) {
+               $maxsize = 1;
+       }
+
+       my $runs = 0;
+
+       while (1) {
+
+               last if $runs++ >= $maxsize;
+
+               &$sub();
+
+               unless ($runs % $count) {
+                       printf "Cycles: %d\tProc size: %uK\n",
+                                 $runs,
+                                 (-f "/proc/$$/stat")
+                                 ? do { local @ARGV="/proc/$$/stat"; (split 
(/\s/, <>))[22] / 1024 }
+                                 : -1;
+               }
+
+
+       }
+
+} ## end of leakcheck
+
+__END__

Reply via email to