Catmandu-Adlib

 view release on metacpan or  search on metacpan

lib/Catmandu/Store/Adlib/Bag.pm  view on Meta::CPAN

        username => $self->store->username,
        password => $self->store->password,
        endpoint => $self->store->endpoint,
        database => $self->store->database
    );
}


sub generator {
    # TODO: OAI
    my $self = shift;
    my $stack = $self->api->list()->{'adlibJSON'}->{'recordList'}->{'record'};
    # TODO: PAGING
    return sub {
        my $item = pop @{$stack};
        my $priref = $self->api->get_priref($item);
        return $self->api->get_by_priref($priref);
    };
}

sub each {
    my ($self, $sub) = @_;
    my $n = 0;
    my $list = $self->api->list();
    my $stack = $list->{'adlibJSON'}->{'recordList'}->{'record'};
    my $start = $list->{'adlibJSON'}->{'diagnostic'}->{'first_item'};
    my $hits = $list->{'adlibJSON'}->{'diagnostic'}->{'hits'};
    my $limit = $list->{'adlibJSON'}->{'diagnostic'}->{'limit'};
    my $new_start;
    while (my $item = pop @{$stack}) {
        if (scalar @{$stack} == 0) {
            # Stack is empty; add the next page
            $new_start = $start + $limit;
            if ($new_start <= $hits) {
                $list = $self->api->list($new_start);
                $stack = $list->{'adlibJSON'}->{'recordList'}->{'record'};
                $start = $list->{'adlibJSON'}->{'diagnostic'}->{'first_item'};
                $limit = $list->{'adlibJSON'}->{'diagnostic'}->{'limit'};
            }
        }
        my $priref = $self->api->get_priref($item);
        # Spare the API a bit
        sleep(int(rand(2)));
        my $full_item = $self->api->get_by_priref($priref);
        $sub->($full_item);
        $n++;
    }
    return $n;
}

sub get {
    my ($self, $id) = @_;
    return $self->api->get_by_priref($id);
}

sub add {
    my ($self, $data) = @_;
    return $self->api->add($data);
}

sub update {
    my ($self, $id, $data) = @_;
    return $self->api->update($id, $data);
}

sub delete {
    my ($self, $id) = @_;
    return $self->api->delete($id);
}

sub delete_all {
    my $self = shift;
    Catmandu::NotImplemented->throw(
        message => 'Deleting items from store not supported.'
    );
}
1;
__END__



( run in 0.975 second using v1.01-cache-2.11-cpan-39bf76dae61 )