Coro-Amazon-SimpleDB
view release on metacpan or search on metacpan
lib/Coro/Amazon/SimpleDB.pm view on Meta::CPAN
package Coro::Amazon::SimpleDB;
use common::sense;
$Coro::Amazon::SimpleDB::VERSION = 0.04;
use EV;
use AnyEvent;
use Coro;
use Coro::AnyEvent;
use Carp qw(croak carp);
use Scalar::Util qw(blessed);
use List::Util qw(first);
use Amazon::SimpleDB::Client;
use Amazon::SimpleDB::Model::BatchPutAttributesRequest;
use Amazon::SimpleDB::Model::CreateDomainRequest;
use Amazon::SimpleDB::Model::DeleteAttributesRequest;
use Amazon::SimpleDB::Model::DeleteDomainRequest;
use Amazon::SimpleDB::Model::DomainMetadataRequest;
use Amazon::SimpleDB::Model::GetAttributesRequest;
use Amazon::SimpleDB::Model::ListDomainsRequest;
use Amazon::SimpleDB::Model::PutAttributesRequest;
use Amazon::SimpleDB::Model::SelectRequest;
use Moose;
has 'aws_access_key' => (is => 'rw');
has 'aws_secret_access_key' => (is => 'rw');
has 'domain_name' => (is => 'rw');
has 'sdb' => (is => 'ro', lazy_build => 1);
has 'pending' => (is => 'ro', default => sub { {} });
has 'DEBUG' => (is => 'rw', default => !1);
no Moose;
REPLACE_AMAZON_SIMPLEDB_CLIENT_HTTPPOST: {
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.
no warnings 'redefine';
sub _httpPost {
my ($self, $parameters) = @_;
my $response = undef;
http_request
POST => $self->{_config}{ServiceURL},
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.
sub Amazon::SimpleDB::Model::BatchPutAttributesRequest::client_request_method { 'batchPutAttributes' }
sub Amazon::SimpleDB::Model::CreateDomainRequest::client_request_method { 'createDomain' }
sub Amazon::SimpleDB::Model::DeleteAttributesRequest::client_request_method { 'deleteAttributes' }
sub Amazon::SimpleDB::Model::DeleteDomainRequest::client_request_method { 'deleteDomain' }
sub Amazon::SimpleDB::Model::DomainMetadataRequest::client_request_method { 'domainMetadata' }
sub Amazon::SimpleDB::Model::GetAttributesRequest::client_request_method { 'getAttributes' }
sub Amazon::SimpleDB::Model::ListDomainsRequest::client_request_method { 'listDomains' }
sub Amazon::SimpleDB::Model::PutAttributesRequest::client_request_method { 'putAttributes' }
sub Amazon::SimpleDB::Model::SelectRequest::client_request_method { 'select' }
}
# Debugging methods.
( run in 1.282 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )