KiokuDB-Backend-DBI
view release on metacpan or search on metacpan
lib/KiokuDB/Backend/DBI.pm view on Meta::CPAN
my $colinfo = $self->schema->source('entries')->columns_info;
my %rows = ( insert => $insert, update => $update );
foreach my $op (qw(insert update)) {
my $prepare = "prepare_$op";
my ( $sth, @cols ) = $self->$prepare($dbh);
my $i = 1;
foreach my $column_name (@cols) {
my $attributes = {};
if ( exists $colinfo->{$column_name} ) {
my $dt = $colinfo->{$column_name}{data_type};
$attributes = $self->storage->bind_attribute_by_data_type($dt);
}
$sth->bind_param_array( $i, $rows{$op}->{$column_name}, $attributes );
$i++;
}
$sth->execute_array({ArrayTupleStatus => []}) or die;
$sth->finish;
}
$_->insert_or_update for @$dbic;
});
$g->commit;
}
sub prepare_select {
my ( $self, $dbh, $stmt ) = @_;
$dbh->prepare_cached($stmt . ( $self->_for_update ? " FOR UPDATE" : "" ), {}, 3); # 3 = don't use if still Active
}
sub prepare_insert {
my ( $self, $dbh ) = @_;
my @cols = @{ $self->_ordered_columns };
my $ins = $dbh->prepare_cached("INSERT INTO entries (" . join(", ", @cols) . ") VALUES (" . join(", ", ('?') x @cols) . ")");
return ( $ins, @cols );
}
sub prepare_update {
my ( $self, $dbh ) = @_;
my ( $id, @cols ) = @{ $self->_ordered_columns };
my $upd = $dbh->prepare_cached("UPDATE entries SET " . join(", ", map { "$_ = ?" } @cols) . " WHERE $id = ?");
return ( $upd, @cols, $id );
}
sub update_index {
my ( $self, $entries ) = @_;
$self->dbh_do(sub {
my ( $storage, $dbh ) = @_;
my $i_sth = $dbh->prepare_cached("INSERT INTO gin_index (id, value) VALUES (?, ?)");
foreach my $id ( keys %$entries ) {
my $rv = $i_sth->execute_array(
{ArrayTupleStatus => []},
$id,
$entries->{$id},
);
}
$i_sth->finish;
});
}
sub _parse_dbic_key {
my ( $self, $key ) = @_;
@{ $self->json->decode(substr($key,length('dbic:row:'))) };
}
sub _part_rows_and_ids {
my ( $self, $rows_and_ids ) = @_;
my ( @rows, @ids, @special );
for ( @$rows_and_ids ) {
if ( /^dbic:schema/ ) {
push @special, $_;
} elsif ( /^dbic:row:/ ) {
push @rows, $_;
} else {
push @ids, $_;
}
}
return \( @rows, @ids, @special );
}
sub _group_dbic_keys {
my ( $self, $keys, $mkey_handler ) = @_;
my ( %keys, %ids );
foreach my $id ( @$keys ) {
my ( $rs_name, @key ) = $self->_parse_dbic_key($id);
if ( @key > 1 ) {
$mkey_handler->($id, $rs_name, @key);
} else {
# for other objects we queue up IDs for a single SELECT
push @{ $keys{$rs_name} ||= [] }, $key[0];
push @{ $ids{$rs_name} ||= [] }, $id;
}
}
( run in 1.209 second using v1.01-cache-2.11-cpan-bbe5e583499 )