DBomb
view release on metacpan or search on metacpan
DBomb/GluedUpdate.pm view on Meta::CPAN
=cut
use strict;
use warnings;
our $VERSION = '$Revision: 1.11 $';
use DBomb;
use DBomb::Conf;
use Carp::Assert;
use Class::MethodMaker
'new_with_init' => 'new',
'get_set' => [ qw(columns_list), # [ column_value_object, ... ]
qw(peer), # a DBomb::Base object
qw(dbh),
qw(sth),
qw(where_obj), # expr
],
;
## init($peer)
## init($peer,$dbh,[$columns_list])
sub init
{
my $self = shift;
$self->columns_list([]);
$self->where_obj(new DBomb::Query::Expr());
## First argument might be a dbh or peer object
for(@_){
if (UNIVERSAL::isa($_,'DBI::db')){
$self->dbh($_);
}
elsif (UNIVERSAL::isa($_,'DBomb::Base')){
$self->peer($_);
}
elsif (UNIVERSAL::isa($_,'ARRAY')){
for (@$_){
assert(UNIVERSAL::isa(ref($_),'DBomb::Value::Column'), 'GluedUpdate requires column value objs');
}
$self->columns_list($_);
}
}
assert(defined($self->peer), 'GluedUpdate requires a peer');
if (@{$self->columns_list} == 0){
## Default is all updatable columns.
$self->columns_list([
grep { $_->has_value
&& $_->is_modified
&& (not $_->column_info->is_in_primary_key)
} values %{$self->peer->_dbo_values}]);
}
}
## Same as prepare->execute
## update()
## update(@bind_values)
## update($dbh,@bind_values)
sub update
{
my $self = shift;
my @bv;
for (@_){
if (UNIVERSAL::isa($_,'DBI::db')){ $self->dbh($_) }
else { push @bv, $_ }
}
assert(defined($self->dbh), 'update requires a dbh');
if (not $self->sth){ $self->prepare }
return $self->execute(@bv);
}
## execute()
## execute(@bind_values)
## execute($dbh,@bind_values)
sub execute
{
my $self = shift;
my @bv;
for (@_){
if (UNIVERSAL::isa($_,'DBI::db')){ $self->dbh($_) }
else { push @bv, $_ }
}
assert(defined($self->dbh), 'update requires a dbh');
if (not $self->sth){ $self->prepare }
return $self->sth->execute((@{$self->bind_values},@bv));
}
## prepare()
## prepare($dbh)
sub prepare
{
my $self = shift;
for (@_){
$self->dbh($_) if UNIVERSAL::isa($_, 'DBI::db');
}
assert(defined($self->dbh), 'prepare requires a dbh');
if ($DBomb::Conf::prepare_cached){
$self->sth($self->dbh->prepare_cached(scalar $self->sql));
}
else{
$self->sth($self->dbh->prepare(scalar $self->sql));
}
return $self;
}
## where(EXPR)
sub where
{
my $self = shift;
$self->where_obj->append( new DBomb::Query::Expr(@_));
return $self;
}
( run in 0.671 second using v1.01-cache-2.11-cpan-98e64b0badf )