#!/usr/bin/perl # # $Header: /Users/claude/fuzz/lib/Genezzo/RCS/TestSQL.pm,v 1.3 2007/06/26 08:17:04 claude Exp claude $ # # copyright (c) 2006 Jeffrey I Cohen, all rights reserved, worldwide # # package Genezzo::TestSQL; use Genezzo::TestSetup; use Genezzo::GenDBI; use Genezzo::Util; use strict; use warnings; use File::Path; use File::Spec; use File::Copy; sub TestSQL { # my $self = shift; my %required = ( dbh => "no dbh", log_dir => "no log dir", sql_script => "no sql" ); my %args = ( @_); return undef unless (Validate(\%args, \%required)); my $dbh = $args{dbh}; my $log_dir = $args{log_dir}; my $sql_script = $args{sql_script}; my @foo = File::Spec->splitpath($sql_script); my $base_sql = $foo[-1]; # get filename my $log_name = $base_sql; $log_name =~ s/sql$/log/; my $out_log = File::Spec->catfile($log_dir, $log_name); my $old_log = $sql_script; $old_log =~ s/sql$/log/; unless (-e $log_dir) { mkpath($log_dir, 1, 0755); } my $spool_str = "spool " . $out_log; my $at_str = '@' . $sql_script; $dbh->Parseall("startup"); $dbh->Parseall($spool_str); $dbh->Parseall($at_str); $dbh->Parseall("spool off"); $dbh->Parseall("shutdown"); return TestDiff(old_log => $old_log, new_log => $out_log); } sub TestDiff { # my $self = shift; my %required = ( old_log => "no old log", new_log => "no new log" ); my %args = ( @_); return undef unless (Validate(\%args, \%required)); my $old_log = $args{old_log}; my $new_log = $args{new_log}; return "no such file: $old_log" unless (-e $old_log); return "no such file: $new_log" unless (-e $new_log); my ($old_line, $new_line) = ("no old line", "no new line"); my $linecount = 0; # use a closure for the comparison function so can find out where # the diff happened and get the offending lines my $cmp_fn = sub { ($old_line, $new_line) = @_; $linecount++; # print "cmp_fn: $old_line\n$new_line\n"; return ($old_line ne $new_line); }; use File::Compare; my $stat = File::Compare::compare_text($old_log, $new_log, $cmp_fn); # my $stat = compare($old_log, $new_log); if ($stat == 0) { return "no differences found"; } elsif ($stat == 1) { # print $old_line, "\n"; # print $new_line, "\n"; # print $linecount, "\n"; return "differences found: $old_log, $new_log\nline $linecount:\nold:$old_line\nnew:$new_line"; } return undef; } END { } # module clean-up code here (global destructor) ## YOUR CODE GOES HERE 1; # don't forget to return a true value from the file __END__ # Below is stub documentation for your module. You better edit it! =head1 NAME Genezzo::TestSQL - Test SQL scripts =head1 SYNOPSIS use Genezzo::TestSQL; =head1 DESCRIPTION Run a SQL script and compare the output log with the old log. =head1 ARGUMENTS =head1 FUNCTIONS =over 4 =item TestSQL =item TestDiff =back =head2 EXPORT =over 4 =back =head1 LIMITATIONS =head1 TODO =over 4 =item stuff =back =head1 AUTHOR Jeffrey I. Cohen, jcohen@genezzo.com =head1 SEE ALSO L. Copyright (c) 2005 Jeffrey I Cohen. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Address bug reports and comments to: jcohen@genezzo.com For more information, please visit the Genezzo homepage at L =cut