| DBIx-SearchBuilder documentation | Contained in the DBIx-SearchBuilder distribution. |
DBIx::SearchBuilder::Handle::mysql - A mysql specific Handle object
This module provides a subclass of DBIx::SearchBuilder::Handle that compensates for some of the idiosyncrasies of MySQL.
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 the mysql version, trimming off any -foo identifier
Returns undef, since mysql's searches are not case sensitive by default
Jesse Vincent, jesse@fsck.com
DBIx::SearchBuilder, DBIx::SearchBuilder::Handle
| DBIx-SearchBuilder documentation | Contained in the DBIx-SearchBuilder distribution. |
# $Header: /home/jesse/DBIx-SearchBuilder/history/SearchBuilder/Handle/mysql.pm,v 1.8 2001/10/12 05:27:05 jesse Exp $ package DBIx::SearchBuilder::Handle::mysql; use strict; use warnings; use base qw(DBIx::SearchBuilder::Handle);
sub Insert { my $self = shift; my $sth = $self->SUPER::Insert(@_); if (!$sth) { return ($sth); } $self->{'id'}=$self->dbh->{'mysql_insertid'}; # Yay. we get to work around mysql_insertid being null some of the time :/ unless ($self->{'id'}) { $self->{'id'} = $self->FetchResult('SELECT LAST_INSERT_ID()'); } warn "$self no row id returned on row creation" unless ($self->{'id'}); return( $self->{'id'}); #Add Succeded. return the id }
sub DatabaseVersion { my $self = shift; my $v = $self->SUPER::DatabaseVersion(); $v =~ s/\-.*$//; return ($v); }
sub CaseSensitive { my $self = shift; return(undef); } sub DistinctQuery { my $self = shift; my $statementref = shift; my $sb = shift; return $self->SUPER::DistinctQuery( $statementref, $sb, @_ ) if $sb->_OrderClause !~ /(?<!main)\./; if ( substr($self->DatabaseVersion, 0, 1) == 4 ) { local $sb->{'group_by'} = [{FIELD => 'id'}]; my ($idx, @tmp, @specials) = (0, ()); foreach ( @{$sb->{'order_by'}} ) { if ( !exists $_->{'ALIAS'} || ($_->{'ALIAS'}||'') eq "main" ) { push @tmp, $_; next; } push @specials, ((($_->{'ORDER'}||'') =~ /^des/i)?'MAX':'MIN') ."(". $_->{'ALIAS'} .".". $_->{'FIELD'} .")" ." __special_sort_$idx"; push @tmp, { ALIAS => '', FIELD => "__special_sort_$idx", ORDER => $_->{'ORDER'} }; $idx++; } local $sb->{'order_by'} = \@tmp; $$statementref = "SELECT ". join( ", ", 'main.*', @specials ) ." FROM $$statementref"; $$statementref .= $sb->_GroupClause; $$statementref .= $sb->_OrderClause; } else { local $sb->{'group_by'} = [{FIELD => 'id'}]; local $sb->{'order_by'} = [ map { ($_->{'ALIAS'}||'') ne "main" ? { %{$_}, FIELD => ((($_->{'ORDER'}||'') =~ /^des/i)?'MAX':'MIN') ."(".$_->{FIELD}.")" } : $_ } @{$sb->{'order_by'}} ]; $$statementref = "SELECT main.* FROM $$statementref"; $$statementref .= $sb->_GroupClause; $$statementref .= $sb->_OrderClause; } } sub Fields { my $self = shift; my $table = shift; my $cache = \%DBIx::SearchBuilder::Handle::FIELDS_IN_TABLE; unless ( $cache->{ lc $table } ) { my $sth = $self->dbh->column_info( undef, undef, $table, '%' ) or return (); my $info = $sth->fetchall_arrayref({}); foreach my $e ( sort {$a->{'ORDINAL_POSITION'} <=> $b->{'ORDINAL_POSITION'}} @$info ) { push @{ $cache->{ lc $e->{'TABLE_NAME'} } ||= [] }, lc $e->{'COLUMN_NAME'}; } } return @{ $cache->{ lc $table } || [] }; } 1; __END__