# $Header: $
@ISA = qw(DBIx::SearchBuilder::Handle);
use vars qw($VERSION @ISA $DBIHandle $DEBUG);
use strict;
=head1 NAME
DBIx::SearchBuilder::Handle::Informix -- an Informix specific Handle object
=head1 SYNOPSIS
=head1 DESCRIPTION
=head1 AUTHOR
Oliver Tappe, oliver@akso.de
=head1 SEE ALSO
perl(1), DBIx::SearchBuilder
=cut
# {{{ sub Insert
=head2 Insert
Takes a table name as the first argument and assumes that the rest of the arguments
are an array of key-value pairs to be inserted.
If the insert succeeds, returns the id of the insert, otherwise, returns
a Class::ReturnValue object with the error reploaded.
=cut
sub Insert {
my $self = shift;
my $sth = $self->SUPER::Insert(@_);
if (!$sth) {
print "no sth! (".$self->dbh->{ix_sqlerrd}[1].")\n";
return ($sth);
}
$self->{id}=$self->dbh->{ix_sqlerrd}[1];
warn "$self no row id returned on row creation" unless ($self->{'id'});
return( $self->{'id'}); #Add Succeded. return the id
}
# }}}
=head2 CaseSensitive
Returns 1, since Informix's searches are case sensitive by default
=cut
sub CaseSensitive {
my $self = shift;
return(1);
}
# }}}
sub BuildDSN {
my $self = shift;
my %args = ( Driver => undef,
Database => undef,
Host => undef,
Port => undef,
SID => undef,
RequireSSL => undef,
@_);
my $dsn = "dbi:$args{'Driver'}:";
$dsn .= "$args{'Database'}" if (defined $args{'Database'} && $args{'Database'});
$self->{'dsn'}= $dsn;
}
# {{{ ApplyLimits
=head2 ApplyLimits STATEMENTREF ROWS_PER_PAGE FIRST_ROW
takes an SQL SELECT statement and massages it to return ROWS_PER_PAGE starting with FIRST_ROW;
=cut
sub ApplyLimits {
my $self = shift;
my $statementref = shift;
my $per_page = shift;
my $first = shift;
# XXX TODO THIS only works on the FIRST page of results. that's a bug
if ($per_page) {
$$statementref =~ s[^\s*SELECT][SELECT FIRST $per_page]i;
}
}
# }}}
sub Disconnect {
my $self = shift;
if ($self->dbh) {
my $status = $self->dbh->disconnect();
$self->dbh( undef);
return $status;
} else {
return;
}
}
# {{{ DistinctQuery
=head2 DistinctQuery STATEMENTREF
takes an incomplete SQL SELECT statement and massages it to return a DISTINCT result set.
=cut
sub DistinctQuery {
my $self = shift;
my $statementref = shift;
my $table = shift;
# Wrapper select query in a subselect as Informix doesn't allow
# DISTINCT against CLOB/BLOB column types.
$$statementref = "SELECT * FROM $table main WHERE id IN ( SELECT DISTINCT main.id FROM $$statementref )";
}
# }}}