1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
package Catmandu::Store::Multi::Bag;
use Catmandu::Sane;
our $VERSION = '1.2024';
use Moo;
use Hash::Merge::Simple qw(merge);
use namespace::clean;
with 'Catmandu::Bag';
with 'Catmandu::Droppable';
sub generator {
my ($self) = @_;
# Loop of all stores and find the first one that implements the bag
# and can create a generator
my $gen;
for my $store (@{$self->store->stores}) {
my $bag = $store->bag($self->name);
$gen = $bag ? $bag->generator : undef;
last if defined($gen);
}
return undef unless $gen;
sub {
my $item = $gen->();
return undef unless $item;
return $item;
};
}
sub get {
my ($self, $id) = @_;
# Loop over all the bags and merge the results of the records found
# Required in case of Store/FileStore combinations where each part
# can contain different metadata
my $found = 0;
my $result = {};
for my $store (@{$self->store->stores}) {
my $bag = $store->bag($self->name);
my $item = $bag ? $bag->get($id) : undef;
if ($item) {
$found = 1;
$result = merge $result, $item;
}
}
return $found ? $result : undef;
}
sub add {
my ($self, $data) = @_;
# By default try to add the data to all the stores
for my $store (@{$self->store->stores}) {
my $bag = $store->bag($self->name);
$bag->add($data) if $bag;
}
1;
}
sub delete {
my ($self, $id) = @_;
# By default try to delete the data from all the stores
for my $store (@{$self->store->stores}) {
my $bag = $store->bag($self->name);
$bag->delete($id) if $bag;
}
1;
}
sub delete_all {
my ($self) = @_;
# By default try to drop the data from all the stores
for my $store (@{$self->store->stores}) {
my $bag = $store->bag($self->name);
$bag->delete_all if $bag;
}
1;
}
sub drop {
my ($self) = @_;
# By default try to delete the data from all the stores
for my $store (@{$self->store->stores}) {
my $bag = $store->bag($self->name);
$bag->drop if $bag && $bag->does('Catmandu::Droppable');
}
1;
}
sub commit {
my ($self) = @_;
# By default try to commit the data to all the stores
for my $store (@{$self->store->stores}) {
my $bag = $store->bag($self->name);
$bag->commit if $bag;
}
1;
}
1;
__END__
=pod
=head1 NAME
Catmandu::Store::Multi::Bag - Bag implementation for the Multi store
=cut
|