DBI-Easy
view release on metacpan or search on metacpan
lib/DBI/Easy/Record.pm view on Meta::CPAN
package DBI::Easy::Record;
# $Id: Record.pm,v 1.6 2009/07/20 18:00:08 apla Exp $
use Class::Easy;
use DBI::Easy;
use base qw(DBI::Easy);
our $wrapper = 1;
sub _init {
my $class = shift;
my $params;
if (@_ == 1 && ref $_[0] && ref $_[0] eq 'HASH') {
# old school
$params->{field_values} = $_[0];
} else {
$params = {@_};
}
return $params;
}
sub save {
my $self = shift;
my $result;
return unless $self->field_values;
my $pk_column = $self->_pk_column_;
if ($pk_column and $pk_column ne '' and defined $self->column_values and $self->column_values->{$pk_column}) {
# try to update
$result = $self->update_by_pk;
} else {
$result = $self->create;
}
return $result;
}
sub fetched {
return 1 if defined shift->{field_values};
}
# update by pk
sub update_by_pk {
my $self = shift;
my %params = @_;
# there we make decision:
# a) programmmer can provide update values
# we simply reject field values
# b) field_values already contains update values
my $column_values;
if (exists $params{set} and ref $params{set} and ref $params{set} eq 'HASH') {
$column_values = $self->fields_to_columns ($params{set});
} else {
$column_values = $self->fields_to_columns;
}
my ($sql, $bind) = $self->sql_update_by_pk (%params);
return unless defined $sql;
debug "sql: $sql => " . (defined $bind and scalar @$bind ? join ', ', @$bind : '[]');
my $result = $self->no_fetch ($sql, $bind);
foreach my $k (keys %$column_values) {
$self->column_values->{$k} = $column_values->{$k};
}
delete $self->{field_values};
return $result
}
# delete by pk
sub delete_by_pk {
my $self = shift;
my ($sql, $bind) = $self->sql_delete_by_pk (@_);
debug "sql: $sql => " . (defined $bind and scalar @$bind ? join ', ', @$bind : '[]');
return $self->no_fetch ($sql, $bind);
}
sub create {
my $self = shift;
my $t = timer ('fields to columns translation');
my $column_values = $self->fields_to_columns;
$t->lap ('sql generation');
my ($sql, $bind) = $self->sql_insert ($column_values);
debug "sql: $sql => " . (defined $bind and scalar @$bind ? join ', ', @$bind : '[]');
$t->lap ('insert');
( run in 0.840 second using v1.01-cache-2.11-cpan-99c4e6809bf )