Amazon-DynamoDB
view release on metacpan or search on metacpan
lib/Amazon/DynamoDB/20120810.pm view on Meta::CPAN
my $repeat = try_repeat {
# Since we're may be making more than one request in this repeat loop
# decrease our limit of results to scan in each call by the number
# of records remaining that the overall request wanted ot pull.
if (defined($args->{ResultLimit})) {
$payload->{Limit} = $args->{ResultLimit} - $records_seen;
}
my $req = $self->make_request(
target => $target,
payload => $payload,
);
$self->_process_request(
$req,
sub {
my $result = shift;
my $data = decode_json($result);
for my $entry (@{$data->{Items}}) {
$code->(_decode_item_attributes($entry));
}
$records_seen += scalar(@{$data->{Items}});
if ((defined($args->{ResultLimit}) && $records_seen >= $args->{ResultLimit})) {
$finished = 1;
}
if (!defined($data->{LastEvaluatedKey})) {
$finished = 1;
} else {
if (!$finished) {
$payload->{ExclusiveStartKey} = $data->{LastEvaluatedKey};
}
}
if (defined($data->{LastEvaluatedKey}) && $finished) {
$data->{LastEvaluatedKey} = _decode_item_attributes($data->{LastEvaluatedKey});
}
return $data;
})
->on_fail(sub {
$finished = 1;
});
} until => sub { $finished };
}
fun _encode_type_and_value(Any $v) {
my $type;
if (ref($v)) {
# An array maps to a sequence
if (ref($v) eq 'ARRAY') {
# Any refs mean we're sending binary data
# Start by guessing we have an array of numeric strings,
# but on the first value we encoutner that is either a reference
# or a variable that isn't an integer or numeric. Stop.
$type = 'NS';
foreach my $value (@$v) {
if (ref($value)) {
$type = 'BS';
last;
}
my $element_flags = B::svref_2object(\$value)->FLAGS;
if ($element_flags & (B::SVp_IOK | B::SVp_NOK)) {
next;
}
$type = 'SS';
last;
}
} else {
ref($v) eq 'SCALAR' || Carp::confess("Reference found but not a scalar");
$type = 'B';
}
} else {
my $flags = B::svref_2object(\$v)->FLAGS;
if ($flags & B::SVp_POK) {
$type = 'S';
} elsif ($flags & (B::SVp_IOK | B::SVp_NOK)) {
$type = 'N';
} else {
$type = 'S';
}
}
if ($type eq 'N' || $type eq 'S') {
defined($v) || Carp::confess("Attempt to encode undefined value");
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");
}
}
( run in 0.945 second using v1.01-cache-2.11-cpan-e1769b4cff6 )