Amazon-DynamoDB
view release on metacpan or search on metacpan
lib/Amazon/DynamoDB/20120810.pm view on Meta::CPAN
return ($type, "$v");
} elsif ($type eq 'B') {
return ($type, MIME::Base64::encode_base64(${$v}, ''));
} elsif ($type eq 'NS' || $type eq 'SS') {
return ($type, [map { "$_" } @$v]);
} elsif ($type eq 'BS') {
return ($type, [map { MIME::Base64::encode_base64(${$_}, '') } @$v]);
} else {
die("Unknown type for quoting and escaping: $type");
}
}
fun _decode_type_and_value(Str $type, Any $value) {
if ($type eq 'S' || $type eq 'SS') {
return $value;
} elsif ($type eq 'N') {
return 0+$value;
} elsif ($type eq 'B') {
return MIME::Base64::decode_base64($value);
} elsif ($type eq 'BS') {
return [map { MIME::Base64::decode_base64($_) } @$value];
} elsif ($type eq 'NS') {
return [map { 0+$_} @$value];
} else {
die("Don't know how to decode type: $type");
}
}
fun _decode_item_attributes(Maybe[HashRef] $item) {
my $r;
foreach my $key (keys %$item) {
my $type = (keys %{$item->{$key}})[0];
my $value = $item->{$key}->{$type};
$r->{$key} = _decode_type_and_value($type, $item->{$key}->{$type});
}
return $r;
}
method _process_request(HTTP::Request $req, CodeRef $done?) {
my $current_retry = 0;
my $do_retry = 1;
try_repeat {
$do_retry = 0;
my $sleep_amount = 0;
if ($current_retry > 0) {
$sleep_amount = (2 ** $current_retry * 50)/1000;
}
my $complete = sub {
$self->_request($req)->transform(
fail => sub {
my ($status, $resp, $req)= @_;
my $r;
if (defined($resp) && defined($resp->code)) {
if ($resp->code == 500) {
$do_retry = 1;
$current_retry++;
} elsif ($resp->code == 400) {
my $json = $resp->can('decoded_content')
? $resp->decoded_content
: $resp->body; # Mojo
$r = decode_json($json);
if ($r->{__type} =~ /ProvisionedThroughputExceededException$/) {
# Need to sleep
$do_retry = 1;
$current_retry++;
} else {
# extract the type into a better prettyier name.
if ($r->{__type} =~ /^com\.amazonaws\.dynamodb\.v20120810#(.+)$/) {
$r->{type} = $1;
}
}
}
}
if (defined($self->max_retries()) && $current_retry > $self->max_retries()) {
$do_retry = 0;
}
if (!$do_retry) {
if ($self->debug_failures()) {
print "DynamoDB Failure: $status\n";
if (defined($resp)) {
print "response:\n";
print $resp->as_string() . "\n";
}
if (defined($req)) {
print "Request:\n";
print $req->as_string() . "\n";
}
}
return $r || $status;
}
},
done => $done);
};
if ($sleep_amount > 0) {
$self->{implementation}->delay($sleep_amount)->then($complete);
} else {
$complete->();
}
} until => sub { !$do_retry };
}
my $encode_key = sub {
my $source = shift;
my $r;
foreach my $k (keys %$source) {
my $v = $source->{$k};
# There is no sense in encoding undefined values or values that
# are the empty string.
if (defined($v) && $v ne '') {
# Reference $source->{$k} since the earlier test may cause
# the value to be stringified.
$r->{$k} = { _encode_type_and_value($source->{$k}) };
}
}
( run in 1.586 second using v1.01-cache-2.11-cpan-995e09ba956 )