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 )