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;
}