| DBIx-SearchBuilder documentation | Contained in the DBIx-SearchBuilder distribution. |
DBIx::SearchBuilder::Handle::Informix - An Informix specific Handle object
This module provides a subclass of DBIx::SearchBuilder::Handle that compensates for some of the idiosyncrasies of Informix.
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 reported.
Returns 1, since Informix's searches are case sensitive by default
Builder for Informix DSNs.
takes an SQL SELECT statement and massages it to return ROWS_PER_PAGE starting with FIRST_ROW;
takes an incomplete SQL SELECT statement and massages it to return a DISTINCT result set.
Oliver Tappe, oliver@akso.de
perl(1), DBIx::SearchBuilder
| DBIx-SearchBuilder documentation | Contained in the DBIx-SearchBuilder distribution. |
# $Header: $ package DBIx::SearchBuilder::Handle::Informix; use strict; use warnings; use base qw(DBIx::SearchBuilder::Handle);
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 }
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; }
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; } }
sub DistinctQuery { my $self = shift; my $statementref = shift; my $sb = shift; my $table = $sb->Table; if ($sb->_OrderClause =~ /(?<!main)\./) { # Don't know how to do ORDER BY when the DISTINCT is in a subquery warn "Query will contain duplicate rows; don't how how to ORDER BY across DISTINCT"; $$statementref = "SELECT main.* FROM $$statementref"; } else { # 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 )"; } $$statementref .= $sb->_GroupClause; $$statementref .= $sb->_OrderClause; } 1; __END__