DBIx-Skinny

 view release on metacpan or  search on metacpan

lib/DBIx/Skinny/Row.pm  view on Meta::CPAN

    unless ( $col ) {
        Carp::croak('please specify $col for first argument');
    }

    my $data = exists $self->{row_data}->{$col} ? $self->{row_data}->{$col} : Carp::croak("$col no selected column. SQL: " . ($self->{sql}||'unknown'));

    return $self->{skinny}->schema->utf8_on($col, $data);
}

sub get_columns {
    my $self = shift;

    my %data;
    for my $col ( @{$self->{select_columns}} ) {
        $data{$col} = $self->get_column($col);
    }
    return \%data;
}

sub set_column {
    my ($self, $col, $val) = @_;

    if (ref($val) eq 'SCALAR') {
        $self->{_untrusted_row_data}->{$col} = 1;
    } else {
        $self->{row_data}->{$col} = $self->{skinny}->schema->call_deflate($col, $val);
        $self->{_get_column_cached}->{$col} = $val;
        $self->{_dirty_columns}->{$col} = 1;
    }
}

sub set_columns {
    my ($self, $args) = @_;

    for my $col (keys %$args) {
        $self->set_column($col, $args->{$col});
    }
}

sub set {
    my $self = shift;
    Carp::carp( "set method has been deprecated. Please use set_columns or set_column method instead" );
    $self->set_columns(@_);
}

sub get_dirty_columns {
    my $self = shift;

    my %rows = map {$_ => $self->{_get_column_cached}->{$_}}
               keys %{$self->{_dirty_columns}};

    return \%rows;
}

sub insert {
    my $self = shift;

    $self->{skinny}->find_or_create($self->{opt_table_info}, $self->get_columns);
}

sub update {
    my ($self, $args, $table) = @_;

    $table ||= $self->{opt_table_info};
    my $upd = $self->get_dirty_columns;
    map {$upd->{$_} = $args->{$_}} keys %$args;

    return 0 unless %$upd;

    my $result = $self->{skinny}->update($table, $upd, $self->_where_cond($table));
    $self->set_columns($upd);
    $self->{_dirty_columns} = {};

    return $result;
}

sub delete {
    my ($self, $table) = @_;

    $table ||= $self->{opt_table_info};
    $self->{skinny}->delete($table, $self->_where_cond($table));
}

sub refetch {
    my ($self, $table) = @_;
    $table ||= $self->{opt_table_info};
    $self->{skinny}->single($table, $self->_where_cond($table));
}

sub _where_cond {
    my ($self, $table) = @_;

    unless ($table) {
        Carp::croak "no table info";
    }

    my $schema_info = $self->{skinny}->schema->schema_info;
    unless ( $schema_info->{$table} ) {
        Carp::croak "unknown table: $table";
    }

    # get target table pk
    my $pk = $schema_info->{$table}->{pk};
    unless ($pk) {
        Carp::croak "$table have no pk.";
    }

    # multi primary keys
    if ( ref $pk eq 'ARRAY' ) {
        my %pks = map { $_ => 1 } @$pk;

        unless ( ( grep { exists $pks{ $_ } } @{$self->{select_columns}} ) == @$pk ) {
            Carp::croak "can't get primary columns in your query.";
        }

        return +{ map { $_ => $self->$_() } @$pk };
    } else {
        unless (grep { $pk eq $_ } @{$self->{select_columns}}) {
            Carp::croak "can't get primary column in your query.";
        }



( run in 2.412 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )