DBIx-CouchLike
view release on metacpan or search on metacpan
lib/DBIx/CouchLike.pm view on Meta::CPAN
. " for using limit/offset"
);
}
sub _select_all {
my $self = shift;
my $sub = shift;
my $sth = $self->prepare_sql(q{SELECT id, value FROM _DATA_});
$sth->execute();
while ( my $r = $sth->fetchrow_arrayref ) {
next if $r->[0] =~ qr{^_design/};
my $id = $r->[0];
my $value_ref = $self->from_json($r->[1]);
$value_ref->{_id} = $id;
$sub->( $id, $value_ref ) if $sub;
}
}
sub create_view {
my $self = shift;
my $design_val = shift;
my $dbh = $self->dbh;
my $design_id = delete $design_val->{_id};
my ($part, @value) = $self->_start_with( design_id => $design_id );
my $del_sth = $self->prepare_sql(
q{DELETE FROM _MAP_ WHERE } . $part
);
$del_sth->execute(@value);
$design_val->{_id} = $design_id;
my $views = $design_val->{views} or return 1;
my $index_sth = $self->prepare_sql(
q{INSERT INTO _MAP_ (design_id, id, key, value) VALUES (?,?,?,?)}
);
VIEW:
for my $name ( keys %$views ) {
my $code = $views->{$name}->{map} or next VIEW;
my $sub = eval $code; ## no critic
if ($@) {
warn $@;
next VIEW;
}
$self->_select_all(
sub {
$self->_data_to_map({
sub => $sub,
id => $_[0],
data_val => $_[1],
sth => $index_sth,
design_id => "$design_id/$name",
});
}
);
}
return 1;
}
sub update_views {
my $self = shift;
my $dbh = $self->dbh;
my $views = shift || [];
my @views = @$views;
my @data_val;
my @id;
for my $data_val (@_) {
if ( $data_val->{_id} =~ qr{^_design/} ) {
$self->create_view( $data_val );
}
else {
push @data_val, $data_val;
push @id, $data_val->{_id};
}
}
return 1 unless @data_val;
my $pf = join(",", map {"?"} @id);
my $df = @views ? join(",", map {"?"} @views) : "";
if (@views) {
my $del_sql = qq{DELETE FROM _MAP_ WHERE id IN ($pf)};
my @value;
my @cond;
for my $v (@views) {
my ($part, @v) = $self->_start_with( design_id => $v );
push @cond, $part;
push @value, @v;
}
$del_sql .= " AND (" . join(" OR ", @cond). ")";
$self->prepare_sql($del_sql)
->execute(@id, @value);
}
else {
$self->prepare_sql(qq{DELETE FROM _MAP_ WHERE id IN ($pf)})
->execute(@id);
}
my $index_sth = $self->prepare_sql(
q{INSERT INTO _MAP_ (design_id, id, key, value) VALUES (?,?,?,?)}
);
my $sth;
if (@views) {
$sth = $self->prepare_sql(
qq{SELECT id, value FROM _DATA_ WHERE id IN($df)}
);
$sth->execute(@views);
}
else {
my ($part, @value) = $self->_start_with( id => '_design/' );
$sth = $self->prepare_sql(
q{SELECT id, value FROM _DATA_ WHERE } . $part
);
$sth->execute(@value);
}
DESIGN:
while ( my $r = $sth->fetchrow_arrayref ) {
( run in 0.552 second using v1.01-cache-2.11-cpan-4ef0a570458 )