Script to cross reference sybase tables and stored procedures of a given database with perl scripts (.cgi, .pl, .pm extensions)
#!/ms/dist/perl5/bin/perl5.6
use strict;
use Sybase::DBlib;
use Benchmark;
my $t1 = new Benchmark;
if( scalar (@ARGV) < 2 ) {
die "Need the directory of perl scripts and/or DB name!\n";
}
my $dir = $ARGV[ 0 ];
my $dbname = $ARGV[ 1 ];
my $user = $ARGV[ 2 ];
my $pass = $ARGV[ 3 ];
my $server = $ARGV[ 4 ];
my $dbh = new Sybase::DBlib( $user, $pass, $server ) or die "\nCannot login to $server\n";
my $db = $dbh->dbuse( $dbname );
opendir DIR, $dir or die "Cannot open directory $dir for read\n";
my @files = readdir( DIR );
closedir DIR;
my $sql = "select tab.name from sysobjects tab where tab.type='U'";
my @tab;
my @col;
#Replace the nsql function to call using HASH
my $rc = $dbh->nsql( $sql, "ARRAY", sub{
push @tab, $_[ 0 ];
push @col, $_[ 1 ];
});
if( $DB_ERROR ) {
die "Error encountered during select of table names- $DB_ERROR\n";
}
my %TblHash;
my $temp;
foreach my $tab1 ( @tab ) {
my $sql;
$sql = "sp_depends $tab1";
my @depends;
$dbh->nsql( $sql, "ARRAY", sub{
if(( defined($_[ 1 ] )) and ($_[ 1 ] eq "stored procedure" )){
my $proc1 = substr($_[ 0 ],4);
$proc1 =~ s/\s+//g;
push @depends, $proc1;
}
});
print "Searching for table - $tab1\n";
foreach my $fl1 ( @files ) {
if( $fl1 =~ 'cgi$|perl$|pm$|perl$' ) {
open (FIL, "$dir/$fl1") or warn "cannot open - $fl1\n";
my $line;
while( $line = ) {
if( $line =~ $tab1 and $line !~ '^#') {
if( $TblHash{$tab1} !~ $fl1 ) {
$TblHash{$tab1} = $TblHash{$tab1}."$fl1,";
}
}
else {
foreach (@depends) {
if( $line =~ $_ ) {
if( $TblHash{$tab1} !~ $fl1 ) {
$TblHash{$tab1} = $TblHash{$tab1}."$fl1,";
}
}
}
}
}
close FIL;
}
}
}
open OUT,">report.txt" or die "cannot open report for write!\n";
foreach (keys (%TblHash)) {
my @scriptfiles = split /,/,substr($TblHash{$_},0,-1);
print OUT "\n--------------------------\n";
print OUT $_,"\n--------------------------\n";
foreach (@scriptfiles){
print OUT $_,"\n";
}
print OUT "\n++++++++++++++++++++++++++\n\n";
}
close OUT;
$dbh->dbclose();
my $t2 = new Benchmark;
my $timediff = timediff( $t2, $t1 );
print "Total time for exec - ",timestr($timediff),"\n";

