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 131 132 133 134 135 136 137 138 139 140 141 142 143
|
package Catmandu::Store::Multi;
use Catmandu::Sane;
our $VERSION = '1.2024';
use Catmandu::Util qw(:is);
use Hash::Util::FieldHash qw(fieldhash);
use Catmandu::Store::Multi::Bag;
use Moo;
use namespace::clean;
with 'Catmandu::Store';
with 'Catmandu::Droppable';
has stores => (
is => 'ro',
required => 1,
default => sub {[]},
coerce => sub {
my $stores = $_[0];
return [
map {
if (is_string($_)) {
Catmandu->store($_);
}
else {
$_;
}
} @$stores
];
},
);
sub drop {
my ($self) = @_;
for my $store (@{$self->stores}) {
$store->drop;
}
}
1;
__END__
=pod
=head1 NAME
Catmandu::Store::Multi - A store that adds data to multiple stores
=head1 SYNOPSIS
# On the Command line
# Configure the Multi store with a catmandu.yml file
$ cat catmandu.yml
---
store:
metadata1:
package: DBI
options:
data_source: "DBI:mysql:database=catmandu"
metadata2:
package: ElasticSearch
options:
client: '1_0::Direct'
index_name: catmandu
multi:
package: Multi
options:
stores:
- metadata1
- metadata2
...
# Add a YAML record to the multi store
$ catmandu import YAML to multi < data.yml
# Extract all the records from the multi store as YAML
$ catmandu export multi to YAML > data.yml
# In Perl
use Catmandu;
my $store = Catmandu->store('Multi' , stores [
Catmandu->store('DBI', data_source => 'DBI:mysql:database=catmandu') ,
Catmandu->store('ElasticSearch', client => '1_0::Direct', index_name => 'catmandu') ,
]);
$store->bag->each(sub {
my $item = shift;
printf "%s\n" , $item->{_id};
});
$store->bag->add({ _id => 1234 , foo => 'bar' , test => [qw(1 2 3 4)]});
my $item = $store->bag->get('1234');
$store->bag->delete('1234');
=head1 DESCRIPTION
The L<Catmandu::Store::Multi> is a combination of many L<Catmandu::Store>-s
as one access point. The Multi store inherits all the methods
from L<Catmandu::Store>.
By default, the Multi store tries to update records in all configured backend
stores. Importing, exporting, delete and drop will be executed against
all backend stores when possible.
=head1 METHODS
=head2 new(stores => [...])
Create a new Catmandu::Store::Multi.The C<store> configuration parameter
contains an array of references to L<Catmandu::Store>-s based on their name in
a configuration file or instances.
=head1 INHERITED METHODS
This Catmandu::Store implements:
=over 3
=item L<Catmandu::Store>
=item L<Catmandu::Droppable>
=back
Each Catmandu::Bag in this Catmandu::Store implements:
=over 3
=item L<Catmandu::Bag>
=item L<Catmandu::Droppable>
=back
=cut
|