Coro-Amazon-SimpleDB
view release on metacpan or search on metacpan
lib/Coro/Amazon/SimpleDB.pm view on Meta::CPAN
package Amazon::SimpleDB::Client;
use common::sense;
use AnyEvent::HTTP;
use HTTP::Request;
use HTTP::Response;
# The only mention of a time-out in Amazon::SimpleDB::Client is in
# reference to a select operation. I'm using the value from there
# (5 seconds) as the default time-out for HTTP requests, as it
# seems reasonable. The setting is dynamic, but is used prior to
# putting HTTP request coros into wait state so it should do the
# expected thing if it's changed. Caveat emptor.
our $HTTP_REQUEST_TIMEOUT = 5;
# Replace the _httpPost method in Amazon::SimpleDB::Client to use
# an HTTP lib which does non-blocking requests better than
# Coro::LWP. This dangerously violates Amazon::SimpleDB::Client's
# encapsulation and has some code copied from the original
# _httpPost. There is a chance that changes to Amazon's module
# could break this.
lib/Coro/Amazon/SimpleDB.pm view on Meta::CPAN
body => join('&', map { $_ . '=' . $self->_urlencode($parameters->{$_}, 0) } keys %{$parameters}),
timeout => $HTTP_REQUEST_TIMEOUT,
headers => { 'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8' },
sub {
my ($body, $headers) = @_;
$response = HTTP::Response->new(@{$headers}{qw( Status Reason )});
$response->content($body);
$response->header($_, $headers->{$_})
for grep { !/[[:upper:]]/ } keys %{$headers};
};
# We need to put this coro to sleep until the response is returned.
while (not defined $response) { Coro::AnyEvent::sleep 0.1 }
return $response;
}
}
ADD_DISPATCH_HELPER_METHODS: {
# These methods are helpers so we can do method mapping via real
# dispatch. It would be nice if Amazon's library could do this
# dispatching for us.
lib/Coro/Amazon/SimpleDB.pm view on Meta::CPAN
my $debug = $self->DEBUG;
require Time::HiRes and Time::HiRes->import('time') if $debug;
my ($start, $duration) = (0, 0);
my @responses = ();
$self->bug("starting async enqueues");
$start = time() if $debug;
for ($[ .. $#requests) {
my $idx = $_;
my $request = $requests[$idx];
$self->bug("adding request $request");
my $coro = async {
my ($start, $duration) = (0, 0);
$self->bug("starting request for $request");
$start = time() if $debug;
$responses[$idx] = eval { $self->_process_request($request) };
# Store the exception instead of the response (which
# should be undef) if there was a problem.
$responses[$idx] = $@ if $@;
$duration = time() - $start if $debug;
$self->bug("completed request for $request in $duration secs");
};
$self->add_pending($coro);
$coro->on_destroy(sub { $self->remove_pending($coro) });
}
$duration = time() - $start if $debug;
$self->bug("completed async enqueues in $duration secs, starting coro polling");
$self->poll;
return \@responses;
}
sub async_get_items {
my ($self, @items) = @_;
my $responses = $self->async_requests(@items);
my %items = map {
lib/Coro/Amazon/SimpleDB.pm view on Meta::CPAN
requests passed as hash refs or objects.
=head2 sdb
The C<Amazon::SimpleDB::Client> object to forward requests through.
This is automatically created when first requested, but may also be
passed in manually.
=head2 pending
A hash ref of pending coros. This is used internally to poll for
completion of all asynchronous requests.
=head2 DEBUG
If set to a true value, the library will output some debugging and
timing information.
=head1 CAVEATS
lib/Coro/Amazon/SimpleDB.pm view on Meta::CPAN
http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1136
=head1 AUTHOR
Dave Trischuk, C<< <dtrischuk at cpan.org> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-coro-amazon-simpledb at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Coro-Amazon-SimpleDB>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Coro::Amazon::SimpleDB
( run in 0.504 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )