DBIx-Cursor
view release on metacpan or search on metacpan
# ----------------------------------------------------------------------
sub where
{
my $self = shift;
$self->reset;
$self->{where} = shift;
$self->{values} = \@_;
return $self;
}
# ----------------------------------------------------------------------
sub values
{
my $self = shift;
$self->reset;
$self->{values} = \@_;
return $self;
}
# ----------------------------------------------------------------------
sub fetch
{
my $self = shift;
unless ($self->{sth})
{
my $table = $self->{table};
my $dbh = $self->{dbh};
my $sql = "select * from $table";
my $where = $self->{where};
if ($where)
{
$sql .= ' where' if ($where !~ /^\s*(where)|(order\s+by)\s/i);
$sql .= " $where";
}
my @values = @{$self->{values}} if $self->{values};
$self->{sth} = $dbh->prepare($sql);
$self->{sth}->execute(@values);
}
if ($self->{data} = $self->{sth}->fetchrow_hashref)
{
%{$self->{olddata}} = %{$self->{data}};
return $self->get;
}
else
{
$self->reset;
return undef;
}
}
# ----------------------------------------------------------------------
sub update
{
my $self = shift;
my $data = $self->{data};
my $odata = $self->{olddata};
my $table = $self->{table};
my $dbh = $self->{dbh};
my $pk = $self->{pk};
# the columns to update are either given as parameter or
# every not primary-key-column
my @updatecols = @_ ? @_
: grep { # seach columns
my $col = $_;
# return every column not in primary-key
! grep { $col eq $_ } @$pk
} @{$self->{NAME}};
# check if update is needed
my @cols;
my @values;
foreach my $col (@updatecols)
{
my $d = $data->{$col};
my $o = $odata->{$col};
next unless defined $d && !defined $o
|| !defined $d && defined $o
|| defined $d && defined $o && $o ne $d;
push @cols, $col;
push @values, $d;
}
return unless @cols;
my $sql = "update $table set "
. join(', ', map { "$_ = ?" } @cols )
. ' where '
. join(' and ', map { "$_ = ?" } @$pk);
my @pkvalues = map { $odata->{$_} || $data->{$_} } @$pk;
my $sth = $dbh->prepare($sql);
my $ret = $sth->execute(@values, @pkvalues);
%{$self->{olddata}} = %{$self->{data}};
return $ret;
}
# ----------------------------------------------------------------------
sub insert
{
my $self = shift;
my $table = $self->{table};
my $dbh = $self->{dbh};
my $sth = $self->{sth_insert};
unless ($sth)
{
my $sql = "insert into $table values ("
. join(', ', ('?') x @{$self->{NAME}})
. ')';
( run in 1.363 second using v1.01-cache-2.11-cpan-995e09ba956 )