#------------------------------------------------------------------------------
# DBO::Visitor::Select
#
# DESCRIPTION
#
# AUTHOR
# Gareth Rees
#
# COPYRIGHT
# Copyright (c) 1999 Canon Research Centre Europe Ltd.
#
# $Id: Select.pm,v 1.3 1999/06/29 17:09:31 garethr Exp $
#------------------------------------------------------------------------------
use strict;
package DBO::Visitor::Select;
use base qw(DBO::Visitor);
use Class::Multimethods;
multimethod visit_table =>
qw(DBO::Visitor::Select DBO::Table DBO::Handle::DBI) =>
sub {
my ($vis, $table, $dbh) = @_;
my @sql = ("SELECT * FROM", $table->{name}, "WHERE");
foreach my $col (@{$table->{columns}}) {
$vis->{sql} = [];
visit_column($vis, $col, $dbh);
push @sql, @{$vis->{sql}}, "AND" if @{$vis->{sql}};
}
pop @sql;
my $sql = join ' ', @sql;
my $sth = $dbh->prepare($sql) or die DBO::Exception
(PREPARE => "Failed to prepare SQL statement %s: %s.", $sql, $dbh->errstr);
$sth->execute or die DBO::Exception
(EXECUTE => "Failed to execute insert: %s.", $dbh->errstr);
# Fetch all records as hash references
my @records;
while (my $record = $sth->fetchrow_hashref) {
# DBI doesn't promise not to reuse the hash, so take a copy.
push @records, { %$record };
}
\@records;
};
multimethod visit_column =>
qw(DBO::Visitor::Select DBO::Column::String DBO::Handle::DBI) =>
sub {
my ($vis, $col, $dbh) = @_;
my $value = $vis->{record}{$col->{name}};
push @{$vis->{sql}}, $col->{name},'=',$dbh->quote($value) if defined $value;
};
multimethod visit_column =>
qw(DBO::Visitor::Select DBO::Column::Number DBO::Handle::DBI) =>
sub {
my ($vis, $col, $dbh) = @_;
my $value = $vis->{record}{$col->{name}};
push @{$vis->{sql}}, $col->{name}, '=', $value if defined $value;
};
1;