Fey-ORM
view release on metacpan or search on metacpan
lib/Fey/Object/Table.pm view on Meta::CPAN
my $sth = shift;
my $vals = shift;
my $attr = shift;
if ( @{$attr} ) {
## no critic (ControlStructures::ProhibitCStyleForLoops)
for ( my $i = 0; $i < @{$vals}; $i++ ) {
$sth->bind_param( $i + 1, $vals->[$i], $attr->[$i] );
}
## use critic
return $sth->execute();
}
else {
return $sth->execute( @{$vals} );
}
}
sub _deflated_value {
my $self = shift;
my $name = shift;
my $val = @_ ? shift : $self->$name();
my $meth = $self->meta()->deflator_for($name);
return $meth ? $self->$meth($val) : $val;
}
sub _insert_for_data {
my $class = shift;
my $data = shift;
my $insert = $class->SchemaClass()->SQLFactoryClass()->new_insert();
my $table = $class->Table();
$insert->into( $table->columns( sort keys %{$data} ) );
my $ph = Fey::Placeholder->new();
my @vals = (
map {
$_ => (
defined $data->{$_}
&& blessed $data->{$_}
&& $data->{$_}->can('does')
&& ( $data->{$_}->does('Fey::Role::IsLiteral')
|| $data->{$_}->does('Fey::Role::SQL::ReturnsData') )
? $data->{$_}
: $ph
)
}
sort keys %{$data}
);
$insert->values(@vals);
return $insert;
}
sub update {
my $self = shift;
my %p = @_;
my $update = $self->SchemaClass()->SQLFactoryClass()->new_update();
my $table = $self->Table();
$update->update($table);
$update->set(
map { $table->column($_) => $self->_deflated_value( $_, $p{$_} ) }
sort keys %p
);
for my $col ( @{ $table->primary_key() } ) {
my $name = $col->name();
$update->where( $col, '=', $self->_deflated_value($name) );
}
my $dbh = $self->_dbh($update);
my $sth = $dbh->prepare( $self->_sql_string( $update, $dbh ) );
my @attr = $self->_bind_attributes_for(
$dbh,
(
sort keys %p,
map { $_->name() } @{ $table->primary_key() }
),
);
$self->_sth_execute( $sth, [ $update->bind_params() ], \@attr );
for my $k ( sort keys %p ) {
if ( ref $p{$k} ) {
my $clear = q{_clear_} . $k;
$self->$clear();
}
else {
my $set_meth = q{_set_} . $k;
$self->$set_meth( $p{$k} );
}
}
return;
}
## no critic (Subroutines::ProhibitBuiltinHomonyms)
sub delete {
my $self = shift;
my $delete = $self->SchemaClass()->SQLFactoryClass()->new_delete();
my $table = $self->Table();
$delete->from($table);
for my $col ( @{ $table->primary_key() } ) {
my $name = $col->name();
( run in 0.661 second using v1.01-cache-2.11-cpan-39bf76dae61 )