Amazon-DynamoDB
view release on metacpan or search on metacpan
lib/Amazon/DynamoDB/20120810.pm view on Meta::CPAN
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}) };
}
}
return $r;
};
fun _encode_attribute_value_list(Any $value_list, Str $compare_op) {
if ($compare_op =~ /^(EQ|NE|LE|LT|GE|GT|CONTAINS|NOT_CONTAINS|BEGINS_WITH)$/) {
defined($value_list) || Carp::confess("No defined value for comparison operator: $compare_op");
$value_list = [ { _encode_type_and_value($value_list) } ];
} elsif ($compare_op eq 'IN') {
if (!ref($value_list)) {
$value_list = [$value_list];
}
$value_list = [ map { { _encode_type_and_value($_) } } @$value_list];
} elsif ($compare_op eq 'BETWEEN') {
ref($value_list) eq 'ARRAY' || Carp::confess("Use of BETWEEN comparison operator requires an array");
scalar(@$value_list) == 2 || Carp::confess("BETWEEN comparison operator requires two values");
$value_list = [ map { { _encode_type_and_value($_) } } @$value_list];
}
return $value_list;
}
my $encode_filter = sub {
my $source = shift;
my $r;
foreach my $field_name (keys %$source) {
my $f = $source->{$field_name};
my $compare_op = $f->{ComparisonOperator} // 'EQ';
$compare_op =~ /^(EQ|NE|LE|LT|GE|GT|NOT_NULL|NULL|CONTAINS|NOT_CONTAINS|BEGINS_WITH|IN|BETWEEN)$/
|| Carp::confess("Unknown comparison operator specified: $compare_op");
$r->{$field_name} = {
ComparisonOperator => $compare_op,
(defined($f->{AttributeValueList}) ? (AttributeValueList => _encode_attribute_value_list($f->{AttributeValueList}, $compare_op)) : ())
};
}
return $r;
};
my $parameter_type_definitions = {
AttributesToGet => {},
AttributeUpdates => {
encode => sub {
my $source = shift;
my $r;
ref($source) eq 'HASH' || Carp::confess("Attribute updates is not a hash ref");
foreach my $k (keys %$source) {
my $op = $source->{$k};
ref($op) eq 'HASH' || Carp::confess("AttributeUpdate for field $k is not a hash ref:" . Data::Dumper->Dump([$op]));
$r->{$k} = {
(defined($op->{Action}) ? (Action => $op->{Action}) : ()),
(defined($op->{Value}) ? (Value => { _encode_type_and_value($op->{Value}) }) : ()),
};
}
return $r;
}
},
# should be a boolean
ConsistentRead => {},
ConditionalOperator => {},
ConditionExpression => {},
ExclusiveStartKey => {
encode => $encode_key,
},
ExclusiveStartTableName => {},
ExpressionAttributeNames => {},
ExpressionAttributeValues => {
encode => sub {
my $source = shift;
my $r;
foreach my $key (grep { defined($source->{$_}) } keys %$source) {
$r->{$key} = { _encode_type_and_value($source->{$key}) };
}
return $r;
}
},
Expected => {
encode => sub {
my $source = shift;
my $r;
foreach my $key (keys %$source) {
my $info = $source->{$key};
if (defined($info->{AttributeValueList}) ) {
$r->{$key}->{AttributeValueList} = _encode_attribute_value_list($info->{AttributeValueList}, $info->{ComparisonOperator});
}
if (defined($info->{Exists})) {
$r->{$key}->{Exists} = $info->{Exists};
}
if (defined($info->{ComparisonOperator})) {
$r->{$key}->{ComparisonOperator} = $info->{ComparisonOperator};
}
if (defined($info->{Value})) {
$r->{$key}->{Value} = { _encode_type_and_value($info->{Value}) };
}
}
return $r;
},
},
FilterExpression => {},
IndexName => {},
Item => {
encode => $encode_key,
},
Key => {
encode => $encode_key,
lib/Amazon/DynamoDB/20120810.pm view on Meta::CPAN
# Build a parameter hash from all of the standardized parameters.
sub _make_payload {
my $args = shift;
my @field_names = @_;
if (scalar(@field_names) == 0) {
@field_names = keys %$args;
}
my %r;
foreach my $field_name (@field_names) {
my $value = $args->{$field_name};
if (!defined($value)) {
next;
}
my $def = $parameter_type_definitions->{$field_name} || Carp::confess("Unknown parameter type: $field_name");
if (defined($value)) {
if ($def->{type_check} && $def->{type_check} eq 'integer') {
$value =~ /^\d+$/ || Carp::confess("$field_name is specified to be an integer but the value is not an integer: $value");
$value = int($value);
}
}
if (defined($def->{encode})) {
$value = $def->{encode}->($value);
}
if (defined($value)) {
$r{$field_name} = $value;
}
}
return \%r;
}
fun _decode_single_item_change_response(Str $response) {
my $r = decode_json($response);
if (defined($r->{Attributes})) {
$r->{Attributes} = _decode_item_attributes($r->{Attributes});
}
if (defined($r->{ItemCollectionMetrics})) {
foreach my $key (keys %{$r->{ItemCollectionMetrics}}) {
foreach my $key_part (keys %{$r->{ItemCollectionMetrics}->{$key}}) {
$r->{ItemCollectionMetrics}->{$key}->{$key_part} = _decode_item_attributes($r->{ItemCollectionMetrics}->{$key})
}
}
}
return $r;
}
fun _create_key_schema(ArrayRef $source, HashRef $known_fields) {
defined($source) || die("No source passed to create_key_schema");
defined($known_fields) || die("No known fields passed to create_key_schmea");
my @r;
foreach my $field_name (@$source) {
defined($known_fields->{$field_name}) || Carp::confess("Unknown field specified '$field_name' in schema, must be defined in fields. schema:" . Data::Dumper->Dump([$source]));
push @r, {
AttributeName => $field_name,
KeyType => (scalar(@r) ? 'RANGE' : 'HASH')
};
}
return \@r;
};
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Amazon::DynamoDB::20120810
=head1 VERSION
version 0.35
=head1 DESCRIPTION
=head2 new
Instantiates the API object.
Expects the following named parameters:
=over 4
=item * implementation - the object which provides a Future-returning C<request> method,
see L<Amazon::DynamoDB::NaHTTP> for example.
=item * host - the host (IP or hostname) to communicate with
=item * port - the port to use for HTTP(S) requests
=item * ssl - true for HTTPS, false for HTTP
=item * algorithm - which signing algorithm to use, default AWS4-HMAC-SHA256
=item * scope - the scope for requests, typically C<region/host/aws4_request>
=item * access_key - the access key for signing requests
=item * secret_key - the secret key for signing requests
=item * debug_failures - print errors if they occur
=item * max_retries - maximum number of retries for a request
=back
=head2 create_table
( run in 3.346 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )