Jobrun
view release on metacpan or search on metacpan
lib/Jobrun.pm view on Meta::CPAN
, pid CHAR(12)
, status CHAR(20)
, start_time CHAR(30)
, end_time CHAR(30)
, elapsed_time CHAR(20)
, exit_code CHAR(10)
, cmd CHAR(200))
}
);
};
#if ($@) {
#print "Error: $@\n";
#print "Table most likely already exists\n";
#}
return;
}
sub truncateTable {
$utilDBH = createDbConnection();
$utilDBH->do("DELETE FROM $controlTable");
return;
}
sub insertTable {
my ( $self, $name, $pid, $status, $startTime, $endTime, $elapsedTime, $exit_code, $cmd ) = @_;
#print 'insertTable SELF: ' . Dumper($self);
my $dbh = $self->{dbh};
my $sth = $dbh->prepare("INSERT INTO $controlTable (name,pid,status,start_time,end_time,elapsed_time,exit_code,cmd) VALUES (?,?,?,?,?,?,?,?)");
$sth->execute( $name, $pid, $status, $startTime, $endTime, $elapsedTime, $exit_code, $cmd );
# DBD::CSV always autocommits
# this is here in the event that we use a different DBD
#$dbh->commit();
return;
}
sub deleteTable {
my ( $self, $name ) = @_;
my $dbh = $self->{dbh};
my $sth = $dbh->prepare("DELETE FROM $controlTable WHERE name = ?");
$sth->execute($name);
#$dbh->commit();
return;
}
sub selectTable {
my ( $self, $column, $value ) = @_;
my $dbh = $self->{dbh};
my $sth = $dbh->prepare("SELECT * FROM $controlTable WHERE ? = ?");
$sth->execute( $column, $value );
my $hashRef = $sth->fetchall_hashref;
return $hashRef;
}
# only updates status and exit_code
sub updateStatus {
my ( $self, $name, $status, $exit_code, $startTime, $endTime, $elapsedTime ) = @_;
my $dbh = $self->{dbh};
my $sth = $dbh->prepare("UPDATE $controlTable SET status = ?, exit_code = ?, start_time = ? , end_time = ?, elapsed_time = ? WHERE name = ?");
$sth->execute( $status, $exit_code, $startTime, $endTime, $elapsedTime, $name );
#$dbh->commit();
return;
}
# this is a sanity check for the child processes
# validate that the child process is running
# if not then update status as failed and -1 in exit_code
sub childSanityCheck {
my ( $logFileFH, $verbose ) = @_;
logger( $logFileFH, $verbose, "childSanityCheck()\n" );
my $sth = $utilDBH->prepare("SELECT pid FROM $controlTable WHERE status = ?");
$sth->execute('running');
while ( my $row = $sth->fetchrow_hashref ) {
my $pid = $row->{pid};
logger( $logFileFH, $verbose, " pid: $pid\n" );
my $rc = kill 0, $pid;
logger( $logFileFH, $verbose, " rc: $rc\n" );
if ( $rc == 0 ) {
my $dbh = createDbConnection();
my $sth = $dbh->prepare("UPDATE $controlTable SET status = ?, exit_code = ? WHERE pid = ?");
$sth->execute( 'failed', -1, $pid );
}
}
return;
}
sub logger {
my ( $fh, $verbose, @msg ) = @_;
while (@msg) {
my $line = shift @msg;
$fh->print($line);
print "$line" if $verbose;
}
return;
}
sub new {
my ( $pkg, %args ) = @_;
my $class = ref($pkg) || $pkg;
#print "Class: $class\n";
$args{dbh} = createDbConnection();
$args{insert} = \&insertTable;
$args{updateStatus} = \&updateStatus;
$args{delete} = \&deleteTable;
$args{select} = \&selectTable;
# name,pid,status,start_time,end_time,elapsed_time,exit_code,cmd) VALUES (?,?,?,?,?)");
$args{columnNamesByName} = { name => 0, pid => 1, cmd => 2, status => 3, exit_code => 4 };
( run in 2.527 seconds using v1.01-cache-2.11-cpan-df04353d9ac )