The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use lib "$ENV{HOME}/hack/Data-ObjectDriver/lib";
use lib "$ENV{HOME}/hack/TheSchwartz/lib";
use lib "$ENV{HOME}/hack/gearman/api/perl/Gearman/lib";
use lib "$ENV{HOME}/cvs/Data-ObjectDriver/lib";
use lib "$ENV{HOME}/cvs/TheSchwartz/lib";
use lib "$ENV{HOME}/cvs/gearman/api/perl/Gearman/lib";

use Gearman::Worker;
use TheSchwartz;
use JSON::Any;

my $j = JSON::Any->new;

my $ts = TheSchwartz->new(databases => [{
    dsn => "dbi:mysql:database=t_sch_unnamed",
    user => "root",
    pass => "",
}]);

# FIXME: use embedded gearman server, and workers be child processes

my $worker = Gearman::Worker->new;
$worker->job_servers('127.0.0.1:7003');

$worker->register_function("insert_job" => handler(\&insert_job));
$worker->work while 1;

############################################################################

sub handler {
    my ($code) = @_;
    return sub {
	my $job = shift;
	my $arg = $job->arg;
	my $jreq = eval { $j->jsonToObj($job->arg) };
	unless ($jreq) {
	    die "not a valid JSON request";
	}
	return $code->($job, $jreq);
    };
}

sub insert_job {
    my ($job, $json) = @_;
    my $funcname = $json->{funcname} or die "No funcname";
    my $job = TheSchwartz::Job->new(
				    funcname => $json->{funcname},
				    arg      => $json->{arg},
				    uniqkey  => $json->{uniqkey},
				    coalesce => $json->{coalesce},
				    );
    my $h = $ts->insert($job) or
        die "insert_failure\n";
    return $h->as_string;
}