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 )