#!/usr/bin/perl use strict; use warnings; use lib "/home/jfroebe/lib"; use DBI; use File::Basename; our $SYBDBA_login = 'login'; our $SYBDBA_password = 'password'; our $dbh = connect_dbms(); sub report_err { my $msg = shift; my $type = shift; if ($type eq 'error') { print "ERROR: $msg\n"; } else { print "MSG: $msg\n"; } } sub syb_err_handler { my($err, $sev, $state, $line, $server, $proc, $msg, $sql, $err_type) = @_; my %ignore_errors = map { $_, 1 } (6, 183, 208, 2056, 2057, 14024, 17001); if ($err == 151 || $err == 50 || $err == 60) { report_err("Connection dropped", "error"); for (my $attempt = 0; $attempt < 10; $attempt++) { if ($dbh = connect_dbms()) { report_err("Reconnected", "error"); return 0; } sleep 2; } return 1; } elsif ($err == 63 || ($err == 4 && $sev == 5) ) { report_err("Connection timed out", "error"); return 1; } elsif ($ignore_errors{$err}) { # ignore return 0; } print "error: $err, $sev, $state : $msg\n"; return 1; } sub connect_dbms { my $script = basename($0); if ($dbh = DBI->connect("dbi:Sybase:server=SISDBA;loginTimeout=10;timeout=30;scriptName=$script;encryptPassword=1;tdsLevel=CS_TDS_50;charset=iso_1", $SYBDBA_login, $SYBDBA_password, { PrintError => 0, RaiseError => 0, syb_err_handler => \&syb_err_handler } )) { return $dbh; } report_err("unable to connect to SISDBA", "error"); return; } sub syb_loop { my $query = "exec sp_helpdb"; for (my $i = 0; $i < 10000; $i++) { my $array_ref = $dbh->selectall_arrayref($query); } } syb_loop();