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 )