/usr/local/CPAN/DBR/DBR/Query/Update.pm
# The contents of this file are Copyright (c) 2010 Daniel Norman
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
###########################################
package DBR::Query::Update;
use strict;
use base 'DBR::Query';
use Carp;
sub _params { qw (sets tables where limit quiet_error) }
sub _reqparams { qw (sets tables) }
sub _validate_self{ 1 } # If I exist, I'm valid
sub sets{
my $self = shift;
exists( $_[0] ) or return wantarray?( @$self->{sets} ) : $self->{sets} || undef;
my @sets = $self->_arrayify(@_);
scalar(@sets) || croak('must provide at least one set');
for (@sets){
ref($_) eq 'DBR::Query::Part::Set' || croak('arguments must be Sets');
}
$self->{sets} = \@sets;
return 1;
}
# do not run this until the last possible moment, and then only once
sub sql{
my $self = shift;
my $conn = $self->instance->connect('conn') or return $self->_error('failed to connect');
my $sql;
my $tables = join(',', map { $_->sql( $conn ) } @{$self->{tables}} );
my $sets = join(',', map { $_->sql( $conn ) } @{$self->{sets}} );
$sql = "UPDATE $tables SET $sets";
$sql .= ' WHERE ' . $self->{where}->sql($conn) if $self->{where};
$sql .= ' LIMIT ' . $self->{limit} if $self->{limit};
$self->_logDebug2( $sql );
return $sql;
}
sub run{
my $self = shift;
my $conn = $self->instance->connect('conn') or return $self->_error('failed to connect');
$conn->quiet_next_error if $self->quiet_error;
return $conn->do( $self->sql ) || 0;
}
1;