DBIx-DBO
view release on metacpan or search on metacpan
lib/DBIx/DBO/Row.pm view on Meta::CPAN
undef $$me->{array};
$$me->{hash} = \my %hash;
$$me->{DBO}{dbd_class}->_sql($me, $sql, @bind);
my $sth = $me->rdbh->prepare($sql);
return unless $sth and $sth->execute(@bind);
my $i;
my @array;
for ($me->columns) {
$i++;
$sth->bind_col($i, \$hash{$_}) unless exists $hash{$_};
}
$$me->{array} = $sth->fetch or return;
$sth->finish;
$me;
}
sub _detach {
my $me = $_[0];
if (exists $$me->{Parent}) {
$$me->{array} &&= \@{ $$me->{array} };
$$me->{hash} = \%{ $$me->{hash} };
for ($$me->{Parent}{Row}, @{ $$me->{Parent}{attached_rows} }) {
undef $_ if defined $_ and $_ == $me;
}
# Store needed build_data
$$me->{Tables} = [ @{$$me->{Parent}{Tables}} ];
$$me->{build_data}{from_sql} = $$me->{DBO}{dbd_class}->_build_from($$me->{Parent});
for my $f (qw(select From_Bind where order group)) {
$$me->{build_data}{$f} = $me->_copy($$me->{Parent}{build_data}{$f}) if exists $$me->{Parent}{build_data}{$f};
}
# Save config from Parent
if ($$me->{Parent}{Config} and %{$$me->{Parent}{Config}}) {
$$me->{Config} = { %{$$me->{Parent}{Config}}, $$me->{Config} ? %{$$me->{Config}} : () };
}
}
delete $$me->{Parent};
}
sub _copy {
my($me, $val) = @_;
return bless [$me, $val->[1]], 'DBIx::DBO::Column'
if _isa($val, 'DBIx::DBO::Column') and $val->[0] == $$me->{Parent};
ref $val eq 'ARRAY' ? [map $me->_copy($_), @$val] : ref $val eq 'HASH' ? {map $me->_copy($_), %$val} : $val;
}
=head3 C<update>
$row->update(id => 123);
$row->update(name => 'Bob', status => 'Employed');
Updates the current row with the new values specified.
Returns the number of rows updated or C<'0E0'> for no rows to ensure the value is true,
and returns false if there was an error.
Note: If C<LIMIT> is supported on C<UPDATE>s then only the first matching row will be updated
otherwise ALL rows matching the current row will be updated.
=cut
sub update {
my $me = shift;
croak "Can't update an empty row" unless $$me->{array};
my @update = $$me->{DBO}{dbd_class}->_parse_set($me, @_);
local $$me->{build_data} = $$me->{DBO}{dbd_class}->_build_data_matching_this_row($me);
$$me->{build_data}{limit} = ($me->config('LimitRowUpdate') and $me->tables == 1) ? [1] : undef;
my $sql = $$me->{DBO}{dbd_class}->_build_sql_update($me, @update);
my $rv = $$me->{DBO}{dbd_class}->_do($me, $sql, undef, $$me->{DBO}{dbd_class}->_bind_params_update($me));
$$me->{DBO}{dbd_class}->_reset_row_on_update($me, @update) if $rv and $rv > 0;
return $rv;
}
=head3 C<delete>
$row->delete;
Deletes the current row.
Returns the number of rows deleted or C<'0E0'> for no rows to ensure the value is true,
and returns false if there was an error.
The C<Row> object will then be empty.
Note: If C<LIMIT> is supported on C<DELETE>s then only the first matching row will be deleted
otherwise ALL rows matching the current row will be deleted.
=cut
sub delete {
my $me = shift;
croak "Can't delete an empty row" unless $$me->{array};
local $$me->{build_data} = $$me->{DBO}{dbd_class}->_build_data_matching_this_row($me);
$$me->{build_data}{limit} = ($me->config('LimitRowDelete') and $me->tables == 1) ? [1] : undef;
my $sql = $$me->{DBO}{dbd_class}->_build_sql_delete($me, @_);
undef $$me->{array};
$$me->{hash} = {};
$$me->{DBO}{dbd_class}->_do($me, $sql, undef, $$me->{DBO}{dbd_class}->_bind_params_delete($me));
}
=head3 C<is_empty>
return $row->{id} unless $row->is_empty;
Checks to see if it's an empty C<Row>, and returns true or false.
=cut
sub is_empty {
my $me = shift;
return not defined $$me->{array};
}
=head2 Common Methods
These methods are accessible from all DBIx::DBO* objects.
=head3 C<dbo>
The C<DBO> object.
=head3 C<dbh>
( run in 0.323 second using v1.01-cache-2.11-cpan-5b529ec07f3 )