#!/usr/bin/perl -w use strict; $|=1; my ($opt_d, $opt_u, $opt_p, ); my ($opt_l, $opt_L,); use Getopt::Long qw(:config no_ignore_case bundling); GetOptions( 'd=s' => \$opt_d, # db name 'u=s' => \$opt_u, # db user 'p=s' => \$opt_p, # db pass 'l=i' => \$opt_l, # min level 'L=i' => \$opt_L, # max level (defaults to min level); ) or die "bad options_"; $opt_d ||= "eve"; $opt_u ||= "eve"; $opt_L ||= defined $opt_l ? $opt_l : 50; $opt_l ||= 0; use EVE::Db; my $dbh = EVE::Db::dbh; use EVE::Task; my %seen = (); my ($sth_select, $sth_update_good, $sth_update_bad,); for my $lev ($opt_l..$opt_L) { my $bo = 5**$lev; if ($lev > 3) { $bo = 123 * ($lev - 2); } $bo = 1+int($bo*(0.9+rand(0.2))); # printf "PICK: level %i, backoff %i ...\n", $lev, $bo; my $sth = $sth_select ||= $dbh->prepare(qq{ SELECT * FROM apiTasks WHERE nextTry + INTERVAL ? MINUTE < UTC_TIMESTAMP() and failcount = ? }) or die $dbh->errstr; $sth->execute($bo, $lev) or die $sth->errstr; my $r = $sth->fetchall_hashref("id"); $sth->finish; unless ($r && ref $r eq 'HASH') { # printf " no targets!\n"; # next; die "no hashref returned"; } my @trg = sort {$r->{$a}->{nextTry} cmp $r->{$b}->{nextTry}} keys %$r; next unless @trg; printf "PICK: level %i, backoff %i ... got %i targets\n", $lev, $bo, scalar @trg; for (@trg) { my %task = %{$r->{$_}}; my $id = $task{id}; next if $seen{$id}++; # translate optional args for (keys %task) { next unless /^(arg\d+)key$/; my $k = $task{$_}; my $v = $task{$1."val"}; next unless defined $k && defined $v; $task{$k} = $v; } printf "TASK: '%s' / '%s' ... ", $task{taskName}, $task{taskType}; my $res = &do_task(%task); if ($res =~ s/^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d) *//) { my $nt = $1; my $sth = $sth_update_good ||= $dbh->prepare(qq{ UPDATE apiTasks SET lastSuccess = UTC_TIMESTAMP(), lastStatus = ?, nextTry = ?, failCount = 0 WHERE id = ? }) or die $dbh->errstr; my $up = $sth->execute($res, $nt, $task{id}) or die $sth->errstr; die "bad upd: $up" unless $up == 1; } else { my $sth = $sth_update_bad ||= $dbh->prepare(qq{ UPDATE apiTasks SET lastStatus = ?, failCount = failCount + 1 WHERE id = ? }) or die $dbh->errstr; my $up = $sth->execute($res, $task{id}) or die $sth->errstr; die "bad upd: $up" unless $up == 1; } } } exit 0; sub do_task { my %param = @_; $param{dbh} ||= $dbh; my $res = eval { my $task = EVE::Task->new(%param); return $task->run(); }; if ($@) { chomp $@; printf "FAIL: %s\n", $@; return $@; } elsif ($res) { printf "OK: %s\n", $res; return $res; } else { die "WTF?\n"; } }