my ($self) = @_;
return $self if $self->in_storage;
#use Data::Dumper; warn Dumper($self);
- my %in;
- $in{$_} = $self->get_column($_)
- for grep { defined $self->get_column($_) } $self->columns;
- my %out = %{ $self->storage->insert($self->_table_name, \%in) };
- $self->store_column($_, $out{$_})
- for grep { $self->get_column($_) ne $out{$_} } keys %out;
+ $self->storage->insert($self->_table_name, { $self->get_columns });
$self->in_storage(1);
$self->{_dirty_columns} = {};
return $self;
sub update {
my ($self, $upd) = @_;
$self->throw( "Not in database" ) unless $self->in_storage;
- my %to_update;
- $to_update{$_} = $self->get_column($_) for $self->is_changed;
+ my %to_update = $self->get_dirty_columns;
return -1 unless keys %to_update;
my $rows = $self->storage->update($self->_table_name, \%to_update,
$self->ident_condition);
sub get_column {
my ($self, $column) = @_;
$self->throw( "Can't fetch data as class method" ) unless ref $self;
- $self->throw( "No such column '${column}'" ) unless $self->has_column($column);
return $self->{_column_data}{$column}
if exists $self->{_column_data}{$column};
+ $self->throw( "No such column '${column}'" ) unless $self->has_column($column);
return undef;
}
sub get_columns {
my $self = shift;
- return map { $_ => $self->get_column($_) } $self->columns;
+ return return %{$self->{_column_data}};
+}
+
+=head2 get_dirty_columns
+
+ my %data = $obj->get_dirty_columns;
+
+Identical to get_columns but only returns those that have been changed.
+
+=cut
+
+sub get_dirty_columns {
+ my $self = shift;
+ return map { $_ => $self->{_column_data}{$_} }
+ keys %{$self->{_dirty_columns}};
}
=head2 set_column
sub store_column {
my ($self, $column, $value) = @_;
$self->throw( "No such column '${column}'" )
- unless $self->has_column($column);
+ unless exists $self->{_column_data}{$column} || $self->has_column($column);
$self->throw( "set_column called for ${column} without value" )
if @_ < 3;
return $self->{_column_data}{$column} = $value;