Amazon-DynamoDB-Simple
view release on metacpan or search on metacpan
lib/Amazon/DynamoDB/Simple.pm view on Meta::CPAN
# sync from $dynamodb1 -> $dynamodb0
$self->_sync_items($dynamodb1 => $dynamodb0, $items1 => $items0);
}
sub _process_items {
my ($self, $items) = @_;
my $key = $self->primary_key;
my $definitions;
for my $item (@$items) {
my $primary_key = delete($item->{$key})->{S};
for my $attr (keys %$item) {
my $type_value = $item->{$attr};
my ($type) = keys %$type_value;
$definitions->{$primary_key}->{$attr} = $item->{$attr}->{$type};
}
$definitions->{$primary_key}->{$key} = $primary_key;
}
return $definitions;
}
sub _sync_items {
my ($self, $from_ddb, $to_ddb, $from_items, $to_items) = @_;
my $primary_key_name = $self->primary_key;
for my $from_key (keys %$from_items) {
my $from_value = $from_items->{$from_key};
my $to_value = $to_items->{$from_key};
if (!$to_value) {
$to_value = {last_updated => '1900-01-01T00:00:00'};
$to_items->{$from_key} = $to_value;
}
my $updated0 = $from_value->{last_updated};
my $updated1 = $to_value->{last_updated};
# don't need to sync if the items are the same age and not deleted
next if $updated0 eq $updated1 && !$to_value->{deleted};
# find the newest item
my $newest = $updated0 gt $updated1
? $from_value
: $to_value;
# sync newest item to the other region
if ($newest->{deleted}) {
$self->permanent_delete( $newest->{$primary_key_name} );
}
else {
# TODO: this could be more efficient by syncing to just the ddb
# that needs it
$self->put(%$newest);
}
# Lets say we are syncing from $dynamodb0 -> $dynamodb1. This prevents
# us from re syncing this item when we sync in the other direction from
# $dynamodb1 -> $dynamodb0
$to_value->{last_updated} = $from_value->{last_updated};
}
}
sub items {
my ($self) = @_;
my $human_items = {};
my $items = $self->scan->{Items};
my $primary_key_name = $self->primary_key;
# convert $items to something more human readable
for my $item (@$items) {
my $primary_key = delete($item->{$primary_key_name})->{S};
for my $attr (keys %$item) {
my $type_value = $item->{$attr};
my ($type) = keys %$type_value;
$human_items->{$primary_key}->{$attr} = $item->{$attr}->{$type};
}
# inflate json values
my $new_item = $human_items->{$primary_key};
my %inflated_item = $self->inflate(%$new_item);
$human_items->{$primary_key} = \%inflated_item;
delete $human_items->{$primary_key}
if $human_items->{$primary_key}->{deleted};
}
return %$human_items;
}
sub keys {
my ($self) = @_;
my %items = $self->items;
return keys %items;
}
1;
__END__
=head1 ACKNOWLEDGEMENTS
Thanks to L<DuckDuckGo|http://duckduckgo.com> for making this module possible by donating developer time.
=head1 LICENSE
Copyright (C) Eric Johnson.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 AUTHOR
Eric Johnson E<lt>eric.git@iijo.orgE<gt>
( run in 0.964 second using v1.01-cache-2.11-cpan-483215c6ad5 )