KiokuDB-Backend-DBI
view release on metacpan or search on metacpan
lib/KiokuDB/Backend/DBI.pm view on Meta::CPAN
my ($pk) = $rs->result_source->primary_columns;
my $keys = $rs_keys->{$rs_name};
my @objs = $rs->search({ $pk => $keys })->all;
return if @objs != @$ids;
# this key lookup is because it's not returned in the same order
my %pk_to_id;
@pk_to_id{@$keys} = @$ids;
foreach my $obj ( @objs ) {
my $id = $pk_to_id{$obj->id};
$entries{$id} = KiokuDB::Entry->new(
id => $id,
class => ref($obj),
data => $obj,
);
}
}
}
}
for ( @$special ) {
$entries{$_} = KiokuDB::Entry->new(
id => $_,
$_ eq 'dbic:schema'
? ( data => $self->schema,
class => "DBIx::Class::Schema" )
: ( data => undef,
class => "DBIx::Class::ResultSource" )
);
}
# ->rows only works after we're done
return if @rows_and_ids != keys %entries;
# case sensitivity differences, possibly?
return if any { !defined } @entries{@rows_and_ids};
map { ref($_) ? $_ : $self->deserialize($_) } @entries{@rows_and_ids};
}
sub delete {
my ( $self, @ids_or_entries ) = @_;
# FIXME special DBIC rows
my @ids = map { ref($_) ? $_->id : $_ } @ids_or_entries;
$self->dbh_do(sub {
my ( $storage, $dbh ) = @_;
my $g = $self->schema->txn_scope_guard;
my $batch_size = $self->batch_size || scalar(@ids);
my @ids_copy = @ids;
while ( my @batch_ids = splice @ids_copy, 0, $batch_size ) {
if ( $self->extract ) {
# FIXME rely on cascade delete?
my $sth = $dbh->prepare_cached("DELETE FROM gin_index WHERE id IN (" . join(", ", ('?') x @batch_ids) . ")");
$sth->execute(@batch_ids);
$sth->finish;
}
my $sth = $dbh->prepare_cached("DELETE FROM entries WHERE id IN (" . join(", ", ('?') x @batch_ids) . ")");
$sth->execute(@batch_ids);
$sth->finish;
}
$g->commit;
});
return;
}
sub exists {
my ( $self, @rows_and_ids ) = @_;
return unless @rows_and_ids;
my $schema = $self->schema;
my %entries;
my ( $rows, $ids, $special ) = $self->_part_rows_and_ids(\@rows_and_ids);
if ( @$ids ) {
$self->dbh_do(sub {
my ( $storage, $dbh ) = @_;
my $batch_size = $self->batch_size || scalar(@$ids);
my @ids_copy = @$ids;
while ( my @batch_ids = splice @ids_copy, 0, $batch_size ) {
my $sth = $self-> prepare_select ( $dbh, "SELECT id FROM entries WHERE id IN (" . join(", ", ('?') x @batch_ids) . ")");
$sth->execute(@batch_ids);
$sth->bind_columns( \( my $id ) );
$entries{$id} = 1 while $sth->fetch;
}
});
}
if ( @$rows ) {
my ( $rs_keys, $rs_ids ) = $self->_group_dbic_keys( $rows, sub {
my ( $id, $rs_name, @key ) = @_;
$entries{$id} = defined $schema->resultset($rs_name)->find(@key); # FIXME slow
});
foreach my $rs_name ( keys %$rs_keys ) {
my $rs = $schema->resultset($rs_name);
my $ids = $rs_ids->{$rs_name};
my $keys = $rs_keys->{$rs_name};
my ( $pk ) = $rs->result_source->primary_columns;
my @exists = $rs->search({ $pk => $keys })->get_column($pk)->all;
( run in 1.059 second using v1.01-cache-2.11-cpan-e1769b4cff6 )