Class-DBI-Frozen-301
view release on metacpan or search on metacpan
lib/Class/DBI/Frozen/301.pm view on Meta::CPAN
my $self = shift;
return $self->create($self->_data_hash(@_));
}
#----------------------------------------------------------------------
# CONSTRUCT
#----------------------------------------------------------------------
sub construct {
my ($proto, $data) = @_;
my $class = ref $proto || $proto;
my $self = $class->_init($data);
$self->call_trigger('select');
return $self;
}
sub move {
my ($class, $old_obj, @data) = @_;
$class->_carp("move() is deprecated. If you really need it, "
. "you should tell me quickly so I can abandon my plan to remove it.");
return $old_obj->_croak("Can't move to an unrelated class")
unless $class->isa(ref $old_obj)
or $old_obj->isa($class);
return $class->create($old_obj->_data_hash(@data));
}
sub delete {
my $self = shift;
return $self->_search_delete(@_) if not ref $self;
$self->call_trigger('before_delete');
eval { $self->sql_DeleteMe->execute($self->id) };
if ($@) {
return $self->_croak("Can't delete $self: $@", err => $@);
}
$self->call_trigger('after_delete');
undef %$self;
bless $self, 'Class::DBI::Object::Has::Been::Deleted';
return 1;
}
sub _search_delete {
my ($class, @args) = @_;
$class->_carp(
"Delete as class method is deprecated. Use search and delete_all instead."
);
my $it = $class->search_like(@args);
while (my $obj = $it->next) { $obj->delete }
return 1;
}
# Return the placeholder to be used in UPDATE and INSERT queries.
# Overriding this is deprecated in favour of
# __PACKAGE__->find_column('entered')->placeholder('IF(1, CURDATE(), ?));
sub _column_placeholder {
my ($self, $column) = @_;
return $self->find_column($column)->placeholder;
}
sub update {
my $self = shift;
my $class = ref($self)
or return $self->_croak("Can't call update as a class method");
$self->call_trigger('before_update');
return 1 unless my @changed_cols = $self->is_changed;
$self->call_trigger('deflate_for_update');
my @primary_columns = $self->primary_columns;
my $sth = $self->sql_update($self->_update_line);
$class->_bind_param($sth, \@changed_cols);
my $rows = eval { $sth->execute($self->_update_vals, $self->id); };
return $self->_croak("Can't update $self: $@", err => $@) if $@;
# enable this once new fixed DBD::SQLite is released:
if (0 and $rows != 1) { # should always only update one row
$self->_croak("Can't update $self: row not found") if $rows == 0;
$self->_croak("Can't update $self: updated more than one row");
}
$self->call_trigger('after_update', discard_columns => \@changed_cols);
# delete columns that changed (in case adding to DB modifies them again)
$self->_attribute_delete(@changed_cols);
delete $self->{__Changed};
return 1;
}
sub _update_line {
my $self = shift;
join(', ', map "$_ = " . $self->_column_placeholder($_), $self->is_changed);
}
sub _update_vals {
my $self = shift;
$self->_attrs($self->is_changed);
}
sub DESTROY {
my ($self) = shift;
if (my @changed = $self->is_changed) {
my $class = ref $self;
$self->_carp("$class $self destroyed without saving changes to "
. join(', ', @changed));
}
}
sub discard_changes {
my $self = shift;
return $self->_croak("Can't discard_changes while autoupdate is on")
if $self->autoupdate;
$self->_attribute_delete($self->is_changed);
delete $self->{__Changed};
return 1;
}
# We override the get() method from Class::Accessor to fetch the data for
# the column (and associated) columns from the database, using the _flesh()
# method. We also allow get to be called with a list of keys, instead of
# just one.
( run in 1.084 second using v1.01-cache-2.11-cpan-13bb782fe5a )